* arm.cc (Target_arm::Target_arm): Remove initialisation of
[external/binutils.git] / gold / arm.cc
1 // arm.cc -- arm target support for gold.
2
3 // Copyright 2009, 2010, 2011 Free Software Foundation, Inc.
4 // Written by Doug Kwan <dougkwan@google.com> based on the i386 code
5 // by Ian Lance Taylor <iant@google.com>.
6 // This file also contains borrowed and adapted code from
7 // bfd/elf32-arm.c.
8
9 // This file is part of gold.
10
11 // This program is free software; you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation; either version 3 of the License, or
14 // (at your option) any later version.
15
16 // This program is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 // GNU General Public License for more details.
20
21 // You should have received a copy of the GNU General Public License
22 // along with this program; if not, write to the Free Software
23 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
24 // MA 02110-1301, USA.
25
26 #include "gold.h"
27
28 #include <cstring>
29 #include <limits>
30 #include <cstdio>
31 #include <string>
32 #include <algorithm>
33 #include <map>
34 #include <utility>
35 #include <set>
36
37 #include "elfcpp.h"
38 #include "parameters.h"
39 #include "reloc.h"
40 #include "arm.h"
41 #include "object.h"
42 #include "symtab.h"
43 #include "layout.h"
44 #include "output.h"
45 #include "copy-relocs.h"
46 #include "target.h"
47 #include "target-reloc.h"
48 #include "target-select.h"
49 #include "tls.h"
50 #include "defstd.h"
51 #include "gc.h"
52 #include "attributes.h"
53 #include "arm-reloc-property.h"
54
55 namespace
56 {
57
58 using namespace gold;
59
60 template<bool big_endian>
61 class Output_data_plt_arm;
62
63 template<bool big_endian>
64 class Stub_table;
65
66 template<bool big_endian>
67 class Arm_input_section;
68
69 class Arm_exidx_cantunwind;
70
71 class Arm_exidx_merged_section;
72
73 class Arm_exidx_fixup;
74
75 template<bool big_endian>
76 class Arm_output_section;
77
78 class Arm_exidx_input_section;
79
80 template<bool big_endian>
81 class Arm_relobj;
82
83 template<bool big_endian>
84 class Arm_relocate_functions;
85
86 template<bool big_endian>
87 class Arm_output_data_got;
88
89 template<bool big_endian>
90 class Target_arm;
91
92 // For convenience.
93 typedef elfcpp::Elf_types<32>::Elf_Addr Arm_address;
94
95 // Maximum branch offsets for ARM, THUMB and THUMB2.
96 const int32_t ARM_MAX_FWD_BRANCH_OFFSET = ((((1 << 23) - 1) << 2) + 8);
97 const int32_t ARM_MAX_BWD_BRANCH_OFFSET = ((-((1 << 23) << 2)) + 8);
98 const int32_t THM_MAX_FWD_BRANCH_OFFSET = ((1 << 22) -2 + 4);
99 const int32_t THM_MAX_BWD_BRANCH_OFFSET = (-(1 << 22) + 4);
100 const int32_t THM2_MAX_FWD_BRANCH_OFFSET = (((1 << 24) - 2) + 4);
101 const int32_t THM2_MAX_BWD_BRANCH_OFFSET = (-(1 << 24) + 4);
102
103 // Thread Control Block size.
104 const size_t ARM_TCB_SIZE = 8;
105
106 // The arm target class.
107 //
108 // This is a very simple port of gold for ARM-EABI.  It is intended for
109 // supporting Android only for the time being.
110 // 
111 // TODOs:
112 // - Implement all static relocation types documented in arm-reloc.def.
113 // - Make PLTs more flexible for different architecture features like
114 //   Thumb-2 and BE8.
115 // There are probably a lot more.
116
117 // Ideally we would like to avoid using global variables but this is used
118 // very in many places and sometimes in loops.  If we use a function
119 // returning a static instance of Arm_reloc_property_table, it will be very
120 // slow in an threaded environment since the static instance needs to be
121 // locked.  The pointer is below initialized in the
122 // Target::do_select_as_default_target() hook so that we do not spend time
123 // building the table if we are not linking ARM objects.
124 //
125 // An alternative is to to process the information in arm-reloc.def in
126 // compilation time and generate a representation of it in PODs only.  That
127 // way we can avoid initialization when the linker starts.
128
129 Arm_reloc_property_table* arm_reloc_property_table = NULL;
130
131 // Instruction template class.  This class is similar to the insn_sequence
132 // struct in bfd/elf32-arm.c.
133
134 class Insn_template
135 {
136  public:
137   // Types of instruction templates.
138   enum Type
139     {
140       THUMB16_TYPE = 1,
141       // THUMB16_SPECIAL_TYPE is used by sub-classes of Stub for instruction 
142       // templates with class-specific semantics.  Currently this is used
143       // only by the Cortex_a8_stub class for handling condition codes in
144       // conditional branches.
145       THUMB16_SPECIAL_TYPE,
146       THUMB32_TYPE,
147       ARM_TYPE,
148       DATA_TYPE
149     };
150
151   // Factory methods to create instruction templates in different formats.
152
153   static const Insn_template
154   thumb16_insn(uint32_t data)
155   { return Insn_template(data, THUMB16_TYPE, elfcpp::R_ARM_NONE, 0); } 
156
157   // A Thumb conditional branch, in which the proper condition is inserted
158   // when we build the stub.
159   static const Insn_template
160   thumb16_bcond_insn(uint32_t data)
161   { return Insn_template(data, THUMB16_SPECIAL_TYPE, elfcpp::R_ARM_NONE, 1); } 
162
163   static const Insn_template
164   thumb32_insn(uint32_t data)
165   { return Insn_template(data, THUMB32_TYPE, elfcpp::R_ARM_NONE, 0); } 
166
167   static const Insn_template
168   thumb32_b_insn(uint32_t data, int reloc_addend)
169   {
170     return Insn_template(data, THUMB32_TYPE, elfcpp::R_ARM_THM_JUMP24,
171                          reloc_addend);
172   } 
173
174   static const Insn_template
175   arm_insn(uint32_t data)
176   { return Insn_template(data, ARM_TYPE, elfcpp::R_ARM_NONE, 0); }
177
178   static const Insn_template
179   arm_rel_insn(unsigned data, int reloc_addend)
180   { return Insn_template(data, ARM_TYPE, elfcpp::R_ARM_JUMP24, reloc_addend); }
181
182   static const Insn_template
183   data_word(unsigned data, unsigned int r_type, int reloc_addend)
184   { return Insn_template(data, DATA_TYPE, r_type, reloc_addend); } 
185
186   // Accessors.  This class is used for read-only objects so no modifiers
187   // are provided.
188
189   uint32_t
190   data() const
191   { return this->data_; }
192
193   // Return the instruction sequence type of this.
194   Type
195   type() const
196   { return this->type_; }
197
198   // Return the ARM relocation type of this.
199   unsigned int
200   r_type() const
201   { return this->r_type_; }
202
203   int32_t
204   reloc_addend() const
205   { return this->reloc_addend_; }
206
207   // Return size of instruction template in bytes.
208   size_t
209   size() const;
210
211   // Return byte-alignment of instruction template.
212   unsigned
213   alignment() const;
214
215  private:
216   // We make the constructor private to ensure that only the factory
217   // methods are used.
218   inline
219   Insn_template(unsigned data, Type type, unsigned int r_type, int reloc_addend)
220     : data_(data), type_(type), r_type_(r_type), reloc_addend_(reloc_addend)
221   { }
222
223   // Instruction specific data.  This is used to store information like
224   // some of the instruction bits.
225   uint32_t data_;
226   // Instruction template type.
227   Type type_;
228   // Relocation type if there is a relocation or R_ARM_NONE otherwise.
229   unsigned int r_type_;
230   // Relocation addend.
231   int32_t reloc_addend_;
232 };
233
234 // Macro for generating code to stub types. One entry per long/short
235 // branch stub
236
237 #define DEF_STUBS \
238   DEF_STUB(long_branch_any_any) \
239   DEF_STUB(long_branch_v4t_arm_thumb) \
240   DEF_STUB(long_branch_thumb_only) \
241   DEF_STUB(long_branch_v4t_thumb_thumb) \
242   DEF_STUB(long_branch_v4t_thumb_arm) \
243   DEF_STUB(short_branch_v4t_thumb_arm) \
244   DEF_STUB(long_branch_any_arm_pic) \
245   DEF_STUB(long_branch_any_thumb_pic) \
246   DEF_STUB(long_branch_v4t_thumb_thumb_pic) \
247   DEF_STUB(long_branch_v4t_arm_thumb_pic) \
248   DEF_STUB(long_branch_v4t_thumb_arm_pic) \
249   DEF_STUB(long_branch_thumb_only_pic) \
250   DEF_STUB(a8_veneer_b_cond) \
251   DEF_STUB(a8_veneer_b) \
252   DEF_STUB(a8_veneer_bl) \
253   DEF_STUB(a8_veneer_blx) \
254   DEF_STUB(v4_veneer_bx)
255
256 // Stub types.
257
258 #define DEF_STUB(x) arm_stub_##x,
259 typedef enum
260   {
261     arm_stub_none,
262     DEF_STUBS
263
264     // First reloc stub type.
265     arm_stub_reloc_first = arm_stub_long_branch_any_any,
266     // Last  reloc stub type.
267     arm_stub_reloc_last = arm_stub_long_branch_thumb_only_pic,
268
269     // First Cortex-A8 stub type.
270     arm_stub_cortex_a8_first = arm_stub_a8_veneer_b_cond,
271     // Last Cortex-A8 stub type.
272     arm_stub_cortex_a8_last = arm_stub_a8_veneer_blx,
273     
274     // Last stub type.
275     arm_stub_type_last = arm_stub_v4_veneer_bx
276   } Stub_type;
277 #undef DEF_STUB
278
279 // Stub template class.  Templates are meant to be read-only objects.
280 // A stub template for a stub type contains all read-only attributes
281 // common to all stubs of the same type.
282
283 class Stub_template
284 {
285  public:
286   Stub_template(Stub_type, const Insn_template*, size_t);
287
288   ~Stub_template()
289   { }
290
291   // Return stub type.
292   Stub_type
293   type() const
294   { return this->type_; }
295
296   // Return an array of instruction templates.
297   const Insn_template*
298   insns() const
299   { return this->insns_; }
300
301   // Return size of template in number of instructions.
302   size_t
303   insn_count() const
304   { return this->insn_count_; }
305
306   // Return size of template in bytes.
307   size_t
308   size() const
309   { return this->size_; }
310
311   // Return alignment of the stub template.
312   unsigned
313   alignment() const
314   { return this->alignment_; }
315   
316   // Return whether entry point is in thumb mode.
317   bool
318   entry_in_thumb_mode() const
319   { return this->entry_in_thumb_mode_; }
320
321   // Return number of relocations in this template.
322   size_t
323   reloc_count() const
324   { return this->relocs_.size(); }
325
326   // Return index of the I-th instruction with relocation.
327   size_t
328   reloc_insn_index(size_t i) const
329   {
330     gold_assert(i < this->relocs_.size());
331     return this->relocs_[i].first;
332   }
333
334   // Return the offset of the I-th instruction with relocation from the
335   // beginning of the stub.
336   section_size_type
337   reloc_offset(size_t i) const
338   {
339     gold_assert(i < this->relocs_.size());
340     return this->relocs_[i].second;
341   }
342
343  private:
344   // This contains information about an instruction template with a relocation
345   // and its offset from start of stub.
346   typedef std::pair<size_t, section_size_type> Reloc;
347
348   // A Stub_template may not be copied.  We want to share templates as much
349   // as possible.
350   Stub_template(const Stub_template&);
351   Stub_template& operator=(const Stub_template&);
352   
353   // Stub type.
354   Stub_type type_;
355   // Points to an array of Insn_templates.
356   const Insn_template* insns_;
357   // Number of Insn_templates in insns_[].
358   size_t insn_count_;
359   // Size of templated instructions in bytes.
360   size_t size_;
361   // Alignment of templated instructions.
362   unsigned alignment_;
363   // Flag to indicate if entry is in thumb mode.
364   bool entry_in_thumb_mode_;
365   // A table of reloc instruction indices and offsets.  We can find these by
366   // looking at the instruction templates but we pre-compute and then stash
367   // them here for speed. 
368   std::vector<Reloc> relocs_;
369 };
370
371 //
372 // A class for code stubs.  This is a base class for different type of
373 // stubs used in the ARM target.
374 //
375
376 class Stub
377 {
378  private:
379   static const section_offset_type invalid_offset =
380     static_cast<section_offset_type>(-1);
381
382  public:
383   Stub(const Stub_template* stub_template)
384     : stub_template_(stub_template), offset_(invalid_offset)
385   { }
386
387   virtual
388    ~Stub()
389   { }
390
391   // Return the stub template.
392   const Stub_template*
393   stub_template() const
394   { return this->stub_template_; }
395
396   // Return offset of code stub from beginning of its containing stub table.
397   section_offset_type
398   offset() const
399   {
400     gold_assert(this->offset_ != invalid_offset);
401     return this->offset_;
402   }
403
404   // Set offset of code stub from beginning of its containing stub table.
405   void
406   set_offset(section_offset_type offset)
407   { this->offset_ = offset; }
408   
409   // Return the relocation target address of the i-th relocation in the
410   // stub.  This must be defined in a child class.
411   Arm_address
412   reloc_target(size_t i)
413   { return this->do_reloc_target(i); }
414
415   // Write a stub at output VIEW.  BIG_ENDIAN select how a stub is written.
416   void
417   write(unsigned char* view, section_size_type view_size, bool big_endian)
418   { this->do_write(view, view_size, big_endian); }
419
420   // Return the instruction for THUMB16_SPECIAL_TYPE instruction template
421   // for the i-th instruction.
422   uint16_t
423   thumb16_special(size_t i)
424   { return this->do_thumb16_special(i); }
425
426  protected:
427   // This must be defined in the child class.
428   virtual Arm_address
429   do_reloc_target(size_t) = 0;
430
431   // This may be overridden in the child class.
432   virtual void
433   do_write(unsigned char* view, section_size_type view_size, bool big_endian)
434   {
435     if (big_endian)
436       this->do_fixed_endian_write<true>(view, view_size);
437     else
438       this->do_fixed_endian_write<false>(view, view_size);
439   }
440   
441   // This must be overridden if a child class uses the THUMB16_SPECIAL_TYPE
442   // instruction template.
443   virtual uint16_t
444   do_thumb16_special(size_t)
445   { gold_unreachable(); }
446
447  private:
448   // A template to implement do_write.
449   template<bool big_endian>
450   void inline
451   do_fixed_endian_write(unsigned char*, section_size_type);
452
453   // Its template.
454   const Stub_template* stub_template_;
455   // Offset within the section of containing this stub.
456   section_offset_type offset_;
457 };
458
459 // Reloc stub class.  These are stubs we use to fix up relocation because
460 // of limited branch ranges.
461
462 class Reloc_stub : public Stub
463 {
464  public:
465   static const unsigned int invalid_index = static_cast<unsigned int>(-1);
466   // We assume we never jump to this address.
467   static const Arm_address invalid_address = static_cast<Arm_address>(-1);
468
469   // Return destination address.
470   Arm_address
471   destination_address() const
472   {
473     gold_assert(this->destination_address_ != this->invalid_address);
474     return this->destination_address_;
475   }
476
477   // Set destination address.
478   void
479   set_destination_address(Arm_address address)
480   {
481     gold_assert(address != this->invalid_address);
482     this->destination_address_ = address;
483   }
484
485   // Reset destination address.
486   void
487   reset_destination_address()
488   { this->destination_address_ = this->invalid_address; }
489
490   // Determine stub type for a branch of a relocation of R_TYPE going
491   // from BRANCH_ADDRESS to BRANCH_TARGET.  If TARGET_IS_THUMB is set,
492   // the branch target is a thumb instruction.  TARGET is used for look
493   // up ARM-specific linker settings.
494   static Stub_type
495   stub_type_for_reloc(unsigned int r_type, Arm_address branch_address,
496                       Arm_address branch_target, bool target_is_thumb);
497
498   // Reloc_stub key.  A key is logically a triplet of a stub type, a symbol
499   // and an addend.  Since we treat global and local symbol differently, we
500   // use a Symbol object for a global symbol and a object-index pair for
501   // a local symbol.
502   class Key
503   {
504    public:
505     // If SYMBOL is not null, this is a global symbol, we ignore RELOBJ and
506     // R_SYM.  Otherwise, this is a local symbol and RELOBJ must non-NULL
507     // and R_SYM must not be invalid_index.
508     Key(Stub_type stub_type, const Symbol* symbol, const Relobj* relobj,
509         unsigned int r_sym, int32_t addend)
510       : stub_type_(stub_type), addend_(addend)
511     {
512       if (symbol != NULL)
513         {
514           this->r_sym_ = Reloc_stub::invalid_index;
515           this->u_.symbol = symbol;
516         }
517       else
518         {
519           gold_assert(relobj != NULL && r_sym != invalid_index);
520           this->r_sym_ = r_sym;
521           this->u_.relobj = relobj;
522         }
523     }
524
525     ~Key()
526     { }
527
528     // Accessors: Keys are meant to be read-only object so no modifiers are
529     // provided.
530
531     // Return stub type.
532     Stub_type
533     stub_type() const
534     { return this->stub_type_; }
535
536     // Return the local symbol index or invalid_index.
537     unsigned int
538     r_sym() const
539     { return this->r_sym_; }
540
541     // Return the symbol if there is one.
542     const Symbol*
543     symbol() const
544     { return this->r_sym_ == invalid_index ? this->u_.symbol : NULL; }
545
546     // Return the relobj if there is one.
547     const Relobj*
548     relobj() const
549     { return this->r_sym_ != invalid_index ? this->u_.relobj : NULL; }
550
551     // Whether this equals to another key k.
552     bool
553     eq(const Key& k) const 
554     {
555       return ((this->stub_type_ == k.stub_type_)
556               && (this->r_sym_ == k.r_sym_)
557               && ((this->r_sym_ != Reloc_stub::invalid_index)
558                   ? (this->u_.relobj == k.u_.relobj)
559                   : (this->u_.symbol == k.u_.symbol))
560               && (this->addend_ == k.addend_));
561     }
562
563     // Return a hash value.
564     size_t
565     hash_value() const
566     {
567       return (this->stub_type_
568               ^ this->r_sym_
569               ^ gold::string_hash<char>(
570                     (this->r_sym_ != Reloc_stub::invalid_index)
571                     ? this->u_.relobj->name().c_str()
572                     : this->u_.symbol->name())
573               ^ this->addend_);
574     }
575
576     // Functors for STL associative containers.
577     struct hash
578     {
579       size_t
580       operator()(const Key& k) const
581       { return k.hash_value(); }
582     };
583
584     struct equal_to
585     {
586       bool
587       operator()(const Key& k1, const Key& k2) const
588       { return k1.eq(k2); }
589     };
590
591     // Name of key.  This is mainly for debugging.
592     std::string
593     name() const;
594
595    private:
596     // Stub type.
597     Stub_type stub_type_;
598     // If this is a local symbol, this is the index in the defining object.
599     // Otherwise, it is invalid_index for a global symbol.
600     unsigned int r_sym_;
601     // If r_sym_ is an invalid index, this points to a global symbol.
602     // Otherwise, it points to a relobj.  We used the unsized and target
603     // independent Symbol and Relobj classes instead of Sized_symbol<32> and  
604     // Arm_relobj, in order to avoid making the stub class a template
605     // as most of the stub machinery is endianness-neutral.  However, it
606     // may require a bit of casting done by users of this class.
607     union
608     {
609       const Symbol* symbol;
610       const Relobj* relobj;
611     } u_;
612     // Addend associated with a reloc.
613     int32_t addend_;
614   };
615
616  protected:
617   // Reloc_stubs are created via a stub factory.  So these are protected.
618   Reloc_stub(const Stub_template* stub_template)
619     : Stub(stub_template), destination_address_(invalid_address)
620   { }
621
622   ~Reloc_stub()
623   { }
624
625   friend class Stub_factory;
626
627   // Return the relocation target address of the i-th relocation in the
628   // stub.
629   Arm_address
630   do_reloc_target(size_t i)
631   {
632     // All reloc stub have only one relocation.
633     gold_assert(i == 0);
634     return this->destination_address_;
635   }
636
637  private:
638   // Address of destination.
639   Arm_address destination_address_;
640 };
641
642 // Cortex-A8 stub class.  We need a Cortex-A8 stub to redirect any 32-bit
643 // THUMB branch that meets the following conditions:
644 // 
645 // 1. The branch straddles across a page boundary. i.e. lower 12-bit of
646 //    branch address is 0xffe.
647 // 2. The branch target address is in the same page as the first word of the
648 //    branch.
649 // 3. The branch follows a 32-bit instruction which is not a branch.
650 //
651 // To do the fix up, we need to store the address of the branch instruction
652 // and its target at least.  We also need to store the original branch
653 // instruction bits for the condition code in a conditional branch.  The
654 // condition code is used in a special instruction template.  We also want
655 // to identify input sections needing Cortex-A8 workaround quickly.  We store
656 // extra information about object and section index of the code section
657 // containing a branch being fixed up.  The information is used to mark
658 // the code section when we finalize the Cortex-A8 stubs.
659 //
660
661 class Cortex_a8_stub : public Stub
662 {
663  public:
664   ~Cortex_a8_stub()
665   { }
666
667   // Return the object of the code section containing the branch being fixed
668   // up.
669   Relobj*
670   relobj() const
671   { return this->relobj_; }
672
673   // Return the section index of the code section containing the branch being
674   // fixed up.
675   unsigned int
676   shndx() const
677   { return this->shndx_; }
678
679   // Return the source address of stub.  This is the address of the original
680   // branch instruction.  LSB is 1 always set to indicate that it is a THUMB
681   // instruction.
682   Arm_address
683   source_address() const
684   { return this->source_address_; }
685
686   // Return the destination address of the stub.  This is the branch taken
687   // address of the original branch instruction.  LSB is 1 if it is a THUMB
688   // instruction address.
689   Arm_address
690   destination_address() const
691   { return this->destination_address_; }
692
693   // Return the instruction being fixed up.
694   uint32_t
695   original_insn() const
696   { return this->original_insn_; }
697
698  protected:
699   // Cortex_a8_stubs are created via a stub factory.  So these are protected.
700   Cortex_a8_stub(const Stub_template* stub_template, Relobj* relobj,
701                  unsigned int shndx, Arm_address source_address,
702                  Arm_address destination_address, uint32_t original_insn)
703     : Stub(stub_template), relobj_(relobj), shndx_(shndx),
704       source_address_(source_address | 1U),
705       destination_address_(destination_address),
706       original_insn_(original_insn)
707   { }
708
709   friend class Stub_factory;
710
711   // Return the relocation target address of the i-th relocation in the
712   // stub.
713   Arm_address
714   do_reloc_target(size_t i)
715   {
716     if (this->stub_template()->type() == arm_stub_a8_veneer_b_cond)
717       {
718         // The conditional branch veneer has two relocations.
719         gold_assert(i < 2);
720         return i == 0 ? this->source_address_ + 4 : this->destination_address_;
721       }
722     else
723       {
724         // All other Cortex-A8 stubs have only one relocation.
725         gold_assert(i == 0);
726         return this->destination_address_;
727       }
728   }
729
730   // Return an instruction for the THUMB16_SPECIAL_TYPE instruction template.
731   uint16_t
732   do_thumb16_special(size_t);
733
734  private:
735   // Object of the code section containing the branch being fixed up.
736   Relobj* relobj_;
737   // Section index of the code section containing the branch begin fixed up.
738   unsigned int shndx_;
739   // Source address of original branch.
740   Arm_address source_address_;
741   // Destination address of the original branch.
742   Arm_address destination_address_;
743   // Original branch instruction.  This is needed for copying the condition
744   // code from a condition branch to its stub.
745   uint32_t original_insn_;
746 };
747
748 // ARMv4 BX Rx branch relocation stub class.
749 class Arm_v4bx_stub : public Stub
750 {
751  public:
752   ~Arm_v4bx_stub()
753   { }
754
755   // Return the associated register.
756   uint32_t
757   reg() const
758   { return this->reg_; }
759
760  protected:
761   // Arm V4BX stubs are created via a stub factory.  So these are protected.
762   Arm_v4bx_stub(const Stub_template* stub_template, const uint32_t reg)
763     : Stub(stub_template), reg_(reg)
764   { }
765
766   friend class Stub_factory;
767
768   // Return the relocation target address of the i-th relocation in the
769   // stub.
770   Arm_address
771   do_reloc_target(size_t)
772   { gold_unreachable(); }
773
774   // This may be overridden in the child class.
775   virtual void
776   do_write(unsigned char* view, section_size_type view_size, bool big_endian)
777   {
778     if (big_endian)
779       this->do_fixed_endian_v4bx_write<true>(view, view_size);
780     else
781       this->do_fixed_endian_v4bx_write<false>(view, view_size);
782   }
783
784  private:
785   // A template to implement do_write.
786   template<bool big_endian>
787   void inline
788   do_fixed_endian_v4bx_write(unsigned char* view, section_size_type)
789   {
790     const Insn_template* insns = this->stub_template()->insns();
791     elfcpp::Swap<32, big_endian>::writeval(view,
792                                            (insns[0].data()
793                                            + (this->reg_ << 16)));
794     view += insns[0].size();
795     elfcpp::Swap<32, big_endian>::writeval(view,
796                                            (insns[1].data() + this->reg_));
797     view += insns[1].size();
798     elfcpp::Swap<32, big_endian>::writeval(view,
799                                            (insns[2].data() + this->reg_));
800   }
801
802   // A register index (r0-r14), which is associated with the stub.
803   uint32_t reg_;
804 };
805
806 // Stub factory class.
807
808 class Stub_factory
809 {
810  public:
811   // Return the unique instance of this class.
812   static const Stub_factory&
813   get_instance()
814   {
815     static Stub_factory singleton;
816     return singleton;
817   }
818
819   // Make a relocation stub.
820   Reloc_stub*
821   make_reloc_stub(Stub_type stub_type) const
822   {
823     gold_assert(stub_type >= arm_stub_reloc_first
824                 && stub_type <= arm_stub_reloc_last);
825     return new Reloc_stub(this->stub_templates_[stub_type]);
826   }
827
828   // Make a Cortex-A8 stub.
829   Cortex_a8_stub*
830   make_cortex_a8_stub(Stub_type stub_type, Relobj* relobj, unsigned int shndx,
831                       Arm_address source, Arm_address destination,
832                       uint32_t original_insn) const
833   {
834     gold_assert(stub_type >= arm_stub_cortex_a8_first
835                 && stub_type <= arm_stub_cortex_a8_last);
836     return new Cortex_a8_stub(this->stub_templates_[stub_type], relobj, shndx,
837                               source, destination, original_insn);
838   }
839
840   // Make an ARM V4BX relocation stub.
841   // This method creates a stub from the arm_stub_v4_veneer_bx template only.
842   Arm_v4bx_stub*
843   make_arm_v4bx_stub(uint32_t reg) const
844   {
845     gold_assert(reg < 0xf);
846     return new Arm_v4bx_stub(this->stub_templates_[arm_stub_v4_veneer_bx],
847                              reg);
848   }
849
850  private:
851   // Constructor and destructor are protected since we only return a single
852   // instance created in Stub_factory::get_instance().
853   
854   Stub_factory();
855
856   // A Stub_factory may not be copied since it is a singleton.
857   Stub_factory(const Stub_factory&);
858   Stub_factory& operator=(Stub_factory&);
859   
860   // Stub templates.  These are initialized in the constructor.
861   const Stub_template* stub_templates_[arm_stub_type_last+1];
862 };
863
864 // A class to hold stubs for the ARM target.
865
866 template<bool big_endian>
867 class Stub_table : public Output_data
868 {
869  public:
870   Stub_table(Arm_input_section<big_endian>* owner)
871     : Output_data(), owner_(owner), reloc_stubs_(), reloc_stubs_size_(0),
872       reloc_stubs_addralign_(1), cortex_a8_stubs_(), arm_v4bx_stubs_(0xf),
873       prev_data_size_(0), prev_addralign_(1)
874   { }
875
876   ~Stub_table()
877   { }
878
879   // Owner of this stub table.
880   Arm_input_section<big_endian>*
881   owner() const
882   { return this->owner_; }
883
884   // Whether this stub table is empty.
885   bool
886   empty() const
887   {
888     return (this->reloc_stubs_.empty()
889             && this->cortex_a8_stubs_.empty()
890             && this->arm_v4bx_stubs_.empty());
891   }
892
893   // Return the current data size.
894   off_t
895   current_data_size() const
896   { return this->current_data_size_for_child(); }
897
898   // Add a STUB using KEY.  The caller is responsible for avoiding addition
899   // if a STUB with the same key has already been added.
900   void
901   add_reloc_stub(Reloc_stub* stub, const Reloc_stub::Key& key)
902   {
903     const Stub_template* stub_template = stub->stub_template();
904     gold_assert(stub_template->type() == key.stub_type());
905     this->reloc_stubs_[key] = stub;
906
907     // Assign stub offset early.  We can do this because we never remove
908     // reloc stubs and they are in the beginning of the stub table.
909     uint64_t align = stub_template->alignment();
910     this->reloc_stubs_size_ = align_address(this->reloc_stubs_size_, align);
911     stub->set_offset(this->reloc_stubs_size_);
912     this->reloc_stubs_size_ += stub_template->size();
913     this->reloc_stubs_addralign_ =
914       std::max(this->reloc_stubs_addralign_, align);
915   }
916
917   // Add a Cortex-A8 STUB that fixes up a THUMB branch at ADDRESS.
918   // The caller is responsible for avoiding addition if a STUB with the same
919   // address has already been added.
920   void
921   add_cortex_a8_stub(Arm_address address, Cortex_a8_stub* stub)
922   {
923     std::pair<Arm_address, Cortex_a8_stub*> value(address, stub);
924     this->cortex_a8_stubs_.insert(value);
925   }
926
927   // Add an ARM V4BX relocation stub. A register index will be retrieved
928   // from the stub.
929   void
930   add_arm_v4bx_stub(Arm_v4bx_stub* stub)
931   {
932     gold_assert(stub != NULL && this->arm_v4bx_stubs_[stub->reg()] == NULL);
933     this->arm_v4bx_stubs_[stub->reg()] = stub;
934   }
935
936   // Remove all Cortex-A8 stubs.
937   void
938   remove_all_cortex_a8_stubs();
939
940   // Look up a relocation stub using KEY.  Return NULL if there is none.
941   Reloc_stub*
942   find_reloc_stub(const Reloc_stub::Key& key) const
943   {
944     typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.find(key);
945     return (p != this->reloc_stubs_.end()) ? p->second : NULL;
946   }
947
948   // Look up an arm v4bx relocation stub using the register index.
949   // Return NULL if there is none.
950   Arm_v4bx_stub*
951   find_arm_v4bx_stub(const uint32_t reg) const
952   {
953     gold_assert(reg < 0xf);
954     return this->arm_v4bx_stubs_[reg];
955   }
956
957   // Relocate stubs in this stub table.
958   void
959   relocate_stubs(const Relocate_info<32, big_endian>*,
960                  Target_arm<big_endian>*, Output_section*,
961                  unsigned char*, Arm_address, section_size_type);
962
963   // Update data size and alignment at the end of a relaxation pass.  Return
964   // true if either data size or alignment is different from that of the
965   // previous relaxation pass.
966   bool
967   update_data_size_and_addralign();
968
969   // Finalize stubs.  Set the offsets of all stubs and mark input sections
970   // needing the Cortex-A8 workaround.
971   void
972   finalize_stubs();
973   
974   // Apply Cortex-A8 workaround to an address range.
975   void
976   apply_cortex_a8_workaround_to_address_range(Target_arm<big_endian>*,
977                                               unsigned char*, Arm_address,
978                                               section_size_type);
979
980  protected:
981   // Write out section contents.
982   void
983   do_write(Output_file*);
984  
985   // Return the required alignment.
986   uint64_t
987   do_addralign() const
988   { return this->prev_addralign_; }
989
990   // Reset address and file offset.
991   void
992   do_reset_address_and_file_offset()
993   { this->set_current_data_size_for_child(this->prev_data_size_); }
994
995   // Set final data size.
996   void
997   set_final_data_size()
998   { this->set_data_size(this->current_data_size()); }
999   
1000  private:
1001   // Relocate one stub.
1002   void
1003   relocate_stub(Stub*, const Relocate_info<32, big_endian>*,
1004                 Target_arm<big_endian>*, Output_section*,
1005                 unsigned char*, Arm_address, section_size_type);
1006
1007   // Unordered map of relocation stubs.
1008   typedef
1009     Unordered_map<Reloc_stub::Key, Reloc_stub*, Reloc_stub::Key::hash,
1010                   Reloc_stub::Key::equal_to>
1011     Reloc_stub_map;
1012
1013   // List of Cortex-A8 stubs ordered by addresses of branches being
1014   // fixed up in output.
1015   typedef std::map<Arm_address, Cortex_a8_stub*> Cortex_a8_stub_list;
1016   // List of Arm V4BX relocation stubs ordered by associated registers.
1017   typedef std::vector<Arm_v4bx_stub*> Arm_v4bx_stub_list;
1018
1019   // Owner of this stub table.
1020   Arm_input_section<big_endian>* owner_;
1021   // The relocation stubs.
1022   Reloc_stub_map reloc_stubs_;
1023   // Size of reloc stubs.
1024   off_t reloc_stubs_size_;
1025   // Maximum address alignment of reloc stubs.
1026   uint64_t reloc_stubs_addralign_;
1027   // The cortex_a8_stubs.
1028   Cortex_a8_stub_list cortex_a8_stubs_;
1029   // The Arm V4BX relocation stubs.
1030   Arm_v4bx_stub_list arm_v4bx_stubs_;
1031   // data size of this in the previous pass.
1032   off_t prev_data_size_;
1033   // address alignment of this in the previous pass.
1034   uint64_t prev_addralign_;
1035 };
1036
1037 // Arm_exidx_cantunwind class.  This represents an EXIDX_CANTUNWIND entry
1038 // we add to the end of an EXIDX input section that goes into the output.
1039
1040 class Arm_exidx_cantunwind : public Output_section_data
1041 {
1042  public:
1043   Arm_exidx_cantunwind(Relobj* relobj, unsigned int shndx)
1044     : Output_section_data(8, 4, true), relobj_(relobj), shndx_(shndx)
1045   { }
1046
1047   // Return the object containing the section pointed by this.
1048   Relobj*
1049   relobj() const
1050   { return this->relobj_; }
1051
1052   // Return the section index of the section pointed by this.
1053   unsigned int
1054   shndx() const
1055   { return this->shndx_; }
1056
1057  protected:
1058   void
1059   do_write(Output_file* of)
1060   {
1061     if (parameters->target().is_big_endian())
1062       this->do_fixed_endian_write<true>(of);
1063     else
1064       this->do_fixed_endian_write<false>(of);
1065   }
1066
1067   // Write to a map file.
1068   void
1069   do_print_to_mapfile(Mapfile* mapfile) const
1070   { mapfile->print_output_data(this, _("** ARM cantunwind")); }
1071
1072  private:
1073   // Implement do_write for a given endianness.
1074   template<bool big_endian>
1075   void inline
1076   do_fixed_endian_write(Output_file*);
1077   
1078   // The object containing the section pointed by this.
1079   Relobj* relobj_;
1080   // The section index of the section pointed by this.
1081   unsigned int shndx_;
1082 };
1083
1084 // During EXIDX coverage fix-up, we compact an EXIDX section.  The
1085 // Offset map is used to map input section offset within the EXIDX section
1086 // to the output offset from the start of this EXIDX section. 
1087
1088 typedef std::map<section_offset_type, section_offset_type>
1089         Arm_exidx_section_offset_map;
1090
1091 // Arm_exidx_merged_section class.  This represents an EXIDX input section
1092 // with some of its entries merged.
1093
1094 class Arm_exidx_merged_section : public Output_relaxed_input_section
1095 {
1096  public:
1097   // Constructor for Arm_exidx_merged_section.
1098   // EXIDX_INPUT_SECTION points to the unmodified EXIDX input section.
1099   // SECTION_OFFSET_MAP points to a section offset map describing how
1100   // parts of the input section are mapped to output.  DELETED_BYTES is
1101   // the number of bytes deleted from the EXIDX input section.
1102   Arm_exidx_merged_section(
1103       const Arm_exidx_input_section& exidx_input_section,
1104       const Arm_exidx_section_offset_map& section_offset_map,
1105       uint32_t deleted_bytes);
1106
1107   // Build output contents.
1108   void
1109   build_contents(const unsigned char*, section_size_type);
1110
1111   // Return the original EXIDX input section.
1112   const Arm_exidx_input_section&
1113   exidx_input_section() const
1114   { return this->exidx_input_section_; }
1115
1116   // Return the section offset map.
1117   const Arm_exidx_section_offset_map&
1118   section_offset_map() const
1119   { return this->section_offset_map_; }
1120
1121  protected:
1122   // Write merged section into file OF.
1123   void
1124   do_write(Output_file* of);
1125
1126   bool
1127   do_output_offset(const Relobj*, unsigned int, section_offset_type,
1128                   section_offset_type*) const;
1129
1130  private:
1131   // Original EXIDX input section.
1132   const Arm_exidx_input_section& exidx_input_section_;
1133   // Section offset map.
1134   const Arm_exidx_section_offset_map& section_offset_map_;
1135   // Merged section contents.  We need to keep build the merged section 
1136   // and save it here to avoid accessing the original EXIDX section when
1137   // we cannot lock the sections' object.
1138   unsigned char* section_contents_;
1139 };
1140
1141 // A class to wrap an ordinary input section containing executable code.
1142
1143 template<bool big_endian>
1144 class Arm_input_section : public Output_relaxed_input_section
1145 {
1146  public:
1147   Arm_input_section(Relobj* relobj, unsigned int shndx)
1148     : Output_relaxed_input_section(relobj, shndx, 1),
1149       original_addralign_(1), original_size_(0), stub_table_(NULL),
1150       original_contents_(NULL)
1151   { }
1152
1153   ~Arm_input_section()
1154   { delete[] this->original_contents_; }
1155
1156   // Initialize.
1157   void
1158   init();
1159   
1160   // Whether this is a stub table owner.
1161   bool
1162   is_stub_table_owner() const
1163   { return this->stub_table_ != NULL && this->stub_table_->owner() == this; }
1164
1165   // Return the stub table.
1166   Stub_table<big_endian>*
1167   stub_table() const
1168   { return this->stub_table_; }
1169
1170   // Set the stub_table.
1171   void
1172   set_stub_table(Stub_table<big_endian>* stub_table)
1173   { this->stub_table_ = stub_table; }
1174
1175   // Downcast a base pointer to an Arm_input_section pointer.  This is
1176   // not type-safe but we only use Arm_input_section not the base class.
1177   static Arm_input_section<big_endian>*
1178   as_arm_input_section(Output_relaxed_input_section* poris)
1179   { return static_cast<Arm_input_section<big_endian>*>(poris); }
1180
1181   // Return the original size of the section.
1182   uint32_t
1183   original_size() const
1184   { return this->original_size_; }
1185
1186  protected:
1187   // Write data to output file.
1188   void
1189   do_write(Output_file*);
1190
1191   // Return required alignment of this.
1192   uint64_t
1193   do_addralign() const
1194   {
1195     if (this->is_stub_table_owner())
1196       return std::max(this->stub_table_->addralign(),
1197                       static_cast<uint64_t>(this->original_addralign_));
1198     else
1199       return this->original_addralign_;
1200   }
1201
1202   // Finalize data size.
1203   void
1204   set_final_data_size();
1205
1206   // Reset address and file offset.
1207   void
1208   do_reset_address_and_file_offset();
1209
1210   // Output offset.
1211   bool
1212   do_output_offset(const Relobj* object, unsigned int shndx,
1213                    section_offset_type offset,
1214                    section_offset_type* poutput) const
1215   {
1216     if ((object == this->relobj())
1217         && (shndx == this->shndx())
1218         && (offset >= 0)
1219         && (offset <=
1220             convert_types<section_offset_type, uint32_t>(this->original_size_)))
1221       {
1222         *poutput = offset;
1223         return true;
1224       }
1225     else
1226       return false;
1227   }
1228
1229  private:
1230   // Copying is not allowed.
1231   Arm_input_section(const Arm_input_section&);
1232   Arm_input_section& operator=(const Arm_input_section&);
1233
1234   // Address alignment of the original input section.
1235   uint32_t original_addralign_;
1236   // Section size of the original input section.
1237   uint32_t original_size_;
1238   // Stub table.
1239   Stub_table<big_endian>* stub_table_;
1240   // Original section contents.  We have to make a copy here since the file
1241   // containing the original section may not be locked when we need to access
1242   // the contents.
1243   unsigned char* original_contents_;
1244 };
1245
1246 // Arm_exidx_fixup class.  This is used to define a number of methods
1247 // and keep states for fixing up EXIDX coverage.
1248
1249 class Arm_exidx_fixup
1250 {
1251  public:
1252   Arm_exidx_fixup(Output_section* exidx_output_section,
1253                   bool merge_exidx_entries = true)
1254     : exidx_output_section_(exidx_output_section), last_unwind_type_(UT_NONE),
1255       last_inlined_entry_(0), last_input_section_(NULL),
1256       section_offset_map_(NULL), first_output_text_section_(NULL),
1257       merge_exidx_entries_(merge_exidx_entries)
1258   { }
1259
1260   ~Arm_exidx_fixup()
1261   { delete this->section_offset_map_; }
1262
1263   // Process an EXIDX section for entry merging.  SECTION_CONTENTS points
1264   // to the EXIDX contents and SECTION_SIZE is the size of the contents. Return
1265   // number of bytes to be deleted in output.  If parts of the input EXIDX
1266   // section are merged a heap allocated Arm_exidx_section_offset_map is store
1267   // in the located PSECTION_OFFSET_MAP.   The caller owns the map and is
1268   // responsible for releasing it.
1269   template<bool big_endian>
1270   uint32_t
1271   process_exidx_section(const Arm_exidx_input_section* exidx_input_section,
1272                         const unsigned char* section_contents,
1273                         section_size_type section_size,
1274                         Arm_exidx_section_offset_map** psection_offset_map);
1275   
1276   // Append an EXIDX_CANTUNWIND entry pointing at the end of the last
1277   // input section, if there is not one already.
1278   void
1279   add_exidx_cantunwind_as_needed();
1280
1281   // Return the output section for the text section which is linked to the
1282   // first exidx input in output.
1283   Output_section*
1284   first_output_text_section() const
1285   { return this->first_output_text_section_; }
1286
1287  private:
1288   // Copying is not allowed.
1289   Arm_exidx_fixup(const Arm_exidx_fixup&);
1290   Arm_exidx_fixup& operator=(const Arm_exidx_fixup&);
1291
1292   // Type of EXIDX unwind entry.
1293   enum Unwind_type
1294   {
1295     // No type.
1296     UT_NONE,
1297     // EXIDX_CANTUNWIND.
1298     UT_EXIDX_CANTUNWIND,
1299     // Inlined entry.
1300     UT_INLINED_ENTRY,
1301     // Normal entry.
1302     UT_NORMAL_ENTRY,
1303   };
1304
1305   // Process an EXIDX entry.  We only care about the second word of the
1306   // entry.  Return true if the entry can be deleted.
1307   bool
1308   process_exidx_entry(uint32_t second_word);
1309
1310   // Update the current section offset map during EXIDX section fix-up.
1311   // If there is no map, create one.  INPUT_OFFSET is the offset of a
1312   // reference point, DELETED_BYTES is the number of deleted by in the
1313   // section so far.  If DELETE_ENTRY is true, the reference point and
1314   // all offsets after the previous reference point are discarded.
1315   void
1316   update_offset_map(section_offset_type input_offset,
1317                     section_size_type deleted_bytes, bool delete_entry);
1318
1319   // EXIDX output section.
1320   Output_section* exidx_output_section_;
1321   // Unwind type of the last EXIDX entry processed.
1322   Unwind_type last_unwind_type_;
1323   // Last seen inlined EXIDX entry.
1324   uint32_t last_inlined_entry_;
1325   // Last processed EXIDX input section.
1326   const Arm_exidx_input_section* last_input_section_;
1327   // Section offset map created in process_exidx_section.
1328   Arm_exidx_section_offset_map* section_offset_map_;
1329   // Output section for the text section which is linked to the first exidx
1330   // input in output.
1331   Output_section* first_output_text_section_;
1332
1333   bool merge_exidx_entries_;
1334 };
1335
1336 // Arm output section class.  This is defined mainly to add a number of
1337 // stub generation methods.
1338
1339 template<bool big_endian>
1340 class Arm_output_section : public Output_section
1341 {
1342  public:
1343   typedef std::vector<std::pair<Relobj*, unsigned int> > Text_section_list;
1344
1345   // We need to force SHF_LINK_ORDER in a SHT_ARM_EXIDX section.
1346   Arm_output_section(const char* name, elfcpp::Elf_Word type,
1347                      elfcpp::Elf_Xword flags)
1348     : Output_section(name, type,
1349                      (type == elfcpp::SHT_ARM_EXIDX
1350                       ? flags | elfcpp::SHF_LINK_ORDER
1351                       : flags))
1352   {
1353     if (type == elfcpp::SHT_ARM_EXIDX)
1354       this->set_always_keeps_input_sections();
1355   }
1356
1357   ~Arm_output_section()
1358   { }
1359   
1360   // Group input sections for stub generation.
1361   void
1362   group_sections(section_size_type, bool, Target_arm<big_endian>*, const Task*);
1363
1364   // Downcast a base pointer to an Arm_output_section pointer.  This is
1365   // not type-safe but we only use Arm_output_section not the base class.
1366   static Arm_output_section<big_endian>*
1367   as_arm_output_section(Output_section* os)
1368   { return static_cast<Arm_output_section<big_endian>*>(os); }
1369
1370   // Append all input text sections in this into LIST.
1371   void
1372   append_text_sections_to_list(Text_section_list* list);
1373
1374   // Fix EXIDX coverage of this EXIDX output section.  SORTED_TEXT_SECTION
1375   // is a list of text input sections sorted in ascending order of their
1376   // output addresses.
1377   void
1378   fix_exidx_coverage(Layout* layout,
1379                      const Text_section_list& sorted_text_section,
1380                      Symbol_table* symtab,
1381                      bool merge_exidx_entries,
1382                      const Task* task);
1383
1384   // Link an EXIDX section into its corresponding text section.
1385   void
1386   set_exidx_section_link();
1387
1388  private:
1389   // For convenience.
1390   typedef Output_section::Input_section Input_section;
1391   typedef Output_section::Input_section_list Input_section_list;
1392
1393   // Create a stub group.
1394   void create_stub_group(Input_section_list::const_iterator,
1395                          Input_section_list::const_iterator,
1396                          Input_section_list::const_iterator,
1397                          Target_arm<big_endian>*,
1398                          std::vector<Output_relaxed_input_section*>*,
1399                          const Task* task);
1400 };
1401
1402 // Arm_exidx_input_section class.  This represents an EXIDX input section.
1403
1404 class Arm_exidx_input_section
1405 {
1406  public:
1407   static const section_offset_type invalid_offset =
1408     static_cast<section_offset_type>(-1);
1409
1410   Arm_exidx_input_section(Relobj* relobj, unsigned int shndx,
1411                           unsigned int link, uint32_t size,
1412                           uint32_t addralign, uint32_t text_size)
1413     : relobj_(relobj), shndx_(shndx), link_(link), size_(size),
1414       addralign_(addralign), text_size_(text_size), has_errors_(false)
1415   { }
1416
1417   ~Arm_exidx_input_section()
1418   { }
1419         
1420   // Accessors:  This is a read-only class.
1421
1422   // Return the object containing this EXIDX input section.
1423   Relobj*
1424   relobj() const
1425   { return this->relobj_; }
1426
1427   // Return the section index of this EXIDX input section.
1428   unsigned int
1429   shndx() const
1430   { return this->shndx_; }
1431
1432   // Return the section index of linked text section in the same object.
1433   unsigned int
1434   link() const
1435   { return this->link_; }
1436
1437   // Return size of the EXIDX input section.
1438   uint32_t
1439   size() const
1440   { return this->size_; }
1441
1442   // Return address alignment of EXIDX input section.
1443   uint32_t
1444   addralign() const
1445   { return this->addralign_; }
1446
1447   // Return size of the associated text input section.
1448   uint32_t
1449   text_size() const
1450   { return this->text_size_; }
1451
1452   // Whether there are any errors in the EXIDX input section.
1453   bool
1454   has_errors() const
1455   { return this->has_errors_; }
1456
1457   // Set has-errors flag.
1458   void
1459   set_has_errors()
1460   { this->has_errors_ = true; }
1461
1462  private:
1463   // Object containing this.
1464   Relobj* relobj_;
1465   // Section index of this.
1466   unsigned int shndx_;
1467   // text section linked to this in the same object.
1468   unsigned int link_;
1469   // Size of this.  For ARM 32-bit is sufficient.
1470   uint32_t size_;
1471   // Address alignment of this.  For ARM 32-bit is sufficient.
1472   uint32_t addralign_;
1473   // Size of associated text section.
1474   uint32_t text_size_;
1475   // Whether this has any errors.
1476   bool has_errors_;
1477 };
1478
1479 // Arm_relobj class.
1480
1481 template<bool big_endian>
1482 class Arm_relobj : public Sized_relobj_file<32, big_endian>
1483 {
1484  public:
1485   static const Arm_address invalid_address = static_cast<Arm_address>(-1);
1486
1487   Arm_relobj(const std::string& name, Input_file* input_file, off_t offset,
1488              const typename elfcpp::Ehdr<32, big_endian>& ehdr)
1489     : Sized_relobj_file<32, big_endian>(name, input_file, offset, ehdr),
1490       stub_tables_(), local_symbol_is_thumb_function_(),
1491       attributes_section_data_(NULL), mapping_symbols_info_(),
1492       section_has_cortex_a8_workaround_(NULL), exidx_section_map_(),
1493       output_local_symbol_count_needs_update_(false),
1494       merge_flags_and_attributes_(true)
1495   { }
1496
1497   ~Arm_relobj()
1498   { delete this->attributes_section_data_; }
1499  
1500   // Return the stub table of the SHNDX-th section if there is one.
1501   Stub_table<big_endian>*
1502   stub_table(unsigned int shndx) const
1503   {
1504     gold_assert(shndx < this->stub_tables_.size());
1505     return this->stub_tables_[shndx];
1506   }
1507
1508   // Set STUB_TABLE to be the stub_table of the SHNDX-th section.
1509   void
1510   set_stub_table(unsigned int shndx, Stub_table<big_endian>* stub_table)
1511   {
1512     gold_assert(shndx < this->stub_tables_.size());
1513     this->stub_tables_[shndx] = stub_table;
1514   }
1515
1516   // Whether a local symbol is a THUMB function.  R_SYM is the symbol table
1517   // index.  This is only valid after do_count_local_symbol is called.
1518   bool
1519   local_symbol_is_thumb_function(unsigned int r_sym) const
1520   {
1521     gold_assert(r_sym < this->local_symbol_is_thumb_function_.size());
1522     return this->local_symbol_is_thumb_function_[r_sym];
1523   }
1524   
1525   // Scan all relocation sections for stub generation.
1526   void
1527   scan_sections_for_stubs(Target_arm<big_endian>*, const Symbol_table*,
1528                           const Layout*);
1529
1530   // Convert regular input section with index SHNDX to a relaxed section.
1531   void
1532   convert_input_section_to_relaxed_section(unsigned shndx)
1533   {
1534     // The stubs have relocations and we need to process them after writing
1535     // out the stubs.  So relocation now must follow section write.
1536     this->set_section_offset(shndx, -1ULL);
1537     this->set_relocs_must_follow_section_writes();
1538   }
1539
1540   // Downcast a base pointer to an Arm_relobj pointer.  This is
1541   // not type-safe but we only use Arm_relobj not the base class.
1542   static Arm_relobj<big_endian>*
1543   as_arm_relobj(Relobj* relobj)
1544   { return static_cast<Arm_relobj<big_endian>*>(relobj); }
1545
1546   // Processor-specific flags in ELF file header.  This is valid only after
1547   // reading symbols.
1548   elfcpp::Elf_Word
1549   processor_specific_flags() const
1550   { return this->processor_specific_flags_; }
1551
1552   // Attribute section data  This is the contents of the .ARM.attribute section
1553   // if there is one.
1554   const Attributes_section_data*
1555   attributes_section_data() const
1556   { return this->attributes_section_data_; }
1557
1558   // Mapping symbol location.
1559   typedef std::pair<unsigned int, Arm_address> Mapping_symbol_position;
1560
1561   // Functor for STL container.
1562   struct Mapping_symbol_position_less
1563   {
1564     bool
1565     operator()(const Mapping_symbol_position& p1,
1566                const Mapping_symbol_position& p2) const
1567     {
1568       return (p1.first < p2.first
1569               || (p1.first == p2.first && p1.second < p2.second));
1570     }
1571   };
1572   
1573   // We only care about the first character of a mapping symbol, so
1574   // we only store that instead of the whole symbol name.
1575   typedef std::map<Mapping_symbol_position, char,
1576                    Mapping_symbol_position_less> Mapping_symbols_info;
1577
1578   // Whether a section contains any Cortex-A8 workaround.
1579   bool
1580   section_has_cortex_a8_workaround(unsigned int shndx) const
1581   { 
1582     return (this->section_has_cortex_a8_workaround_ != NULL
1583             && (*this->section_has_cortex_a8_workaround_)[shndx]);
1584   }
1585   
1586   // Mark a section that has Cortex-A8 workaround.
1587   void
1588   mark_section_for_cortex_a8_workaround(unsigned int shndx)
1589   {
1590     if (this->section_has_cortex_a8_workaround_ == NULL)
1591       this->section_has_cortex_a8_workaround_ =
1592         new std::vector<bool>(this->shnum(), false);
1593     (*this->section_has_cortex_a8_workaround_)[shndx] = true;
1594   }
1595
1596   // Return the EXIDX section of an text section with index SHNDX or NULL
1597   // if the text section has no associated EXIDX section.
1598   const Arm_exidx_input_section*
1599   exidx_input_section_by_link(unsigned int shndx) const
1600   {
1601     Exidx_section_map::const_iterator p = this->exidx_section_map_.find(shndx);
1602     return ((p != this->exidx_section_map_.end()
1603              && p->second->link() == shndx)
1604             ? p->second
1605             : NULL);
1606   }
1607
1608   // Return the EXIDX section with index SHNDX or NULL if there is none.
1609   const Arm_exidx_input_section*
1610   exidx_input_section_by_shndx(unsigned shndx) const
1611   {
1612     Exidx_section_map::const_iterator p = this->exidx_section_map_.find(shndx);
1613     return ((p != this->exidx_section_map_.end()
1614              && p->second->shndx() == shndx)
1615             ? p->second
1616             : NULL);
1617   }
1618
1619   // Whether output local symbol count needs updating.
1620   bool
1621   output_local_symbol_count_needs_update() const
1622   { return this->output_local_symbol_count_needs_update_; }
1623
1624   // Set output_local_symbol_count_needs_update flag to be true.
1625   void
1626   set_output_local_symbol_count_needs_update()
1627   { this->output_local_symbol_count_needs_update_ = true; }
1628   
1629   // Update output local symbol count at the end of relaxation.
1630   void
1631   update_output_local_symbol_count();
1632
1633   // Whether we want to merge processor-specific flags and attributes.
1634   bool
1635   merge_flags_and_attributes() const
1636   { return this->merge_flags_and_attributes_; }
1637   
1638   // Export list of EXIDX section indices.
1639   void
1640   get_exidx_shndx_list(std::vector<unsigned int>* list) const
1641   {
1642     list->clear();
1643     for (Exidx_section_map::const_iterator p = this->exidx_section_map_.begin();
1644          p != this->exidx_section_map_.end();
1645          ++p)
1646       {
1647         if (p->second->shndx() == p->first)
1648           list->push_back(p->first);
1649       }
1650     // Sort list to make result independent of implementation of map. 
1651     std::sort(list->begin(), list->end());
1652   }
1653
1654  protected:
1655   // Post constructor setup.
1656   void
1657   do_setup()
1658   {
1659     // Call parent's setup method.
1660     Sized_relobj_file<32, big_endian>::do_setup();
1661
1662     // Initialize look-up tables.
1663     Stub_table_list empty_stub_table_list(this->shnum(), NULL);
1664     this->stub_tables_.swap(empty_stub_table_list);
1665   }
1666
1667   // Count the local symbols.
1668   void
1669   do_count_local_symbols(Stringpool_template<char>*,
1670                          Stringpool_template<char>*);
1671
1672   void
1673   do_relocate_sections(
1674       const Symbol_table* symtab, const Layout* layout,
1675       const unsigned char* pshdrs, Output_file* of,
1676       typename Sized_relobj_file<32, big_endian>::Views* pivews);
1677
1678   // Read the symbol information.
1679   void
1680   do_read_symbols(Read_symbols_data* sd);
1681
1682   // Process relocs for garbage collection.
1683   void
1684   do_gc_process_relocs(Symbol_table*, Layout*, Read_relocs_data*);
1685
1686  private:
1687
1688   // Whether a section needs to be scanned for relocation stubs.
1689   bool
1690   section_needs_reloc_stub_scanning(const elfcpp::Shdr<32, big_endian>&,
1691                                     const Relobj::Output_sections&,
1692                                     const Symbol_table*, const unsigned char*);
1693
1694   // Whether a section is a scannable text section.
1695   bool
1696   section_is_scannable(const elfcpp::Shdr<32, big_endian>&, unsigned int,
1697                        const Output_section*, const Symbol_table*);
1698
1699   // Whether a section needs to be scanned for the Cortex-A8 erratum.
1700   bool
1701   section_needs_cortex_a8_stub_scanning(const elfcpp::Shdr<32, big_endian>&,
1702                                         unsigned int, Output_section*,
1703                                         const Symbol_table*);
1704
1705   // Scan a section for the Cortex-A8 erratum.
1706   void
1707   scan_section_for_cortex_a8_erratum(const elfcpp::Shdr<32, big_endian>&,
1708                                      unsigned int, Output_section*,
1709                                      Target_arm<big_endian>*);
1710
1711   // Find the linked text section of an EXIDX section by looking at the
1712   // first relocation of the EXIDX section.  PSHDR points to the section
1713   // headers of a relocation section and PSYMS points to the local symbols.
1714   // PSHNDX points to a location storing the text section index if found.
1715   // Return whether we can find the linked section.
1716   bool
1717   find_linked_text_section(const unsigned char* pshdr,
1718                            const unsigned char* psyms, unsigned int* pshndx);
1719
1720   //
1721   // Make a new Arm_exidx_input_section object for EXIDX section with
1722   // index SHNDX and section header SHDR.  TEXT_SHNDX is the section
1723   // index of the linked text section.
1724   void
1725   make_exidx_input_section(unsigned int shndx,
1726                            const elfcpp::Shdr<32, big_endian>& shdr,
1727                            unsigned int text_shndx,
1728                            const elfcpp::Shdr<32, big_endian>& text_shdr);
1729
1730   // Return the output address of either a plain input section or a
1731   // relaxed input section.  SHNDX is the section index.
1732   Arm_address
1733   simple_input_section_output_address(unsigned int, Output_section*);
1734
1735   typedef std::vector<Stub_table<big_endian>*> Stub_table_list;
1736   typedef Unordered_map<unsigned int, const Arm_exidx_input_section*>
1737     Exidx_section_map;
1738
1739   // List of stub tables.
1740   Stub_table_list stub_tables_;
1741   // Bit vector to tell if a local symbol is a thumb function or not.
1742   // This is only valid after do_count_local_symbol is called.
1743   std::vector<bool> local_symbol_is_thumb_function_;
1744   // processor-specific flags in ELF file header.
1745   elfcpp::Elf_Word processor_specific_flags_;
1746   // Object attributes if there is an .ARM.attributes section or NULL.
1747   Attributes_section_data* attributes_section_data_;
1748   // Mapping symbols information.
1749   Mapping_symbols_info mapping_symbols_info_;
1750   // Bitmap to indicate sections with Cortex-A8 workaround or NULL.
1751   std::vector<bool>* section_has_cortex_a8_workaround_;
1752   // Map a text section to its associated .ARM.exidx section, if there is one.
1753   Exidx_section_map exidx_section_map_;
1754   // Whether output local symbol count needs updating.
1755   bool output_local_symbol_count_needs_update_;
1756   // Whether we merge processor flags and attributes of this object to
1757   // output.
1758   bool merge_flags_and_attributes_;
1759 };
1760
1761 // Arm_dynobj class.
1762
1763 template<bool big_endian>
1764 class Arm_dynobj : public Sized_dynobj<32, big_endian>
1765 {
1766  public:
1767   Arm_dynobj(const std::string& name, Input_file* input_file, off_t offset,
1768              const elfcpp::Ehdr<32, big_endian>& ehdr)
1769     : Sized_dynobj<32, big_endian>(name, input_file, offset, ehdr),
1770       processor_specific_flags_(0), attributes_section_data_(NULL)
1771   { }
1772  
1773   ~Arm_dynobj()
1774   { delete this->attributes_section_data_; }
1775
1776   // Downcast a base pointer to an Arm_relobj pointer.  This is
1777   // not type-safe but we only use Arm_relobj not the base class.
1778   static Arm_dynobj<big_endian>*
1779   as_arm_dynobj(Dynobj* dynobj)
1780   { return static_cast<Arm_dynobj<big_endian>*>(dynobj); }
1781
1782   // Processor-specific flags in ELF file header.  This is valid only after
1783   // reading symbols.
1784   elfcpp::Elf_Word
1785   processor_specific_flags() const
1786   { return this->processor_specific_flags_; }
1787
1788   // Attributes section data.
1789   const Attributes_section_data*
1790   attributes_section_data() const
1791   { return this->attributes_section_data_; }
1792
1793  protected:
1794   // Read the symbol information.
1795   void
1796   do_read_symbols(Read_symbols_data* sd);
1797
1798  private:
1799   // processor-specific flags in ELF file header.
1800   elfcpp::Elf_Word processor_specific_flags_;
1801   // Object attributes if there is an .ARM.attributes section or NULL.
1802   Attributes_section_data* attributes_section_data_;
1803 };
1804
1805 // Functor to read reloc addends during stub generation.
1806
1807 template<int sh_type, bool big_endian>
1808 struct Stub_addend_reader
1809 {
1810   // Return the addend for a relocation of a particular type.  Depending
1811   // on whether this is a REL or RELA relocation, read the addend from a
1812   // view or from a Reloc object.
1813   elfcpp::Elf_types<32>::Elf_Swxword
1814   operator()(
1815     unsigned int /* r_type */,
1816     const unsigned char* /* view */,
1817     const typename Reloc_types<sh_type,
1818                                32, big_endian>::Reloc& /* reloc */) const;
1819 };
1820
1821 // Specialized Stub_addend_reader for SHT_REL type relocation sections.
1822
1823 template<bool big_endian>
1824 struct Stub_addend_reader<elfcpp::SHT_REL, big_endian>
1825 {
1826   elfcpp::Elf_types<32>::Elf_Swxword
1827   operator()(
1828     unsigned int,
1829     const unsigned char*,
1830     const typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc&) const;
1831 };
1832
1833 // Specialized Stub_addend_reader for RELA type relocation sections.
1834 // We currently do not handle RELA type relocation sections but it is trivial
1835 // to implement the addend reader.  This is provided for completeness and to
1836 // make it easier to add support for RELA relocation sections in the future.
1837
1838 template<bool big_endian>
1839 struct Stub_addend_reader<elfcpp::SHT_RELA, big_endian>
1840 {
1841   elfcpp::Elf_types<32>::Elf_Swxword
1842   operator()(
1843     unsigned int,
1844     const unsigned char*,
1845     const typename Reloc_types<elfcpp::SHT_RELA, 32,
1846                                big_endian>::Reloc& reloc) const
1847   { return reloc.get_r_addend(); }
1848 };
1849
1850 // Cortex_a8_reloc class.  We keep record of relocation that may need
1851 // the Cortex-A8 erratum workaround.
1852
1853 class Cortex_a8_reloc
1854 {
1855  public:
1856   Cortex_a8_reloc(Reloc_stub* reloc_stub, unsigned r_type,
1857                   Arm_address destination)
1858     : reloc_stub_(reloc_stub), r_type_(r_type), destination_(destination)
1859   { }
1860
1861   ~Cortex_a8_reloc()
1862   { }
1863
1864   // Accessors:  This is a read-only class.
1865   
1866   // Return the relocation stub associated with this relocation if there is
1867   // one.
1868   const Reloc_stub*
1869   reloc_stub() const
1870   { return this->reloc_stub_; } 
1871   
1872   // Return the relocation type.
1873   unsigned int
1874   r_type() const
1875   { return this->r_type_; }
1876
1877   // Return the destination address of the relocation.  LSB stores the THUMB
1878   // bit.
1879   Arm_address
1880   destination() const
1881   { return this->destination_; }
1882
1883  private:
1884   // Associated relocation stub if there is one, or NULL.
1885   const Reloc_stub* reloc_stub_;
1886   // Relocation type.
1887   unsigned int r_type_;
1888   // Destination address of this relocation.  LSB is used to distinguish
1889   // ARM/THUMB mode.
1890   Arm_address destination_;
1891 };
1892
1893 // Arm_output_data_got class.  We derive this from Output_data_got to add
1894 // extra methods to handle TLS relocations in a static link.
1895
1896 template<bool big_endian>
1897 class Arm_output_data_got : public Output_data_got<32, big_endian>
1898 {
1899  public:
1900   Arm_output_data_got(Symbol_table* symtab, Layout* layout)
1901     : Output_data_got<32, big_endian>(), symbol_table_(symtab), layout_(layout)
1902   { }
1903
1904   // Add a static entry for the GOT entry at OFFSET.  GSYM is a global
1905   // symbol and R_TYPE is the code of a dynamic relocation that needs to be
1906   // applied in a static link.
1907   void
1908   add_static_reloc(unsigned int got_offset, unsigned int r_type, Symbol* gsym)
1909   { this->static_relocs_.push_back(Static_reloc(got_offset, r_type, gsym)); }
1910
1911   // Add a static reloc for the GOT entry at OFFSET.  RELOBJ is an object
1912   // defining a local symbol with INDEX.  R_TYPE is the code of a dynamic
1913   // relocation that needs to be applied in a static link.
1914   void
1915   add_static_reloc(unsigned int got_offset, unsigned int r_type,
1916                    Sized_relobj_file<32, big_endian>* relobj,
1917                    unsigned int index)
1918   {
1919     this->static_relocs_.push_back(Static_reloc(got_offset, r_type, relobj,
1920                                                 index));
1921   }
1922
1923   // Add a GOT pair for R_ARM_TLS_GD32.  The creates a pair of GOT entries.
1924   // The first one is initialized to be 1, which is the module index for
1925   // the main executable and the second one 0.  A reloc of the type
1926   // R_ARM_TLS_DTPOFF32 will be created for the second GOT entry and will
1927   // be applied by gold.  GSYM is a global symbol.
1928   void
1929   add_tls_gd32_with_static_reloc(unsigned int got_type, Symbol* gsym);
1930
1931   // Same as the above but for a local symbol in OBJECT with INDEX.
1932   void
1933   add_tls_gd32_with_static_reloc(unsigned int got_type,
1934                                  Sized_relobj_file<32, big_endian>* object,
1935                                  unsigned int index);
1936
1937  protected:
1938   // Write out the GOT table.
1939   void
1940   do_write(Output_file*);
1941
1942  private:
1943   // This class represent dynamic relocations that need to be applied by
1944   // gold because we are using TLS relocations in a static link.
1945   class Static_reloc
1946   {
1947    public:
1948     Static_reloc(unsigned int got_offset, unsigned int r_type, Symbol* gsym)
1949       : got_offset_(got_offset), r_type_(r_type), symbol_is_global_(true)
1950     { this->u_.global.symbol = gsym; }
1951
1952     Static_reloc(unsigned int got_offset, unsigned int r_type,
1953           Sized_relobj_file<32, big_endian>* relobj, unsigned int index)
1954       : got_offset_(got_offset), r_type_(r_type), symbol_is_global_(false)
1955     {
1956       this->u_.local.relobj = relobj;
1957       this->u_.local.index = index;
1958     }
1959
1960     // Return the GOT offset.
1961     unsigned int
1962     got_offset() const
1963     { return this->got_offset_; }
1964
1965     // Relocation type.
1966     unsigned int
1967     r_type() const
1968     { return this->r_type_; }
1969
1970     // Whether the symbol is global or not.
1971     bool
1972     symbol_is_global() const
1973     { return this->symbol_is_global_; }
1974
1975     // For a relocation against a global symbol, the global symbol.
1976     Symbol*
1977     symbol() const
1978     {
1979       gold_assert(this->symbol_is_global_);
1980       return this->u_.global.symbol;
1981     }
1982
1983     // For a relocation against a local symbol, the defining object.
1984     Sized_relobj_file<32, big_endian>*
1985     relobj() const
1986     {
1987       gold_assert(!this->symbol_is_global_);
1988       return this->u_.local.relobj;
1989     }
1990
1991     // For a relocation against a local symbol, the local symbol index.
1992     unsigned int
1993     index() const
1994     {
1995       gold_assert(!this->symbol_is_global_);
1996       return this->u_.local.index;
1997     }
1998
1999    private:
2000     // GOT offset of the entry to which this relocation is applied.
2001     unsigned int got_offset_;
2002     // Type of relocation.
2003     unsigned int r_type_;
2004     // Whether this relocation is against a global symbol.
2005     bool symbol_is_global_;
2006     // A global or local symbol.
2007     union
2008     {
2009       struct
2010       {
2011         // For a global symbol, the symbol itself.
2012         Symbol* symbol;
2013       } global;
2014       struct
2015       {
2016         // For a local symbol, the object defining object.
2017         Sized_relobj_file<32, big_endian>* relobj;
2018         // For a local symbol, the symbol index.
2019         unsigned int index;
2020       } local;
2021     } u_;
2022   };
2023
2024   // Symbol table of the output object.
2025   Symbol_table* symbol_table_;
2026   // Layout of the output object.
2027   Layout* layout_;
2028   // Static relocs to be applied to the GOT.
2029   std::vector<Static_reloc> static_relocs_;
2030 };
2031
2032 // The ARM target has many relocation types with odd-sizes or noncontiguous
2033 // bits.  The default handling of relocatable relocation cannot process these
2034 // relocations.  So we have to extend the default code.
2035
2036 template<bool big_endian, int sh_type, typename Classify_reloc>
2037 class Arm_scan_relocatable_relocs :
2038   public Default_scan_relocatable_relocs<sh_type, Classify_reloc>
2039 {
2040  public:
2041   // Return the strategy to use for a local symbol which is a section
2042   // symbol, given the relocation type.
2043   inline Relocatable_relocs::Reloc_strategy
2044   local_section_strategy(unsigned int r_type, Relobj*)
2045   {
2046     if (sh_type == elfcpp::SHT_RELA)
2047       return Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_RELA;
2048     else
2049       {
2050         if (r_type == elfcpp::R_ARM_TARGET1
2051             || r_type == elfcpp::R_ARM_TARGET2)
2052           {
2053             const Target_arm<big_endian>* arm_target =
2054               Target_arm<big_endian>::default_target();
2055             r_type = arm_target->get_real_reloc_type(r_type);
2056           }
2057
2058         switch(r_type)
2059           {
2060           // Relocations that write nothing.  These exclude R_ARM_TARGET1
2061           // and R_ARM_TARGET2.
2062           case elfcpp::R_ARM_NONE:
2063           case elfcpp::R_ARM_V4BX:
2064           case elfcpp::R_ARM_TLS_GOTDESC:
2065           case elfcpp::R_ARM_TLS_CALL:
2066           case elfcpp::R_ARM_TLS_DESCSEQ:
2067           case elfcpp::R_ARM_THM_TLS_CALL:
2068           case elfcpp::R_ARM_GOTRELAX:
2069           case elfcpp::R_ARM_GNU_VTENTRY:
2070           case elfcpp::R_ARM_GNU_VTINHERIT:
2071           case elfcpp::R_ARM_THM_TLS_DESCSEQ16:
2072           case elfcpp::R_ARM_THM_TLS_DESCSEQ32:
2073             return Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_0;
2074           // These should have been converted to something else above.
2075           case elfcpp::R_ARM_TARGET1:
2076           case elfcpp::R_ARM_TARGET2:
2077             gold_unreachable();
2078           // Relocations that write full 32 bits.
2079           case elfcpp::R_ARM_ABS32:
2080           case elfcpp::R_ARM_REL32:
2081           case elfcpp::R_ARM_SBREL32:
2082           case elfcpp::R_ARM_GOTOFF32:
2083           case elfcpp::R_ARM_BASE_PREL:
2084           case elfcpp::R_ARM_GOT_BREL:
2085           case elfcpp::R_ARM_BASE_ABS:
2086           case elfcpp::R_ARM_ABS32_NOI:
2087           case elfcpp::R_ARM_REL32_NOI:
2088           case elfcpp::R_ARM_PLT32_ABS:
2089           case elfcpp::R_ARM_GOT_ABS:
2090           case elfcpp::R_ARM_GOT_PREL:
2091           case elfcpp::R_ARM_TLS_GD32:
2092           case elfcpp::R_ARM_TLS_LDM32:
2093           case elfcpp::R_ARM_TLS_LDO32:
2094           case elfcpp::R_ARM_TLS_IE32:
2095           case elfcpp::R_ARM_TLS_LE32:
2096             return Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_4;
2097           default:
2098             // For all other static relocations, return RELOC_SPECIAL.
2099             return Relocatable_relocs::RELOC_SPECIAL;
2100           }
2101       }
2102   }
2103 };
2104
2105 // Utilities for manipulating integers of up to 32-bits
2106
2107 namespace utils
2108 {
2109   // Sign extend an n-bit unsigned integer stored in an uint32_t into
2110   // an int32_t.  NO_BITS must be between 1 to 32.
2111   template<int no_bits>
2112   static inline int32_t
2113   sign_extend(uint32_t bits)
2114   {
2115     gold_assert(no_bits >= 0 && no_bits <= 32);
2116     if (no_bits == 32)
2117       return static_cast<int32_t>(bits);
2118     uint32_t mask = (~((uint32_t) 0)) >> (32 - no_bits);
2119     bits &= mask;
2120     uint32_t top_bit = 1U << (no_bits - 1);
2121     int32_t as_signed = static_cast<int32_t>(bits);
2122     return (bits & top_bit) ? as_signed + (-top_bit * 2) : as_signed;
2123   }
2124
2125   // Detects overflow of an NO_BITS integer stored in a uint32_t.
2126   template<int no_bits>
2127   static inline bool
2128   has_overflow(uint32_t bits)
2129   {
2130     gold_assert(no_bits >= 0 && no_bits <= 32);
2131     if (no_bits == 32)
2132       return false;
2133     int32_t max = (1 << (no_bits - 1)) - 1;
2134     int32_t min = -(1 << (no_bits - 1));
2135     int32_t as_signed = static_cast<int32_t>(bits);
2136     return as_signed > max || as_signed < min;
2137   }
2138
2139   // Detects overflow of an NO_BITS integer stored in a uint32_t when it
2140   // fits in the given number of bits as either a signed or unsigned value.
2141   // For example, has_signed_unsigned_overflow<8> would check
2142   // -128 <= bits <= 255
2143   template<int no_bits>
2144   static inline bool
2145   has_signed_unsigned_overflow(uint32_t bits)
2146   {
2147     gold_assert(no_bits >= 2 && no_bits <= 32);
2148     if (no_bits == 32)
2149       return false;
2150     int32_t max = static_cast<int32_t>((1U << no_bits) - 1);
2151     int32_t min = -(1 << (no_bits - 1));
2152     int32_t as_signed = static_cast<int32_t>(bits);
2153     return as_signed > max || as_signed < min;
2154   }
2155
2156   // Select bits from A and B using bits in MASK.  For each n in [0..31],
2157   // the n-th bit in the result is chosen from the n-th bits of A and B.
2158   // A zero selects A and a one selects B.
2159   static inline uint32_t
2160   bit_select(uint32_t a, uint32_t b, uint32_t mask)
2161   { return (a & ~mask) | (b & mask); }
2162 };
2163
2164 template<bool big_endian>
2165 class Target_arm : public Sized_target<32, big_endian>
2166 {
2167  public:
2168   typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, big_endian>
2169     Reloc_section;
2170
2171   // When were are relocating a stub, we pass this as the relocation number.
2172   static const size_t fake_relnum_for_stubs = static_cast<size_t>(-1);
2173
2174   Target_arm()
2175     : Sized_target<32, big_endian>(&arm_info),
2176       got_(NULL), plt_(NULL), got_plt_(NULL), rel_dyn_(NULL),
2177       copy_relocs_(elfcpp::R_ARM_COPY), dynbss_(NULL), 
2178       got_mod_index_offset_(-1U), tls_base_symbol_defined_(false),
2179       stub_tables_(), stub_factory_(Stub_factory::get_instance()),
2180       should_force_pic_veneer_(false),
2181       arm_input_section_map_(), attributes_section_data_(NULL),
2182       fix_cortex_a8_(false), cortex_a8_relocs_info_()
2183   { }
2184
2185   // Whether we force PCI branch veneers.
2186   bool
2187   should_force_pic_veneer() const
2188   { return this->should_force_pic_veneer_; }
2189
2190   // Set PIC veneer flag.
2191   void
2192   set_should_force_pic_veneer(bool value)
2193   { this->should_force_pic_veneer_ = value; }
2194   
2195   // Whether we use THUMB-2 instructions.
2196   bool
2197   using_thumb2() const
2198   {
2199     Object_attribute* attr =
2200       this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2201     int arch = attr->int_value();
2202     return arch == elfcpp::TAG_CPU_ARCH_V6T2 || arch >= elfcpp::TAG_CPU_ARCH_V7;
2203   }
2204
2205   // Whether we use THUMB/THUMB-2 instructions only.
2206   bool
2207   using_thumb_only() const
2208   {
2209     Object_attribute* attr =
2210       this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2211
2212     if (attr->int_value() == elfcpp::TAG_CPU_ARCH_V6_M
2213         || attr->int_value() == elfcpp::TAG_CPU_ARCH_V6S_M)
2214       return true;
2215     if (attr->int_value() != elfcpp::TAG_CPU_ARCH_V7
2216         && attr->int_value() != elfcpp::TAG_CPU_ARCH_V7E_M)
2217       return false;
2218     attr = this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch_profile);
2219     return attr->int_value() == 'M';
2220   }
2221
2222   // Whether we have an NOP instruction.  If not, use mov r0, r0 instead.
2223   bool
2224   may_use_arm_nop() const
2225   {
2226     Object_attribute* attr =
2227       this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2228     int arch = attr->int_value();
2229     return (arch == elfcpp::TAG_CPU_ARCH_V6T2
2230             || arch == elfcpp::TAG_CPU_ARCH_V6K
2231             || arch == elfcpp::TAG_CPU_ARCH_V7
2232             || arch == elfcpp::TAG_CPU_ARCH_V7E_M);
2233   }
2234
2235   // Whether we have THUMB-2 NOP.W instruction.
2236   bool
2237   may_use_thumb2_nop() const
2238   {
2239     Object_attribute* attr =
2240       this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2241     int arch = attr->int_value();
2242     return (arch == elfcpp::TAG_CPU_ARCH_V6T2
2243             || arch == elfcpp::TAG_CPU_ARCH_V7
2244             || arch == elfcpp::TAG_CPU_ARCH_V7E_M);
2245   }
2246
2247   // Whether we have v4T interworking instructions available.
2248   bool
2249   may_use_v4t_interworking() const
2250   {
2251     Object_attribute* attr =
2252       this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2253     int arch = attr->int_value();
2254     return (arch != elfcpp::TAG_CPU_ARCH_PRE_V4
2255             && arch != elfcpp::TAG_CPU_ARCH_V4);
2256   }
2257   
2258   // Whether we have v5T interworking instructions available.
2259   bool
2260   may_use_v5t_interworking() const
2261   {
2262     Object_attribute* attr =
2263       this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2264     int arch = attr->int_value();
2265     return (arch != elfcpp::TAG_CPU_ARCH_PRE_V4
2266             && arch != elfcpp::TAG_CPU_ARCH_V4
2267             && arch != elfcpp::TAG_CPU_ARCH_V4T);
2268   }
2269   
2270   // Process the relocations to determine unreferenced sections for 
2271   // garbage collection.
2272   void
2273   gc_process_relocs(Symbol_table* symtab,
2274                     Layout* layout,
2275                     Sized_relobj_file<32, big_endian>* object,
2276                     unsigned int data_shndx,
2277                     unsigned int sh_type,
2278                     const unsigned char* prelocs,
2279                     size_t reloc_count,
2280                     Output_section* output_section,
2281                     bool needs_special_offset_handling,
2282                     size_t local_symbol_count,
2283                     const unsigned char* plocal_symbols);
2284
2285   // Scan the relocations to look for symbol adjustments.
2286   void
2287   scan_relocs(Symbol_table* symtab,
2288               Layout* layout,
2289               Sized_relobj_file<32, big_endian>* object,
2290               unsigned int data_shndx,
2291               unsigned int sh_type,
2292               const unsigned char* prelocs,
2293               size_t reloc_count,
2294               Output_section* output_section,
2295               bool needs_special_offset_handling,
2296               size_t local_symbol_count,
2297               const unsigned char* plocal_symbols);
2298
2299   // Finalize the sections.
2300   void
2301   do_finalize_sections(Layout*, const Input_objects*, Symbol_table*);
2302
2303   // Return the value to use for a dynamic symbol which requires special
2304   // treatment.
2305   uint64_t
2306   do_dynsym_value(const Symbol*) const;
2307
2308   // Relocate a section.
2309   void
2310   relocate_section(const Relocate_info<32, big_endian>*,
2311                    unsigned int sh_type,
2312                    const unsigned char* prelocs,
2313                    size_t reloc_count,
2314                    Output_section* output_section,
2315                    bool needs_special_offset_handling,
2316                    unsigned char* view,
2317                    Arm_address view_address,
2318                    section_size_type view_size,
2319                    const Reloc_symbol_changes*);
2320
2321   // Scan the relocs during a relocatable link.
2322   void
2323   scan_relocatable_relocs(Symbol_table* symtab,
2324                           Layout* layout,
2325                           Sized_relobj_file<32, big_endian>* object,
2326                           unsigned int data_shndx,
2327                           unsigned int sh_type,
2328                           const unsigned char* prelocs,
2329                           size_t reloc_count,
2330                           Output_section* output_section,
2331                           bool needs_special_offset_handling,
2332                           size_t local_symbol_count,
2333                           const unsigned char* plocal_symbols,
2334                           Relocatable_relocs*);
2335
2336   // Relocate a section during a relocatable link.
2337   void
2338   relocate_for_relocatable(const Relocate_info<32, big_endian>*,
2339                            unsigned int sh_type,
2340                            const unsigned char* prelocs,
2341                            size_t reloc_count,
2342                            Output_section* output_section,
2343                            off_t offset_in_output_section,
2344                            const Relocatable_relocs*,
2345                            unsigned char* view,
2346                            Arm_address view_address,
2347                            section_size_type view_size,
2348                            unsigned char* reloc_view,
2349                            section_size_type reloc_view_size);
2350
2351   // Perform target-specific processing in a relocatable link.  This is
2352   // only used if we use the relocation strategy RELOC_SPECIAL.
2353   void
2354   relocate_special_relocatable(const Relocate_info<32, big_endian>* relinfo,
2355                                unsigned int sh_type,
2356                                const unsigned char* preloc_in,
2357                                size_t relnum,
2358                                Output_section* output_section,
2359                                off_t offset_in_output_section,
2360                                unsigned char* view,
2361                                typename elfcpp::Elf_types<32>::Elf_Addr
2362                                  view_address,
2363                                section_size_type view_size,
2364                                unsigned char* preloc_out);
2365  
2366   // Return whether SYM is defined by the ABI.
2367   bool
2368   do_is_defined_by_abi(Symbol* sym) const
2369   { return strcmp(sym->name(), "__tls_get_addr") == 0; }
2370
2371   // Return whether there is a GOT section.
2372   bool
2373   has_got_section() const
2374   { return this->got_ != NULL; }
2375
2376   // Return the size of the GOT section.
2377   section_size_type
2378   got_size() const
2379   {
2380     gold_assert(this->got_ != NULL);
2381     return this->got_->data_size();
2382   }
2383
2384   // Return the number of entries in the GOT.
2385   unsigned int
2386   got_entry_count() const
2387   {
2388     if (!this->has_got_section())
2389       return 0;
2390     return this->got_size() / 4;
2391   }
2392
2393   // Return the number of entries in the PLT.
2394   unsigned int
2395   plt_entry_count() const;
2396
2397   // Return the offset of the first non-reserved PLT entry.
2398   unsigned int
2399   first_plt_entry_offset() const;
2400
2401   // Return the size of each PLT entry.
2402   unsigned int
2403   plt_entry_size() const;
2404
2405   // Map platform-specific reloc types
2406   static unsigned int
2407   get_real_reloc_type(unsigned int r_type);
2408
2409   //
2410   // Methods to support stub-generations.
2411   //
2412   
2413   // Return the stub factory
2414   const Stub_factory&
2415   stub_factory() const
2416   { return this->stub_factory_; }
2417
2418   // Make a new Arm_input_section object.
2419   Arm_input_section<big_endian>*
2420   new_arm_input_section(Relobj*, unsigned int);
2421
2422   // Find the Arm_input_section object corresponding to the SHNDX-th input
2423   // section of RELOBJ.
2424   Arm_input_section<big_endian>*
2425   find_arm_input_section(Relobj* relobj, unsigned int shndx) const;
2426
2427   // Make a new Stub_table
2428   Stub_table<big_endian>*
2429   new_stub_table(Arm_input_section<big_endian>*);
2430
2431   // Scan a section for stub generation.
2432   void
2433   scan_section_for_stubs(const Relocate_info<32, big_endian>*, unsigned int,
2434                          const unsigned char*, size_t, Output_section*,
2435                          bool, const unsigned char*, Arm_address,
2436                          section_size_type);
2437
2438   // Relocate a stub. 
2439   void
2440   relocate_stub(Stub*, const Relocate_info<32, big_endian>*,
2441                 Output_section*, unsigned char*, Arm_address,
2442                 section_size_type);
2443  
2444   // Get the default ARM target.
2445   static Target_arm<big_endian>*
2446   default_target()
2447   {
2448     gold_assert(parameters->target().machine_code() == elfcpp::EM_ARM
2449                 && parameters->target().is_big_endian() == big_endian);
2450     return static_cast<Target_arm<big_endian>*>(
2451              parameters->sized_target<32, big_endian>());
2452   }
2453
2454   // Whether NAME belongs to a mapping symbol.
2455   static bool
2456   is_mapping_symbol_name(const char* name)
2457   {
2458     return (name
2459             && name[0] == '$'
2460             && (name[1] == 'a' || name[1] == 't' || name[1] == 'd')
2461             && (name[2] == '\0' || name[2] == '.'));
2462   }
2463
2464   // Whether we work around the Cortex-A8 erratum.
2465   bool
2466   fix_cortex_a8() const
2467   { return this->fix_cortex_a8_; }
2468
2469   // Whether we merge exidx entries in debuginfo.
2470   bool
2471   merge_exidx_entries() const
2472   { return parameters->options().merge_exidx_entries(); }
2473
2474   // Whether we fix R_ARM_V4BX relocation.
2475   // 0 - do not fix
2476   // 1 - replace with MOV instruction (armv4 target)
2477   // 2 - make interworking veneer (>= armv4t targets only)
2478   General_options::Fix_v4bx
2479   fix_v4bx() const
2480   { return parameters->options().fix_v4bx(); }
2481
2482   // Scan a span of THUMB code section for Cortex-A8 erratum.
2483   void
2484   scan_span_for_cortex_a8_erratum(Arm_relobj<big_endian>*, unsigned int,
2485                                   section_size_type, section_size_type,
2486                                   const unsigned char*, Arm_address);
2487
2488   // Apply Cortex-A8 workaround to a branch.
2489   void
2490   apply_cortex_a8_workaround(const Cortex_a8_stub*, Arm_address,
2491                              unsigned char*, Arm_address);
2492
2493  protected:
2494   // Make an ELF object.
2495   Object*
2496   do_make_elf_object(const std::string&, Input_file*, off_t,
2497                      const elfcpp::Ehdr<32, big_endian>& ehdr);
2498
2499   Object*
2500   do_make_elf_object(const std::string&, Input_file*, off_t,
2501                      const elfcpp::Ehdr<32, !big_endian>&)
2502   { gold_unreachable(); }
2503
2504   Object*
2505   do_make_elf_object(const std::string&, Input_file*, off_t,
2506                       const elfcpp::Ehdr<64, false>&)
2507   { gold_unreachable(); }
2508
2509   Object*
2510   do_make_elf_object(const std::string&, Input_file*, off_t,
2511                      const elfcpp::Ehdr<64, true>&)
2512   { gold_unreachable(); }
2513
2514   // Make an output section.
2515   Output_section*
2516   do_make_output_section(const char* name, elfcpp::Elf_Word type,
2517                          elfcpp::Elf_Xword flags)
2518   { return new Arm_output_section<big_endian>(name, type, flags); }
2519
2520   void
2521   do_adjust_elf_header(unsigned char* view, int len) const;
2522
2523   // We only need to generate stubs, and hence perform relaxation if we are
2524   // not doing relocatable linking.
2525   bool
2526   do_may_relax() const
2527   { return !parameters->options().relocatable(); }
2528
2529   bool
2530   do_relax(int, const Input_objects*, Symbol_table*, Layout*, const Task*);
2531
2532   // Determine whether an object attribute tag takes an integer, a
2533   // string or both.
2534   int
2535   do_attribute_arg_type(int tag) const;
2536
2537   // Reorder tags during output.
2538   int
2539   do_attributes_order(int num) const;
2540
2541   // This is called when the target is selected as the default.
2542   void
2543   do_select_as_default_target()
2544   {
2545     // No locking is required since there should only be one default target.
2546     // We cannot have both the big-endian and little-endian ARM targets
2547     // as the default.
2548     gold_assert(arm_reloc_property_table == NULL);
2549     arm_reloc_property_table = new Arm_reloc_property_table();
2550   }
2551
2552   // Virtual function which is set to return true by a target if
2553   // it can use relocation types to determine if a function's
2554   // pointer is taken.
2555   virtual bool
2556   do_can_check_for_function_pointers() const
2557   { return true; }
2558
2559   // Whether a section called SECTION_NAME may have function pointers to
2560   // sections not eligible for safe ICF folding.
2561   virtual bool
2562   do_section_may_have_icf_unsafe_pointers(const char* section_name) const
2563   {
2564     return (!is_prefix_of(".ARM.exidx", section_name)
2565             && !is_prefix_of(".ARM.extab", section_name)
2566             && Target::do_section_may_have_icf_unsafe_pointers(section_name));
2567   }
2568   
2569  private:
2570   // The class which scans relocations.
2571   class Scan
2572   {
2573    public:
2574     Scan()
2575       : issued_non_pic_error_(false)
2576     { }
2577
2578     static inline int
2579     get_reference_flags(unsigned int r_type);
2580
2581     inline void
2582     local(Symbol_table* symtab, Layout* layout, Target_arm* target,
2583           Sized_relobj_file<32, big_endian>* object,
2584           unsigned int data_shndx,
2585           Output_section* output_section,
2586           const elfcpp::Rel<32, big_endian>& reloc, unsigned int r_type,
2587           const elfcpp::Sym<32, big_endian>& lsym);
2588
2589     inline void
2590     global(Symbol_table* symtab, Layout* layout, Target_arm* target,
2591            Sized_relobj_file<32, big_endian>* object,
2592            unsigned int data_shndx,
2593            Output_section* output_section,
2594            const elfcpp::Rel<32, big_endian>& reloc, unsigned int r_type,
2595            Symbol* gsym);
2596
2597     inline bool
2598     local_reloc_may_be_function_pointer(Symbol_table* , Layout* , Target_arm* ,
2599                                         Sized_relobj_file<32, big_endian>* ,
2600                                         unsigned int ,
2601                                         Output_section* ,
2602                                         const elfcpp::Rel<32, big_endian>& ,
2603                                         unsigned int ,
2604                                         const elfcpp::Sym<32, big_endian>&);
2605
2606     inline bool
2607     global_reloc_may_be_function_pointer(Symbol_table* , Layout* , Target_arm* ,
2608                                          Sized_relobj_file<32, big_endian>* ,
2609                                          unsigned int ,
2610                                          Output_section* ,
2611                                          const elfcpp::Rel<32, big_endian>& ,
2612                                          unsigned int , Symbol*);
2613
2614    private:
2615     static void
2616     unsupported_reloc_local(Sized_relobj_file<32, big_endian>*,
2617                             unsigned int r_type);
2618
2619     static void
2620     unsupported_reloc_global(Sized_relobj_file<32, big_endian>*,
2621                              unsigned int r_type, Symbol*);
2622
2623     void
2624     check_non_pic(Relobj*, unsigned int r_type);
2625
2626     // Almost identical to Symbol::needs_plt_entry except that it also
2627     // handles STT_ARM_TFUNC.
2628     static bool
2629     symbol_needs_plt_entry(const Symbol* sym)
2630     {
2631       // An undefined symbol from an executable does not need a PLT entry.
2632       if (sym->is_undefined() && !parameters->options().shared())
2633         return false;
2634
2635       return (!parameters->doing_static_link()
2636               && (sym->type() == elfcpp::STT_FUNC
2637                   || sym->type() == elfcpp::STT_ARM_TFUNC)
2638               && (sym->is_from_dynobj()
2639                   || sym->is_undefined()
2640                   || sym->is_preemptible()));
2641     }
2642
2643     inline bool
2644     possible_function_pointer_reloc(unsigned int r_type);
2645
2646     // Whether we have issued an error about a non-PIC compilation.
2647     bool issued_non_pic_error_;
2648   };
2649
2650   // The class which implements relocation.
2651   class Relocate
2652   {
2653    public:
2654     Relocate()
2655     { }
2656
2657     ~Relocate()
2658     { }
2659
2660     // Return whether the static relocation needs to be applied.
2661     inline bool
2662     should_apply_static_reloc(const Sized_symbol<32>* gsym,
2663                               unsigned int r_type,
2664                               bool is_32bit,
2665                               Output_section* output_section);
2666
2667     // Do a relocation.  Return false if the caller should not issue
2668     // any warnings about this relocation.
2669     inline bool
2670     relocate(const Relocate_info<32, big_endian>*, Target_arm*,
2671              Output_section*,  size_t relnum,
2672              const elfcpp::Rel<32, big_endian>&,
2673              unsigned int r_type, const Sized_symbol<32>*,
2674              const Symbol_value<32>*,
2675              unsigned char*, Arm_address,
2676              section_size_type);
2677
2678     // Return whether we want to pass flag NON_PIC_REF for this
2679     // reloc.  This means the relocation type accesses a symbol not via
2680     // GOT or PLT.
2681     static inline bool
2682     reloc_is_non_pic(unsigned int r_type)
2683     {
2684       switch (r_type)
2685         {
2686         // These relocation types reference GOT or PLT entries explicitly.
2687         case elfcpp::R_ARM_GOT_BREL:
2688         case elfcpp::R_ARM_GOT_ABS:
2689         case elfcpp::R_ARM_GOT_PREL:
2690         case elfcpp::R_ARM_GOT_BREL12:
2691         case elfcpp::R_ARM_PLT32_ABS:
2692         case elfcpp::R_ARM_TLS_GD32:
2693         case elfcpp::R_ARM_TLS_LDM32:
2694         case elfcpp::R_ARM_TLS_IE32:
2695         case elfcpp::R_ARM_TLS_IE12GP:
2696
2697         // These relocate types may use PLT entries.
2698         case elfcpp::R_ARM_CALL:
2699         case elfcpp::R_ARM_THM_CALL:
2700         case elfcpp::R_ARM_JUMP24:
2701         case elfcpp::R_ARM_THM_JUMP24:
2702         case elfcpp::R_ARM_THM_JUMP19:
2703         case elfcpp::R_ARM_PLT32:
2704         case elfcpp::R_ARM_THM_XPC22:
2705         case elfcpp::R_ARM_PREL31:
2706         case elfcpp::R_ARM_SBREL31:
2707           return false;
2708
2709         default:
2710           return true;
2711         }
2712     }
2713
2714    private:
2715     // Do a TLS relocation.
2716     inline typename Arm_relocate_functions<big_endian>::Status
2717     relocate_tls(const Relocate_info<32, big_endian>*, Target_arm<big_endian>*,
2718                  size_t, const elfcpp::Rel<32, big_endian>&, unsigned int,
2719                  const Sized_symbol<32>*, const Symbol_value<32>*,
2720                  unsigned char*, elfcpp::Elf_types<32>::Elf_Addr,
2721                  section_size_type);
2722
2723   };
2724
2725   // A class which returns the size required for a relocation type,
2726   // used while scanning relocs during a relocatable link.
2727   class Relocatable_size_for_reloc
2728   {
2729    public:
2730     unsigned int
2731     get_size_for_reloc(unsigned int, Relobj*);
2732   };
2733
2734   // Adjust TLS relocation type based on the options and whether this
2735   // is a local symbol.
2736   static tls::Tls_optimization
2737   optimize_tls_reloc(bool is_final, int r_type);
2738
2739   // Get the GOT section, creating it if necessary.
2740   Arm_output_data_got<big_endian>*
2741   got_section(Symbol_table*, Layout*);
2742
2743   // Get the GOT PLT section.
2744   Output_data_space*
2745   got_plt_section() const
2746   {
2747     gold_assert(this->got_plt_ != NULL);
2748     return this->got_plt_;
2749   }
2750
2751   // Create a PLT entry for a global symbol.
2752   void
2753   make_plt_entry(Symbol_table*, Layout*, Symbol*);
2754
2755   // Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
2756   void
2757   define_tls_base_symbol(Symbol_table*, Layout*);
2758
2759   // Create a GOT entry for the TLS module index.
2760   unsigned int
2761   got_mod_index_entry(Symbol_table* symtab, Layout* layout,
2762                       Sized_relobj_file<32, big_endian>* object);
2763
2764   // Get the PLT section.
2765   const Output_data_plt_arm<big_endian>*
2766   plt_section() const
2767   {
2768     gold_assert(this->plt_ != NULL);
2769     return this->plt_;
2770   }
2771
2772   // Get the dynamic reloc section, creating it if necessary.
2773   Reloc_section*
2774   rel_dyn_section(Layout*);
2775
2776   // Get the section to use for TLS_DESC relocations.
2777   Reloc_section*
2778   rel_tls_desc_section(Layout*) const;
2779
2780   // Return true if the symbol may need a COPY relocation.
2781   // References from an executable object to non-function symbols
2782   // defined in a dynamic object may need a COPY relocation.
2783   bool
2784   may_need_copy_reloc(Symbol* gsym)
2785   {
2786     return (gsym->type() != elfcpp::STT_ARM_TFUNC
2787             && gsym->may_need_copy_reloc());
2788   }
2789
2790   // Add a potential copy relocation.
2791   void
2792   copy_reloc(Symbol_table* symtab, Layout* layout,
2793              Sized_relobj_file<32, big_endian>* object,
2794              unsigned int shndx, Output_section* output_section,
2795              Symbol* sym, const elfcpp::Rel<32, big_endian>& reloc)
2796   {
2797     this->copy_relocs_.copy_reloc(symtab, layout,
2798                                   symtab->get_sized_symbol<32>(sym),
2799                                   object, shndx, output_section, reloc,
2800                                   this->rel_dyn_section(layout));
2801   }
2802
2803   // Whether two EABI versions are compatible.
2804   static bool
2805   are_eabi_versions_compatible(elfcpp::Elf_Word v1, elfcpp::Elf_Word v2);
2806
2807   // Merge processor-specific flags from input object and those in the ELF
2808   // header of the output.
2809   void
2810   merge_processor_specific_flags(const std::string&, elfcpp::Elf_Word);
2811
2812   // Get the secondary compatible architecture.
2813   static int
2814   get_secondary_compatible_arch(const Attributes_section_data*);
2815
2816   // Set the secondary compatible architecture.
2817   static void
2818   set_secondary_compatible_arch(Attributes_section_data*, int);
2819
2820   static int
2821   tag_cpu_arch_combine(const char*, int, int*, int, int);
2822
2823   // Helper to print AEABI enum tag value.
2824   static std::string
2825   aeabi_enum_name(unsigned int);
2826
2827   // Return string value for TAG_CPU_name.
2828   static std::string
2829   tag_cpu_name_value(unsigned int);
2830
2831   // Merge object attributes from input object and those in the output.
2832   void
2833   merge_object_attributes(const char*, const Attributes_section_data*);
2834
2835   // Helper to get an AEABI object attribute
2836   Object_attribute*
2837   get_aeabi_object_attribute(int tag) const
2838   {
2839     Attributes_section_data* pasd = this->attributes_section_data_;
2840     gold_assert(pasd != NULL);
2841     Object_attribute* attr =
2842       pasd->get_attribute(Object_attribute::OBJ_ATTR_PROC, tag);
2843     gold_assert(attr != NULL);
2844     return attr;
2845   }
2846
2847   //
2848   // Methods to support stub-generations.
2849   //
2850
2851   // Group input sections for stub generation.
2852   void
2853   group_sections(Layout*, section_size_type, bool, const Task*);
2854
2855   // Scan a relocation for stub generation.
2856   void
2857   scan_reloc_for_stub(const Relocate_info<32, big_endian>*, unsigned int,
2858                       const Sized_symbol<32>*, unsigned int,
2859                       const Symbol_value<32>*,
2860                       elfcpp::Elf_types<32>::Elf_Swxword, Arm_address);
2861
2862   // Scan a relocation section for stub.
2863   template<int sh_type>
2864   void
2865   scan_reloc_section_for_stubs(
2866       const Relocate_info<32, big_endian>* relinfo,
2867       const unsigned char* prelocs,
2868       size_t reloc_count,
2869       Output_section* output_section,
2870       bool needs_special_offset_handling,
2871       const unsigned char* view,
2872       elfcpp::Elf_types<32>::Elf_Addr view_address,
2873       section_size_type);
2874
2875   // Fix .ARM.exidx section coverage.
2876   void
2877   fix_exidx_coverage(Layout*, const Input_objects*,
2878                      Arm_output_section<big_endian>*, Symbol_table*,
2879                      const Task*);
2880
2881   // Functors for STL set.
2882   struct output_section_address_less_than
2883   {
2884     bool
2885     operator()(const Output_section* s1, const Output_section* s2) const
2886     { return s1->address() < s2->address(); }
2887   };
2888
2889   // Information about this specific target which we pass to the
2890   // general Target structure.
2891   static const Target::Target_info arm_info;
2892
2893   // The types of GOT entries needed for this platform.
2894   // These values are exposed to the ABI in an incremental link.
2895   // Do not renumber existing values without changing the version
2896   // number of the .gnu_incremental_inputs section.
2897   enum Got_type
2898   {
2899     GOT_TYPE_STANDARD = 0,      // GOT entry for a regular symbol
2900     GOT_TYPE_TLS_NOFFSET = 1,   // GOT entry for negative TLS offset
2901     GOT_TYPE_TLS_OFFSET = 2,    // GOT entry for positive TLS offset
2902     GOT_TYPE_TLS_PAIR = 3,      // GOT entry for TLS module/offset pair
2903     GOT_TYPE_TLS_DESC = 4       // GOT entry for TLS_DESC pair
2904   };
2905
2906   typedef typename std::vector<Stub_table<big_endian>*> Stub_table_list;
2907
2908   // Map input section to Arm_input_section.
2909   typedef Unordered_map<Section_id,
2910                         Arm_input_section<big_endian>*,
2911                         Section_id_hash>
2912           Arm_input_section_map;
2913     
2914   // Map output addresses to relocs for Cortex-A8 erratum.
2915   typedef Unordered_map<Arm_address, const Cortex_a8_reloc*>
2916           Cortex_a8_relocs_info;
2917
2918   // The GOT section.
2919   Arm_output_data_got<big_endian>* got_;
2920   // The PLT section.
2921   Output_data_plt_arm<big_endian>* plt_;
2922   // The GOT PLT section.
2923   Output_data_space* got_plt_;
2924   // The dynamic reloc section.
2925   Reloc_section* rel_dyn_;
2926   // Relocs saved to avoid a COPY reloc.
2927   Copy_relocs<elfcpp::SHT_REL, 32, big_endian> copy_relocs_;
2928   // Space for variables copied with a COPY reloc.
2929   Output_data_space* dynbss_;
2930   // Offset of the GOT entry for the TLS module index.
2931   unsigned int got_mod_index_offset_;
2932   // True if the _TLS_MODULE_BASE_ symbol has been defined.
2933   bool tls_base_symbol_defined_;
2934   // Vector of Stub_tables created.
2935   Stub_table_list stub_tables_;
2936   // Stub factory.
2937   const Stub_factory &stub_factory_;
2938   // Whether we force PIC branch veneers.
2939   bool should_force_pic_veneer_;
2940   // Map for locating Arm_input_sections.
2941   Arm_input_section_map arm_input_section_map_;
2942   // Attributes section data in output.
2943   Attributes_section_data* attributes_section_data_;
2944   // Whether we want to fix code for Cortex-A8 erratum.
2945   bool fix_cortex_a8_;
2946   // Map addresses to relocs for Cortex-A8 erratum.
2947   Cortex_a8_relocs_info cortex_a8_relocs_info_;
2948 };
2949
2950 template<bool big_endian>
2951 const Target::Target_info Target_arm<big_endian>::arm_info =
2952 {
2953   32,                   // size
2954   big_endian,           // is_big_endian
2955   elfcpp::EM_ARM,       // machine_code
2956   false,                // has_make_symbol
2957   false,                // has_resolve
2958   false,                // has_code_fill
2959   true,                 // is_default_stack_executable
2960   false,                // can_icf_inline_merge_sections
2961   '\0',                 // wrap_char
2962   "/usr/lib/libc.so.1", // dynamic_linker
2963   0x8000,               // default_text_segment_address
2964   0x1000,               // abi_pagesize (overridable by -z max-page-size)
2965   0x1000,               // common_pagesize (overridable by -z common-page-size)
2966   elfcpp::SHN_UNDEF,    // small_common_shndx
2967   elfcpp::SHN_UNDEF,    // large_common_shndx
2968   0,                    // small_common_section_flags
2969   0,                    // large_common_section_flags
2970   ".ARM.attributes",    // attributes_section
2971   "aeabi"               // attributes_vendor
2972 };
2973
2974 // Arm relocate functions class
2975 //
2976
2977 template<bool big_endian>
2978 class Arm_relocate_functions : public Relocate_functions<32, big_endian>
2979 {
2980  public:
2981   typedef enum
2982   {
2983     STATUS_OKAY,        // No error during relocation.
2984     STATUS_OVERFLOW,    // Relocation overflow.
2985     STATUS_BAD_RELOC    // Relocation cannot be applied.
2986   } Status;
2987
2988  private:
2989   typedef Relocate_functions<32, big_endian> Base;
2990   typedef Arm_relocate_functions<big_endian> This;
2991
2992   // Encoding of imm16 argument for movt and movw ARM instructions
2993   // from ARM ARM:
2994   //     
2995   //     imm16 := imm4 | imm12
2996   //
2997   //  f e d c b a 9 8 7 6 5 4 3 2 1 0 f e d c b a 9 8 7 6 5 4 3 2 1 0 
2998   // +-------+---------------+-------+-------+-----------------------+
2999   // |       |               |imm4   |       |imm12                  |
3000   // +-------+---------------+-------+-------+-----------------------+
3001
3002   // Extract the relocation addend from VAL based on the ARM
3003   // instruction encoding described above.
3004   static inline typename elfcpp::Swap<32, big_endian>::Valtype
3005   extract_arm_movw_movt_addend(
3006       typename elfcpp::Swap<32, big_endian>::Valtype val)
3007   {
3008     // According to the Elf ABI for ARM Architecture the immediate
3009     // field is sign-extended to form the addend.
3010     return utils::sign_extend<16>(((val >> 4) & 0xf000) | (val & 0xfff));
3011   }
3012
3013   // Insert X into VAL based on the ARM instruction encoding described
3014   // above.
3015   static inline typename elfcpp::Swap<32, big_endian>::Valtype
3016   insert_val_arm_movw_movt(
3017       typename elfcpp::Swap<32, big_endian>::Valtype val,
3018       typename elfcpp::Swap<32, big_endian>::Valtype x)
3019   {
3020     val &= 0xfff0f000;
3021     val |= x & 0x0fff;
3022     val |= (x & 0xf000) << 4;
3023     return val;
3024   }
3025
3026   // Encoding of imm16 argument for movt and movw Thumb2 instructions
3027   // from ARM ARM:
3028   //     
3029   //     imm16 := imm4 | i | imm3 | imm8
3030   //
3031   //  f e d c b a 9 8 7 6 5 4 3 2 1 0  f e d c b a 9 8 7 6 5 4 3 2 1 0 
3032   // +---------+-+-----------+-------++-+-----+-------+---------------+
3033   // |         |i|           |imm4   || |imm3 |       |imm8           |
3034   // +---------+-+-----------+-------++-+-----+-------+---------------+
3035
3036   // Extract the relocation addend from VAL based on the Thumb2
3037   // instruction encoding described above.
3038   static inline typename elfcpp::Swap<32, big_endian>::Valtype
3039   extract_thumb_movw_movt_addend(
3040       typename elfcpp::Swap<32, big_endian>::Valtype val)
3041   {
3042     // According to the Elf ABI for ARM Architecture the immediate
3043     // field is sign-extended to form the addend.
3044     return utils::sign_extend<16>(((val >> 4) & 0xf000)
3045                                   | ((val >> 15) & 0x0800)
3046                                   | ((val >> 4) & 0x0700)
3047                                   | (val & 0x00ff));
3048   }
3049
3050   // Insert X into VAL based on the Thumb2 instruction encoding
3051   // described above.
3052   static inline typename elfcpp::Swap<32, big_endian>::Valtype
3053   insert_val_thumb_movw_movt(
3054       typename elfcpp::Swap<32, big_endian>::Valtype val,
3055       typename elfcpp::Swap<32, big_endian>::Valtype x)
3056   {
3057     val &= 0xfbf08f00;
3058     val |= (x & 0xf000) << 4;
3059     val |= (x & 0x0800) << 15;
3060     val |= (x & 0x0700) << 4;
3061     val |= (x & 0x00ff);
3062     return val;
3063   }
3064
3065   // Calculate the smallest constant Kn for the specified residual.
3066   // (see (AAELF 4.6.1.4 Static ARM relocations, Group Relocations, p.32)
3067   static uint32_t
3068   calc_grp_kn(typename elfcpp::Swap<32, big_endian>::Valtype residual)
3069   {
3070     int32_t msb;
3071
3072     if (residual == 0)
3073       return 0;
3074     // Determine the most significant bit in the residual and
3075     // align the resulting value to a 2-bit boundary.
3076     for (msb = 30; (msb >= 0) && !(residual & (3 << msb)); msb -= 2)
3077       ;
3078     // The desired shift is now (msb - 6), or zero, whichever
3079     // is the greater.
3080     return (((msb - 6) < 0) ? 0 : (msb - 6));
3081   }
3082
3083   // Calculate the final residual for the specified group index.
3084   // If the passed group index is less than zero, the method will return
3085   // the value of the specified residual without any change.
3086   // (see (AAELF 4.6.1.4 Static ARM relocations, Group Relocations, p.32)
3087   static typename elfcpp::Swap<32, big_endian>::Valtype
3088   calc_grp_residual(typename elfcpp::Swap<32, big_endian>::Valtype residual,
3089                     const int group)
3090   {
3091     for (int n = 0; n <= group; n++)
3092       {
3093         // Calculate which part of the value to mask.
3094         uint32_t shift = calc_grp_kn(residual);
3095         // Calculate the residual for the next time around.
3096         residual &= ~(residual & (0xff << shift));
3097       }
3098
3099     return residual;
3100   }
3101
3102   // Calculate the value of Gn for the specified group index.
3103   // We return it in the form of an encoded constant-and-rotation.
3104   // (see (AAELF 4.6.1.4 Static ARM relocations, Group Relocations, p.32)
3105   static typename elfcpp::Swap<32, big_endian>::Valtype
3106   calc_grp_gn(typename elfcpp::Swap<32, big_endian>::Valtype residual,
3107               const int group)
3108   {
3109     typename elfcpp::Swap<32, big_endian>::Valtype gn = 0;
3110     uint32_t shift = 0;
3111
3112     for (int n = 0; n <= group; n++)
3113       {
3114         // Calculate which part of the value to mask.
3115         shift = calc_grp_kn(residual);
3116         // Calculate Gn in 32-bit as well as encoded constant-and-rotation form.
3117         gn = residual & (0xff << shift);
3118         // Calculate the residual for the next time around.
3119         residual &= ~gn;
3120       }
3121     // Return Gn in the form of an encoded constant-and-rotation.
3122     return ((gn >> shift) | ((gn <= 0xff ? 0 : (32 - shift) / 2) << 8));
3123   }
3124
3125  public:
3126   // Handle ARM long branches.
3127   static typename This::Status
3128   arm_branch_common(unsigned int, const Relocate_info<32, big_endian>*,
3129                     unsigned char*, const Sized_symbol<32>*,
3130                     const Arm_relobj<big_endian>*, unsigned int,
3131                     const Symbol_value<32>*, Arm_address, Arm_address, bool);
3132
3133   // Handle THUMB long branches.
3134   static typename This::Status
3135   thumb_branch_common(unsigned int, const Relocate_info<32, big_endian>*,
3136                       unsigned char*, const Sized_symbol<32>*,
3137                       const Arm_relobj<big_endian>*, unsigned int,
3138                       const Symbol_value<32>*, Arm_address, Arm_address, bool);
3139
3140
3141   // Return the branch offset of a 32-bit THUMB branch.
3142   static inline int32_t
3143   thumb32_branch_offset(uint16_t upper_insn, uint16_t lower_insn)
3144   {
3145     // We use the Thumb-2 encoding (backwards compatible with Thumb-1)
3146     // involving the J1 and J2 bits.
3147     uint32_t s = (upper_insn & (1U << 10)) >> 10;
3148     uint32_t upper = upper_insn & 0x3ffU;
3149     uint32_t lower = lower_insn & 0x7ffU;
3150     uint32_t j1 = (lower_insn & (1U << 13)) >> 13;
3151     uint32_t j2 = (lower_insn & (1U << 11)) >> 11;
3152     uint32_t i1 = j1 ^ s ? 0 : 1;
3153     uint32_t i2 = j2 ^ s ? 0 : 1;
3154
3155     return utils::sign_extend<25>((s << 24) | (i1 << 23) | (i2 << 22)
3156                                   | (upper << 12) | (lower << 1));
3157   }
3158
3159   // Insert OFFSET to a 32-bit THUMB branch and return the upper instruction.
3160   // UPPER_INSN is the original upper instruction of the branch.  Caller is
3161   // responsible for overflow checking and BLX offset adjustment.
3162   static inline uint16_t
3163   thumb32_branch_upper(uint16_t upper_insn, int32_t offset)
3164   {
3165     uint32_t s = offset < 0 ? 1 : 0;
3166     uint32_t bits = static_cast<uint32_t>(offset);
3167     return (upper_insn & ~0x7ffU) | ((bits >> 12) & 0x3ffU) | (s << 10);
3168   }
3169
3170   // Insert OFFSET to a 32-bit THUMB branch and return the lower instruction.
3171   // LOWER_INSN is the original lower instruction of the branch.  Caller is
3172   // responsible for overflow checking and BLX offset adjustment.
3173   static inline uint16_t
3174   thumb32_branch_lower(uint16_t lower_insn, int32_t offset)
3175   {
3176     uint32_t s = offset < 0 ? 1 : 0;
3177     uint32_t bits = static_cast<uint32_t>(offset);
3178     return ((lower_insn & ~0x2fffU)
3179             | ((((bits >> 23) & 1) ^ !s) << 13)
3180             | ((((bits >> 22) & 1) ^ !s) << 11)
3181             | ((bits >> 1) & 0x7ffU));
3182   }
3183
3184   // Return the branch offset of a 32-bit THUMB conditional branch.
3185   static inline int32_t
3186   thumb32_cond_branch_offset(uint16_t upper_insn, uint16_t lower_insn)
3187   {
3188     uint32_t s = (upper_insn & 0x0400U) >> 10;
3189     uint32_t j1 = (lower_insn & 0x2000U) >> 13;
3190     uint32_t j2 = (lower_insn & 0x0800U) >> 11;
3191     uint32_t lower = (lower_insn & 0x07ffU);
3192     uint32_t upper = (s << 8) | (j2 << 7) | (j1 << 6) | (upper_insn & 0x003fU);
3193
3194     return utils::sign_extend<21>((upper << 12) | (lower << 1));
3195   }
3196
3197   // Insert OFFSET to a 32-bit THUMB conditional branch and return the upper
3198   // instruction.  UPPER_INSN is the original upper instruction of the branch.
3199   // Caller is responsible for overflow checking.
3200   static inline uint16_t
3201   thumb32_cond_branch_upper(uint16_t upper_insn, int32_t offset)
3202   {
3203     uint32_t s = offset < 0 ? 1 : 0;
3204     uint32_t bits = static_cast<uint32_t>(offset);
3205     return (upper_insn & 0xfbc0U) | (s << 10) | ((bits & 0x0003f000U) >> 12);
3206   }
3207
3208   // Insert OFFSET to a 32-bit THUMB conditional branch and return the lower
3209   // instruction.  LOWER_INSN is the original lower instruction of the branch.
3210   // The caller is responsible for overflow checking.
3211   static inline uint16_t
3212   thumb32_cond_branch_lower(uint16_t lower_insn, int32_t offset)
3213   {
3214     uint32_t bits = static_cast<uint32_t>(offset);
3215     uint32_t j2 = (bits & 0x00080000U) >> 19;
3216     uint32_t j1 = (bits & 0x00040000U) >> 18;
3217     uint32_t lo = (bits & 0x00000ffeU) >> 1;
3218
3219     return (lower_insn & 0xd000U) | (j1 << 13) | (j2 << 11) | lo;
3220   }
3221
3222   // R_ARM_ABS8: S + A
3223   static inline typename This::Status
3224   abs8(unsigned char* view,
3225        const Sized_relobj_file<32, big_endian>* object,
3226        const Symbol_value<32>* psymval)
3227   {
3228     typedef typename elfcpp::Swap<8, big_endian>::Valtype Valtype;
3229     Valtype* wv = reinterpret_cast<Valtype*>(view);
3230     Valtype val = elfcpp::Swap<8, big_endian>::readval(wv);
3231     int32_t addend = utils::sign_extend<8>(val);
3232     Arm_address x = psymval->value(object, addend);
3233     val = utils::bit_select(val, x, 0xffU);
3234     elfcpp::Swap<8, big_endian>::writeval(wv, val);
3235
3236     // R_ARM_ABS8 permits signed or unsigned results.
3237     int signed_x = static_cast<int32_t>(x);
3238     return ((signed_x < -128 || signed_x > 255)
3239             ? This::STATUS_OVERFLOW
3240             : This::STATUS_OKAY);
3241   }
3242
3243   // R_ARM_THM_ABS5: S + A
3244   static inline typename This::Status
3245   thm_abs5(unsigned char* view,
3246        const Sized_relobj_file<32, big_endian>* object,
3247        const Symbol_value<32>* psymval)
3248   {
3249     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3250     typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3251     Valtype* wv = reinterpret_cast<Valtype*>(view);
3252     Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3253     Reltype addend = (val & 0x7e0U) >> 6;
3254     Reltype x = psymval->value(object, addend);
3255     val = utils::bit_select(val, x << 6, 0x7e0U);
3256     elfcpp::Swap<16, big_endian>::writeval(wv, val);
3257
3258     // R_ARM_ABS16 permits signed or unsigned results.
3259     int signed_x = static_cast<int32_t>(x);
3260     return ((signed_x < -32768 || signed_x > 65535)
3261             ? This::STATUS_OVERFLOW
3262             : This::STATUS_OKAY);
3263   }
3264
3265   // R_ARM_ABS12: S + A
3266   static inline typename This::Status
3267   abs12(unsigned char* view,
3268         const Sized_relobj_file<32, big_endian>* object,
3269         const Symbol_value<32>* psymval)
3270   {
3271     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3272     typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3273     Valtype* wv = reinterpret_cast<Valtype*>(view);
3274     Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3275     Reltype addend = val & 0x0fffU;
3276     Reltype x = psymval->value(object, addend);
3277     val = utils::bit_select(val, x, 0x0fffU);
3278     elfcpp::Swap<32, big_endian>::writeval(wv, val);
3279     return (utils::has_overflow<12>(x)
3280             ? This::STATUS_OVERFLOW
3281             : This::STATUS_OKAY);
3282   }
3283
3284   // R_ARM_ABS16: S + A
3285   static inline typename This::Status
3286   abs16(unsigned char* view,
3287         const Sized_relobj_file<32, big_endian>* object,
3288         const Symbol_value<32>* psymval)
3289   {
3290     typedef typename elfcpp::Swap_unaligned<16, big_endian>::Valtype Valtype;
3291     typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3292     Valtype val = elfcpp::Swap_unaligned<16, big_endian>::readval(view);
3293     int32_t addend = utils::sign_extend<16>(val);
3294     Arm_address x = psymval->value(object, addend);
3295     val = utils::bit_select(val, x, 0xffffU);
3296     elfcpp::Swap_unaligned<16, big_endian>::writeval(view, val);
3297
3298     // R_ARM_ABS16 permits signed or unsigned results.
3299     int signed_x = static_cast<int32_t>(x);
3300     return ((signed_x < -32768 || signed_x > 65536)
3301             ? This::STATUS_OVERFLOW
3302             : This::STATUS_OKAY);
3303   }
3304
3305   // R_ARM_ABS32: (S + A) | T
3306   static inline typename This::Status
3307   abs32(unsigned char* view,
3308         const Sized_relobj_file<32, big_endian>* object,
3309         const Symbol_value<32>* psymval,
3310         Arm_address thumb_bit)
3311   {
3312     typedef typename elfcpp::Swap_unaligned<32, big_endian>::Valtype Valtype;
3313     Valtype addend = elfcpp::Swap_unaligned<32, big_endian>::readval(view);
3314     Valtype x = psymval->value(object, addend) | thumb_bit;
3315     elfcpp::Swap_unaligned<32, big_endian>::writeval(view, x);
3316     return This::STATUS_OKAY;
3317   }
3318
3319   // R_ARM_REL32: (S + A) | T - P
3320   static inline typename This::Status
3321   rel32(unsigned char* view,
3322         const Sized_relobj_file<32, big_endian>* object,
3323         const Symbol_value<32>* psymval,
3324         Arm_address address,
3325         Arm_address thumb_bit)
3326   {
3327     typedef typename elfcpp::Swap_unaligned<32, big_endian>::Valtype Valtype;
3328     Valtype addend = elfcpp::Swap_unaligned<32, big_endian>::readval(view);
3329     Valtype x = (psymval->value(object, addend) | thumb_bit) - address;
3330     elfcpp::Swap_unaligned<32, big_endian>::writeval(view, x);
3331     return This::STATUS_OKAY;
3332   }
3333
3334   // R_ARM_THM_JUMP24: (S + A) | T - P
3335   static typename This::Status
3336   thm_jump19(unsigned char* view, const Arm_relobj<big_endian>* object,
3337              const Symbol_value<32>* psymval, Arm_address address,
3338              Arm_address thumb_bit);
3339
3340   // R_ARM_THM_JUMP6: S + A â€“ P
3341   static inline typename This::Status
3342   thm_jump6(unsigned char* view,
3343             const Sized_relobj_file<32, big_endian>* object,
3344             const Symbol_value<32>* psymval,
3345             Arm_address address)
3346   {
3347     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3348     typedef typename elfcpp::Swap<16, big_endian>::Valtype Reltype;
3349     Valtype* wv = reinterpret_cast<Valtype*>(view);
3350     Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3351     // bit[9]:bit[7:3]:’0’ (mask: 0x02f8)
3352     Reltype addend = (((val & 0x0200) >> 3) | ((val & 0x00f8) >> 2));
3353     Reltype x = (psymval->value(object, addend) - address);
3354     val = (val & 0xfd07) | ((x  & 0x0040) << 3) | ((val & 0x003e) << 2);
3355     elfcpp::Swap<16, big_endian>::writeval(wv, val);
3356     // CZB does only forward jumps.
3357     return ((x > 0x007e)
3358             ? This::STATUS_OVERFLOW
3359             : This::STATUS_OKAY);
3360   }
3361
3362   // R_ARM_THM_JUMP8: S + A â€“ P
3363   static inline typename This::Status
3364   thm_jump8(unsigned char* view,
3365             const Sized_relobj_file<32, big_endian>* object,
3366             const Symbol_value<32>* psymval,
3367             Arm_address address)
3368   {
3369     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3370     Valtype* wv = reinterpret_cast<Valtype*>(view);
3371     Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3372     int32_t addend = utils::sign_extend<8>((val & 0x00ff) << 1);
3373     int32_t x = (psymval->value(object, addend) - address);
3374     elfcpp::Swap<16, big_endian>::writeval(wv, ((val & 0xff00)
3375                                                 | ((x & 0x01fe) >> 1)));
3376     // We do a 9-bit overflow check because x is right-shifted by 1 bit.
3377     return (utils::has_overflow<9>(x)
3378             ? This::STATUS_OVERFLOW
3379             : This::STATUS_OKAY);
3380   }
3381
3382   // R_ARM_THM_JUMP11: S + A â€“ P
3383   static inline typename This::Status
3384   thm_jump11(unsigned char* view,
3385             const Sized_relobj_file<32, big_endian>* object,
3386             const Symbol_value<32>* psymval,
3387             Arm_address address)
3388   {
3389     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3390     Valtype* wv = reinterpret_cast<Valtype*>(view);
3391     Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3392     int32_t addend = utils::sign_extend<11>((val & 0x07ff) << 1);
3393     int32_t x = (psymval->value(object, addend) - address);
3394     elfcpp::Swap<16, big_endian>::writeval(wv, ((val & 0xf800)
3395                                                 | ((x & 0x0ffe) >> 1)));
3396     // We do a 12-bit overflow check because x is right-shifted by 1 bit.
3397     return (utils::has_overflow<12>(x)
3398             ? This::STATUS_OVERFLOW
3399             : This::STATUS_OKAY);
3400   }
3401
3402   // R_ARM_BASE_PREL: B(S) + A - P
3403   static inline typename This::Status
3404   base_prel(unsigned char* view,
3405             Arm_address origin,
3406             Arm_address address)
3407   {
3408     Base::rel32(view, origin - address);
3409     return STATUS_OKAY;
3410   }
3411
3412   // R_ARM_BASE_ABS: B(S) + A
3413   static inline typename This::Status
3414   base_abs(unsigned char* view,
3415            Arm_address origin)
3416   {
3417     Base::rel32(view, origin);
3418     return STATUS_OKAY;
3419   }
3420
3421   // R_ARM_GOT_BREL: GOT(S) + A - GOT_ORG
3422   static inline typename This::Status
3423   got_brel(unsigned char* view,
3424            typename elfcpp::Swap<32, big_endian>::Valtype got_offset)
3425   {
3426     Base::rel32(view, got_offset);
3427     return This::STATUS_OKAY;
3428   }
3429
3430   // R_ARM_GOT_PREL: GOT(S) + A - P
3431   static inline typename This::Status
3432   got_prel(unsigned char* view,
3433            Arm_address got_entry,
3434            Arm_address address)
3435   {
3436     Base::rel32(view, got_entry - address);
3437     return This::STATUS_OKAY;
3438   }
3439
3440   // R_ARM_PREL: (S + A) | T - P
3441   static inline typename This::Status
3442   prel31(unsigned char* view,
3443          const Sized_relobj_file<32, big_endian>* object,
3444          const Symbol_value<32>* psymval,
3445          Arm_address address,
3446          Arm_address thumb_bit)
3447   {
3448     typedef typename elfcpp::Swap_unaligned<32, big_endian>::Valtype Valtype;
3449     Valtype val = elfcpp::Swap_unaligned<32, big_endian>::readval(view);
3450     Valtype addend = utils::sign_extend<31>(val);
3451     Valtype x = (psymval->value(object, addend) | thumb_bit) - address;
3452     val = utils::bit_select(val, x, 0x7fffffffU);
3453     elfcpp::Swap_unaligned<32, big_endian>::writeval(view, val);
3454     return (utils::has_overflow<31>(x) ?
3455             This::STATUS_OVERFLOW : This::STATUS_OKAY);
3456   }
3457
3458   // R_ARM_MOVW_ABS_NC: (S + A) | T     (relative address base is )
3459   // R_ARM_MOVW_PREL_NC: (S + A) | T - P
3460   // R_ARM_MOVW_BREL_NC: ((S + A) | T) - B(S)
3461   // R_ARM_MOVW_BREL: ((S + A) | T) - B(S)
3462   static inline typename This::Status
3463   movw(unsigned char* view,
3464        const Sized_relobj_file<32, big_endian>* object,
3465        const Symbol_value<32>* psymval,
3466        Arm_address relative_address_base,
3467        Arm_address thumb_bit,
3468        bool check_overflow)
3469   {
3470     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3471     Valtype* wv = reinterpret_cast<Valtype*>(view);
3472     Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3473     Valtype addend = This::extract_arm_movw_movt_addend(val);
3474     Valtype x = ((psymval->value(object, addend) | thumb_bit)
3475                  - relative_address_base);
3476     val = This::insert_val_arm_movw_movt(val, x);
3477     elfcpp::Swap<32, big_endian>::writeval(wv, val);
3478     return ((check_overflow && utils::has_overflow<16>(x))
3479             ? This::STATUS_OVERFLOW
3480             : This::STATUS_OKAY);
3481   }
3482
3483   // R_ARM_MOVT_ABS: S + A      (relative address base is 0)
3484   // R_ARM_MOVT_PREL: S + A - P
3485   // R_ARM_MOVT_BREL: S + A - B(S)
3486   static inline typename This::Status
3487   movt(unsigned char* view,
3488        const Sized_relobj_file<32, big_endian>* object,
3489        const Symbol_value<32>* psymval,
3490        Arm_address relative_address_base)
3491   {
3492     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3493     Valtype* wv = reinterpret_cast<Valtype*>(view);
3494     Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3495     Valtype addend = This::extract_arm_movw_movt_addend(val);
3496     Valtype x = (psymval->value(object, addend) - relative_address_base) >> 16;
3497     val = This::insert_val_arm_movw_movt(val, x);
3498     elfcpp::Swap<32, big_endian>::writeval(wv, val);
3499     // FIXME: IHI0044D says that we should check for overflow.
3500     return This::STATUS_OKAY;
3501   }
3502
3503   // R_ARM_THM_MOVW_ABS_NC: S + A | T           (relative_address_base is 0)
3504   // R_ARM_THM_MOVW_PREL_NC: (S + A) | T - P
3505   // R_ARM_THM_MOVW_BREL_NC: ((S + A) | T) - B(S)
3506   // R_ARM_THM_MOVW_BREL: ((S + A) | T) - B(S)
3507   static inline typename This::Status
3508   thm_movw(unsigned char* view,
3509            const Sized_relobj_file<32, big_endian>* object,
3510            const Symbol_value<32>* psymval,
3511            Arm_address relative_address_base,
3512            Arm_address thumb_bit,
3513            bool check_overflow)
3514   {
3515     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3516     typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3517     Valtype* wv = reinterpret_cast<Valtype*>(view);
3518     Reltype val = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3519                   | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3520     Reltype addend = This::extract_thumb_movw_movt_addend(val);
3521     Reltype x =
3522       (psymval->value(object, addend) | thumb_bit) - relative_address_base;
3523     val = This::insert_val_thumb_movw_movt(val, x);
3524     elfcpp::Swap<16, big_endian>::writeval(wv, val >> 16);
3525     elfcpp::Swap<16, big_endian>::writeval(wv + 1, val & 0xffff);
3526     return ((check_overflow && utils::has_overflow<16>(x))
3527             ? This::STATUS_OVERFLOW
3528             : This::STATUS_OKAY);
3529   }
3530
3531   // R_ARM_THM_MOVT_ABS: S + A          (relative address base is 0)
3532   // R_ARM_THM_MOVT_PREL: S + A - P
3533   // R_ARM_THM_MOVT_BREL: S + A - B(S)
3534   static inline typename This::Status
3535   thm_movt(unsigned char* view,
3536            const Sized_relobj_file<32, big_endian>* object,
3537            const Symbol_value<32>* psymval,
3538            Arm_address relative_address_base)
3539   {
3540     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3541     typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3542     Valtype* wv = reinterpret_cast<Valtype*>(view);
3543     Reltype val = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3544                   | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3545     Reltype addend = This::extract_thumb_movw_movt_addend(val);
3546     Reltype x = (psymval->value(object, addend) - relative_address_base) >> 16;
3547     val = This::insert_val_thumb_movw_movt(val, x);
3548     elfcpp::Swap<16, big_endian>::writeval(wv, val >> 16);
3549     elfcpp::Swap<16, big_endian>::writeval(wv + 1, val & 0xffff);
3550     return This::STATUS_OKAY;
3551   }
3552
3553   // R_ARM_THM_ALU_PREL_11_0: ((S + A) | T) - Pa (Thumb32)
3554   static inline typename This::Status
3555   thm_alu11(unsigned char* view,
3556             const Sized_relobj_file<32, big_endian>* object,
3557             const Symbol_value<32>* psymval,
3558             Arm_address address,
3559             Arm_address thumb_bit)
3560   {
3561     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3562     typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3563     Valtype* wv = reinterpret_cast<Valtype*>(view);
3564     Reltype insn = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3565                    | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3566
3567     //        f e d c b|a|9|8 7 6 5|4|3 2 1 0||f|e d c|b a 9 8|7 6 5 4 3 2 1 0
3568     // -----------------------------------------------------------------------
3569     // ADD{S} 1 1 1 1 0|i|0|1 0 0 0|S|1 1 0 1||0|imm3 |Rd     |imm8
3570     // ADDW   1 1 1 1 0|i|1|0 0 0 0|0|1 1 0 1||0|imm3 |Rd     |imm8
3571     // ADR[+] 1 1 1 1 0|i|1|0 0 0 0|0|1 1 1 1||0|imm3 |Rd     |imm8
3572     // SUB{S} 1 1 1 1 0|i|0|1 1 0 1|S|1 1 0 1||0|imm3 |Rd     |imm8
3573     // SUBW   1 1 1 1 0|i|1|0 1 0 1|0|1 1 0 1||0|imm3 |Rd     |imm8
3574     // ADR[-] 1 1 1 1 0|i|1|0 1 0 1|0|1 1 1 1||0|imm3 |Rd     |imm8
3575
3576     // Determine a sign for the addend.
3577     const int sign = ((insn & 0xf8ef0000) == 0xf0ad0000
3578                       || (insn & 0xf8ef0000) == 0xf0af0000) ? -1 : 1;
3579     // Thumb2 addend encoding:
3580     // imm12 := i | imm3 | imm8
3581     int32_t addend = (insn & 0xff)
3582                      | ((insn & 0x00007000) >> 4)
3583                      | ((insn & 0x04000000) >> 15);
3584     // Apply a sign to the added.
3585     addend *= sign;
3586
3587     int32_t x = (psymval->value(object, addend) | thumb_bit)
3588                 - (address & 0xfffffffc);
3589     Reltype val = abs(x);
3590     // Mask out the value and a distinct part of the ADD/SUB opcode
3591     // (bits 7:5 of opword).
3592     insn = (insn & 0xfb0f8f00)
3593            | (val & 0xff)
3594            | ((val & 0x700) << 4)
3595            | ((val & 0x800) << 15);
3596     // Set the opcode according to whether the value to go in the
3597     // place is negative.
3598     if (x < 0)
3599       insn |= 0x00a00000;
3600
3601     elfcpp::Swap<16, big_endian>::writeval(wv, insn >> 16);
3602     elfcpp::Swap<16, big_endian>::writeval(wv + 1, insn & 0xffff);
3603     return ((val > 0xfff) ?
3604             This::STATUS_OVERFLOW : This::STATUS_OKAY);
3605   }
3606
3607   // R_ARM_THM_PC8: S + A - Pa (Thumb)
3608   static inline typename This::Status
3609   thm_pc8(unsigned char* view,
3610           const Sized_relobj_file<32, big_endian>* object,
3611           const Symbol_value<32>* psymval,
3612           Arm_address address)
3613   {
3614     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3615     typedef typename elfcpp::Swap<16, big_endian>::Valtype Reltype;
3616     Valtype* wv = reinterpret_cast<Valtype*>(view);
3617     Valtype insn = elfcpp::Swap<16, big_endian>::readval(wv);
3618     Reltype addend = ((insn & 0x00ff) << 2);
3619     int32_t x = (psymval->value(object, addend) - (address & 0xfffffffc));
3620     Reltype val = abs(x);
3621     insn = (insn & 0xff00) | ((val & 0x03fc) >> 2);
3622
3623     elfcpp::Swap<16, big_endian>::writeval(wv, insn);
3624     return ((val > 0x03fc)
3625             ? This::STATUS_OVERFLOW
3626             : This::STATUS_OKAY);
3627   }
3628
3629   // R_ARM_THM_PC12: S + A - Pa (Thumb32)
3630   static inline typename This::Status
3631   thm_pc12(unsigned char* view,
3632            const Sized_relobj_file<32, big_endian>* object,
3633            const Symbol_value<32>* psymval,
3634            Arm_address address)
3635   {
3636     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3637     typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3638     Valtype* wv = reinterpret_cast<Valtype*>(view);
3639     Reltype insn = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3640                    | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3641     // Determine a sign for the addend (positive if the U bit is 1).
3642     const int sign = (insn & 0x00800000) ? 1 : -1;
3643     int32_t addend = (insn & 0xfff);
3644     // Apply a sign to the added.
3645     addend *= sign;
3646
3647     int32_t x = (psymval->value(object, addend) - (address & 0xfffffffc));
3648     Reltype val = abs(x);
3649     // Mask out and apply the value and the U bit.
3650     insn = (insn & 0xff7ff000) | (val & 0xfff);
3651     // Set the U bit according to whether the value to go in the
3652     // place is positive.
3653     if (x >= 0)
3654       insn |= 0x00800000;
3655
3656     elfcpp::Swap<16, big_endian>::writeval(wv, insn >> 16);
3657     elfcpp::Swap<16, big_endian>::writeval(wv + 1, insn & 0xffff);
3658     return ((val > 0xfff) ?
3659             This::STATUS_OVERFLOW : This::STATUS_OKAY);
3660   }
3661
3662   // R_ARM_V4BX
3663   static inline typename This::Status
3664   v4bx(const Relocate_info<32, big_endian>* relinfo,
3665        unsigned char* view,
3666        const Arm_relobj<big_endian>* object,
3667        const Arm_address address,
3668        const bool is_interworking)
3669   {
3670
3671     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3672     Valtype* wv = reinterpret_cast<Valtype*>(view);
3673     Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3674
3675     // Ensure that we have a BX instruction.
3676     gold_assert((val & 0x0ffffff0) == 0x012fff10);
3677     const uint32_t reg = (val & 0xf);
3678     if (is_interworking && reg != 0xf)
3679       {
3680         Stub_table<big_endian>* stub_table =
3681             object->stub_table(relinfo->data_shndx);
3682         gold_assert(stub_table != NULL);
3683
3684         Arm_v4bx_stub* stub = stub_table->find_arm_v4bx_stub(reg);
3685         gold_assert(stub != NULL);
3686
3687         int32_t veneer_address =
3688             stub_table->address() + stub->offset() - 8 - address;
3689         gold_assert((veneer_address <= ARM_MAX_FWD_BRANCH_OFFSET)
3690                     && (veneer_address >= ARM_MAX_BWD_BRANCH_OFFSET));
3691         // Replace with a branch to veneer (B <addr>)
3692         val = (val & 0xf0000000) | 0x0a000000
3693               | ((veneer_address >> 2) & 0x00ffffff);
3694       }
3695     else
3696       {
3697         // Preserve Rm (lowest four bits) and the condition code
3698         // (highest four bits). Other bits encode MOV PC,Rm.
3699         val = (val & 0xf000000f) | 0x01a0f000;
3700       }
3701     elfcpp::Swap<32, big_endian>::writeval(wv, val);
3702     return This::STATUS_OKAY;
3703   }
3704
3705   // R_ARM_ALU_PC_G0_NC: ((S + A) | T) - P
3706   // R_ARM_ALU_PC_G0:    ((S + A) | T) - P
3707   // R_ARM_ALU_PC_G1_NC: ((S + A) | T) - P
3708   // R_ARM_ALU_PC_G1:    ((S + A) | T) - P
3709   // R_ARM_ALU_PC_G2:    ((S + A) | T) - P
3710   // R_ARM_ALU_SB_G0_NC: ((S + A) | T) - B(S)
3711   // R_ARM_ALU_SB_G0:    ((S + A) | T) - B(S)
3712   // R_ARM_ALU_SB_G1_NC: ((S + A) | T) - B(S)
3713   // R_ARM_ALU_SB_G1:    ((S + A) | T) - B(S)
3714   // R_ARM_ALU_SB_G2:    ((S + A) | T) - B(S)
3715   static inline typename This::Status
3716   arm_grp_alu(unsigned char* view,
3717         const Sized_relobj_file<32, big_endian>* object,
3718         const Symbol_value<32>* psymval,
3719         const int group,
3720         Arm_address address,
3721         Arm_address thumb_bit,
3722         bool check_overflow)
3723   {
3724     gold_assert(group >= 0 && group < 3);
3725     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3726     Valtype* wv = reinterpret_cast<Valtype*>(view);
3727     Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3728
3729     // ALU group relocations are allowed only for the ADD/SUB instructions.
3730     // (0x00800000 - ADD, 0x00400000 - SUB)
3731     const Valtype opcode = insn & 0x01e00000;
3732     if (opcode != 0x00800000 && opcode != 0x00400000)
3733       return This::STATUS_BAD_RELOC;
3734
3735     // Determine a sign for the addend.
3736     const int sign = (opcode == 0x00800000) ? 1 : -1;
3737     // shifter = rotate_imm * 2
3738     const uint32_t shifter = (insn & 0xf00) >> 7;
3739     // Initial addend value.
3740     int32_t addend = insn & 0xff;
3741     // Rotate addend right by shifter.
3742     addend = (addend >> shifter) | (addend << (32 - shifter));
3743     // Apply a sign to the added.
3744     addend *= sign;
3745
3746     int32_t x = ((psymval->value(object, addend) | thumb_bit) - address);
3747     Valtype gn = Arm_relocate_functions::calc_grp_gn(abs(x), group);
3748     // Check for overflow if required
3749     if (check_overflow
3750         && (Arm_relocate_functions::calc_grp_residual(abs(x), group) != 0))
3751       return This::STATUS_OVERFLOW;
3752
3753     // Mask out the value and the ADD/SUB part of the opcode; take care
3754     // not to destroy the S bit.
3755     insn &= 0xff1ff000;
3756     // Set the opcode according to whether the value to go in the
3757     // place is negative.
3758     insn |= ((x < 0) ? 0x00400000 : 0x00800000);
3759     // Encode the offset (encoded Gn).
3760     insn |= gn;
3761
3762     elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3763     return This::STATUS_OKAY;
3764   }
3765
3766   // R_ARM_LDR_PC_G0: S + A - P
3767   // R_ARM_LDR_PC_G1: S + A - P
3768   // R_ARM_LDR_PC_G2: S + A - P
3769   // R_ARM_LDR_SB_G0: S + A - B(S)
3770   // R_ARM_LDR_SB_G1: S + A - B(S)
3771   // R_ARM_LDR_SB_G2: S + A - B(S)
3772   static inline typename This::Status
3773   arm_grp_ldr(unsigned char* view,
3774         const Sized_relobj_file<32, big_endian>* object,
3775         const Symbol_value<32>* psymval,
3776         const int group,
3777         Arm_address address)
3778   {
3779     gold_assert(group >= 0 && group < 3);
3780     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3781     Valtype* wv = reinterpret_cast<Valtype*>(view);
3782     Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3783
3784     const int sign = (insn & 0x00800000) ? 1 : -1;
3785     int32_t addend = (insn & 0xfff) * sign;
3786     int32_t x = (psymval->value(object, addend) - address);
3787     // Calculate the relevant G(n-1) value to obtain this stage residual.
3788     Valtype residual =
3789         Arm_relocate_functions::calc_grp_residual(abs(x), group - 1);
3790     if (residual >= 0x1000)
3791       return This::STATUS_OVERFLOW;
3792
3793     // Mask out the value and U bit.
3794     insn &= 0xff7ff000;
3795     // Set the U bit for non-negative values.
3796     if (x >= 0)
3797       insn |= 0x00800000;
3798     insn |= residual;
3799
3800     elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3801     return This::STATUS_OKAY;
3802   }
3803
3804   // R_ARM_LDRS_PC_G0: S + A - P
3805   // R_ARM_LDRS_PC_G1: S + A - P
3806   // R_ARM_LDRS_PC_G2: S + A - P
3807   // R_ARM_LDRS_SB_G0: S + A - B(S)
3808   // R_ARM_LDRS_SB_G1: S + A - B(S)
3809   // R_ARM_LDRS_SB_G2: S + A - B(S)
3810   static inline typename This::Status
3811   arm_grp_ldrs(unsigned char* view,
3812         const Sized_relobj_file<32, big_endian>* object,
3813         const Symbol_value<32>* psymval,
3814         const int group,
3815         Arm_address address)
3816   {
3817     gold_assert(group >= 0 && group < 3);
3818     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3819     Valtype* wv = reinterpret_cast<Valtype*>(view);
3820     Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3821
3822     const int sign = (insn & 0x00800000) ? 1 : -1;
3823     int32_t addend = (((insn & 0xf00) >> 4) + (insn & 0xf)) * sign;
3824     int32_t x = (psymval->value(object, addend) - address);
3825     // Calculate the relevant G(n-1) value to obtain this stage residual.
3826     Valtype residual =
3827         Arm_relocate_functions::calc_grp_residual(abs(x), group - 1);
3828    if (residual >= 0x100)
3829       return This::STATUS_OVERFLOW;
3830
3831     // Mask out the value and U bit.
3832     insn &= 0xff7ff0f0;
3833     // Set the U bit for non-negative values.
3834     if (x >= 0)
3835       insn |= 0x00800000;
3836     insn |= ((residual & 0xf0) << 4) | (residual & 0xf);
3837
3838     elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3839     return This::STATUS_OKAY;
3840   }
3841
3842   // R_ARM_LDC_PC_G0: S + A - P
3843   // R_ARM_LDC_PC_G1: S + A - P
3844   // R_ARM_LDC_PC_G2: S + A - P
3845   // R_ARM_LDC_SB_G0: S + A - B(S)
3846   // R_ARM_LDC_SB_G1: S + A - B(S)
3847   // R_ARM_LDC_SB_G2: S + A - B(S)
3848   static inline typename This::Status
3849   arm_grp_ldc(unsigned char* view,
3850       const Sized_relobj_file<32, big_endian>* object,
3851       const Symbol_value<32>* psymval,
3852       const int group,
3853       Arm_address address)
3854   {
3855     gold_assert(group >= 0 && group < 3);
3856     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3857     Valtype* wv = reinterpret_cast<Valtype*>(view);
3858     Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3859
3860     const int sign = (insn & 0x00800000) ? 1 : -1;
3861     int32_t addend = ((insn & 0xff) << 2) * sign;
3862     int32_t x = (psymval->value(object, addend) - address);
3863     // Calculate the relevant G(n-1) value to obtain this stage residual.
3864     Valtype residual =
3865       Arm_relocate_functions::calc_grp_residual(abs(x), group - 1);
3866     if ((residual & 0x3) != 0 || residual >= 0x400)
3867       return This::STATUS_OVERFLOW;
3868
3869     // Mask out the value and U bit.
3870     insn &= 0xff7fff00;
3871     // Set the U bit for non-negative values.
3872     if (x >= 0)
3873       insn |= 0x00800000;
3874     insn |= (residual >> 2);
3875
3876     elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3877     return This::STATUS_OKAY;
3878   }
3879 };
3880
3881 // Relocate ARM long branches.  This handles relocation types
3882 // R_ARM_CALL, R_ARM_JUMP24, R_ARM_PLT32 and R_ARM_XPC25.
3883 // If IS_WEAK_UNDEFINED_WITH_PLT is true.  The target symbol is weakly
3884 // undefined and we do not use PLT in this relocation.  In such a case,
3885 // the branch is converted into an NOP.
3886
3887 template<bool big_endian>
3888 typename Arm_relocate_functions<big_endian>::Status
3889 Arm_relocate_functions<big_endian>::arm_branch_common(
3890     unsigned int r_type,
3891     const Relocate_info<32, big_endian>* relinfo,
3892     unsigned char* view,
3893     const Sized_symbol<32>* gsym,
3894     const Arm_relobj<big_endian>* object,
3895     unsigned int r_sym,
3896     const Symbol_value<32>* psymval,
3897     Arm_address address,
3898     Arm_address thumb_bit,
3899     bool is_weakly_undefined_without_plt)
3900 {
3901   typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3902   Valtype* wv = reinterpret_cast<Valtype*>(view);
3903   Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3904      
3905   bool insn_is_b = (((val >> 28) & 0xf) <= 0xe)
3906                     && ((val & 0x0f000000UL) == 0x0a000000UL);
3907   bool insn_is_uncond_bl = (val & 0xff000000UL) == 0xeb000000UL;
3908   bool insn_is_cond_bl = (((val >> 28) & 0xf) < 0xe)
3909                           && ((val & 0x0f000000UL) == 0x0b000000UL);
3910   bool insn_is_blx = (val & 0xfe000000UL) == 0xfa000000UL;
3911   bool insn_is_any_branch = (val & 0x0e000000UL) == 0x0a000000UL;
3912
3913   // Check that the instruction is valid.
3914   if (r_type == elfcpp::R_ARM_CALL)
3915     {
3916       if (!insn_is_uncond_bl && !insn_is_blx)
3917         return This::STATUS_BAD_RELOC;
3918     }
3919   else if (r_type == elfcpp::R_ARM_JUMP24)
3920     {
3921       if (!insn_is_b && !insn_is_cond_bl)
3922         return This::STATUS_BAD_RELOC;
3923     }
3924   else if (r_type == elfcpp::R_ARM_PLT32)
3925     {
3926       if (!insn_is_any_branch)
3927         return This::STATUS_BAD_RELOC;
3928     }
3929   else if (r_type == elfcpp::R_ARM_XPC25)
3930     {
3931       // FIXME: AAELF document IH0044C does not say much about it other
3932       // than it being obsolete.
3933       if (!insn_is_any_branch)
3934         return This::STATUS_BAD_RELOC;
3935     }
3936   else
3937     gold_unreachable();
3938
3939   // A branch to an undefined weak symbol is turned into a jump to
3940   // the next instruction unless a PLT entry will be created.
3941   // Do the same for local undefined symbols.
3942   // The jump to the next instruction is optimized as a NOP depending
3943   // on the architecture.
3944   const Target_arm<big_endian>* arm_target =
3945     Target_arm<big_endian>::default_target();
3946   if (is_weakly_undefined_without_plt)
3947     {
3948       gold_assert(!parameters->options().relocatable());
3949       Valtype cond = val & 0xf0000000U;
3950       if (arm_target->may_use_arm_nop())
3951         val = cond | 0x0320f000;
3952       else
3953         val = cond | 0x01a00000;        // Using pre-UAL nop: mov r0, r0.
3954       elfcpp::Swap<32, big_endian>::writeval(wv, val);
3955       return This::STATUS_OKAY;
3956     }
3957  
3958   Valtype addend = utils::sign_extend<26>(val << 2);
3959   Valtype branch_target = psymval->value(object, addend);
3960   int32_t branch_offset = branch_target - address;
3961
3962   // We need a stub if the branch offset is too large or if we need
3963   // to switch mode.
3964   bool may_use_blx = arm_target->may_use_v5t_interworking();
3965   Reloc_stub* stub = NULL;
3966
3967   if (!parameters->options().relocatable()
3968       && (utils::has_overflow<26>(branch_offset)
3969           || ((thumb_bit != 0)
3970               && !(may_use_blx && r_type == elfcpp::R_ARM_CALL))))
3971     {
3972       Valtype unadjusted_branch_target = psymval->value(object, 0);
3973
3974       Stub_type stub_type =
3975         Reloc_stub::stub_type_for_reloc(r_type, address,
3976                                         unadjusted_branch_target,
3977                                         (thumb_bit != 0));
3978       if (stub_type != arm_stub_none)
3979         {
3980           Stub_table<big_endian>* stub_table =
3981             object->stub_table(relinfo->data_shndx);
3982           gold_assert(stub_table != NULL);
3983
3984           Reloc_stub::Key stub_key(stub_type, gsym, object, r_sym, addend);
3985           stub = stub_table->find_reloc_stub(stub_key);
3986           gold_assert(stub != NULL);
3987           thumb_bit = stub->stub_template()->entry_in_thumb_mode() ? 1 : 0;
3988           branch_target = stub_table->address() + stub->offset() + addend;
3989           branch_offset = branch_target - address;
3990           gold_assert(!utils::has_overflow<26>(branch_offset));
3991         }
3992     }
3993
3994   // At this point, if we still need to switch mode, the instruction
3995   // must either be a BLX or a BL that can be converted to a BLX.
3996   if (thumb_bit != 0)
3997     {
3998       // Turn BL to BLX.
3999       gold_assert(may_use_blx && r_type == elfcpp::R_ARM_CALL);
4000       val = (val & 0xffffff) | 0xfa000000 | ((branch_offset & 2) << 23);
4001     }
4002
4003   val = utils::bit_select(val, (branch_offset >> 2), 0xffffffUL);
4004   elfcpp::Swap<32, big_endian>::writeval(wv, val);
4005   return (utils::has_overflow<26>(branch_offset)
4006           ? This::STATUS_OVERFLOW : This::STATUS_OKAY);
4007 }
4008
4009 // Relocate THUMB long branches.  This handles relocation types
4010 // R_ARM_THM_CALL, R_ARM_THM_JUMP24 and R_ARM_THM_XPC22.
4011 // If IS_WEAK_UNDEFINED_WITH_PLT is true.  The target symbol is weakly
4012 // undefined and we do not use PLT in this relocation.  In such a case,
4013 // the branch is converted into an NOP.
4014
4015 template<bool big_endian>
4016 typename Arm_relocate_functions<big_endian>::Status
4017 Arm_relocate_functions<big_endian>::thumb_branch_common(
4018     unsigned int r_type,
4019     const Relocate_info<32, big_endian>* relinfo,
4020     unsigned char* view,
4021     const Sized_symbol<32>* gsym,
4022     const Arm_relobj<big_endian>* object,
4023     unsigned int r_sym,
4024     const Symbol_value<32>* psymval,
4025     Arm_address address,
4026     Arm_address thumb_bit,
4027     bool is_weakly_undefined_without_plt)
4028 {
4029   typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
4030   Valtype* wv = reinterpret_cast<Valtype*>(view);
4031   uint32_t upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
4032   uint32_t lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
4033
4034   // FIXME: These tests are too loose and do not take THUMB/THUMB-2 difference
4035   // into account.
4036   bool is_bl_insn = (lower_insn & 0x1000U) == 0x1000U;
4037   bool is_blx_insn = (lower_insn & 0x1000U) == 0x0000U;
4038      
4039   // Check that the instruction is valid.
4040   if (r_type == elfcpp::R_ARM_THM_CALL)
4041     {
4042       if (!is_bl_insn && !is_blx_insn)
4043         return This::STATUS_BAD_RELOC;
4044     }
4045   else if (r_type == elfcpp::R_ARM_THM_JUMP24)
4046     {
4047       // This cannot be a BLX.
4048       if (!is_bl_insn)
4049         return This::STATUS_BAD_RELOC;
4050     }
4051   else if (r_type == elfcpp::R_ARM_THM_XPC22)
4052     {
4053       // Check for Thumb to Thumb call.
4054       if (!is_blx_insn)
4055         return This::STATUS_BAD_RELOC;
4056       if (thumb_bit != 0)
4057         {
4058           gold_warning(_("%s: Thumb BLX instruction targets "
4059                          "thumb function '%s'."),
4060                          object->name().c_str(),
4061                          (gsym ? gsym->name() : "(local)")); 
4062           // Convert BLX to BL.
4063           lower_insn |= 0x1000U;
4064         }
4065     }
4066   else
4067     gold_unreachable();
4068
4069   // A branch to an undefined weak symbol is turned into a jump to
4070   // the next instruction unless a PLT entry will be created.
4071   // The jump to the next instruction is optimized as a NOP.W for
4072   // Thumb-2 enabled architectures.
4073   const Target_arm<big_endian>* arm_target =
4074     Target_arm<big_endian>::default_target();
4075   if (is_weakly_undefined_without_plt)
4076     {
4077       gold_assert(!parameters->options().relocatable());
4078       if (arm_target->may_use_thumb2_nop())
4079         {
4080           elfcpp::Swap<16, big_endian>::writeval(wv, 0xf3af);
4081           elfcpp::Swap<16, big_endian>::writeval(wv + 1, 0x8000);
4082         }
4083       else
4084         {
4085           elfcpp::Swap<16, big_endian>::writeval(wv, 0xe000);
4086           elfcpp::Swap<16, big_endian>::writeval(wv + 1, 0xbf00);
4087         }
4088       return This::STATUS_OKAY;
4089     }
4090  
4091   int32_t addend = This::thumb32_branch_offset(upper_insn, lower_insn);
4092   Arm_address branch_target = psymval->value(object, addend);
4093
4094   // For BLX, bit 1 of target address comes from bit 1 of base address.
4095   bool may_use_blx = arm_target->may_use_v5t_interworking();
4096   if (thumb_bit == 0 && may_use_blx)
4097     branch_target = utils::bit_select(branch_target, address, 0x2);
4098
4099   int32_t branch_offset = branch_target - address;
4100
4101   // We need a stub if the branch offset is too large or if we need
4102   // to switch mode.
4103   bool thumb2 = arm_target->using_thumb2();
4104   if (!parameters->options().relocatable()
4105       && ((!thumb2 && utils::has_overflow<23>(branch_offset))
4106           || (thumb2 && utils::has_overflow<25>(branch_offset))
4107           || ((thumb_bit == 0)
4108               && (((r_type == elfcpp::R_ARM_THM_CALL) && !may_use_blx)
4109                   || r_type == elfcpp::R_ARM_THM_JUMP24))))
4110     {
4111       Arm_address unadjusted_branch_target = psymval->value(object, 0);
4112
4113       Stub_type stub_type =
4114         Reloc_stub::stub_type_for_reloc(r_type, address,
4115                                         unadjusted_branch_target,
4116                                         (thumb_bit != 0));
4117
4118       if (stub_type != arm_stub_none)
4119         {
4120           Stub_table<big_endian>* stub_table =
4121             object->stub_table(relinfo->data_shndx);
4122           gold_assert(stub_table != NULL);
4123
4124           Reloc_stub::Key stub_key(stub_type, gsym, object, r_sym, addend);
4125           Reloc_stub* stub = stub_table->find_reloc_stub(stub_key);
4126           gold_assert(stub != NULL);
4127           thumb_bit = stub->stub_template()->entry_in_thumb_mode() ? 1 : 0;
4128           branch_target = stub_table->address() + stub->offset() + addend;
4129           if (thumb_bit == 0 && may_use_blx) 
4130             branch_target = utils::bit_select(branch_target, address, 0x2);
4131           branch_offset = branch_target - address;
4132         }
4133     }
4134
4135   // At this point, if we still need to switch mode, the instruction
4136   // must either be a BLX or a BL that can be converted to a BLX.
4137   if (thumb_bit == 0)
4138     {
4139       gold_assert(may_use_blx
4140                   && (r_type == elfcpp::R_ARM_THM_CALL
4141                       || r_type == elfcpp::R_ARM_THM_XPC22));
4142       // Make sure this is a BLX.
4143       lower_insn &= ~0x1000U;
4144     }
4145   else
4146     {
4147       // Make sure this is a BL.
4148       lower_insn |= 0x1000U;
4149     }
4150
4151   // For a BLX instruction, make sure that the relocation is rounded up
4152   // to a word boundary.  This follows the semantics of the instruction
4153   // which specifies that bit 1 of the target address will come from bit
4154   // 1 of the base address.
4155   if ((lower_insn & 0x5000U) == 0x4000U)
4156     gold_assert((branch_offset & 3) == 0);
4157
4158   // Put BRANCH_OFFSET back into the insn.  Assumes two's complement.
4159   // We use the Thumb-2 encoding, which is safe even if dealing with
4160   // a Thumb-1 instruction by virtue of our overflow check above.  */
4161   upper_insn = This::thumb32_branch_upper(upper_insn, branch_offset);
4162   lower_insn = This::thumb32_branch_lower(lower_insn, branch_offset);
4163
4164   elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
4165   elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
4166
4167   gold_assert(!utils::has_overflow<25>(branch_offset));
4168
4169   return ((thumb2
4170            ? utils::has_overflow<25>(branch_offset)
4171            : utils::has_overflow<23>(branch_offset))
4172           ? This::STATUS_OVERFLOW
4173           : This::STATUS_OKAY);
4174 }
4175
4176 // Relocate THUMB-2 long conditional branches.
4177 // If IS_WEAK_UNDEFINED_WITH_PLT is true.  The target symbol is weakly
4178 // undefined and we do not use PLT in this relocation.  In such a case,
4179 // the branch is converted into an NOP.
4180
4181 template<bool big_endian>
4182 typename Arm_relocate_functions<big_endian>::Status
4183 Arm_relocate_functions<big_endian>::thm_jump19(
4184     unsigned char* view,
4185     const Arm_relobj<big_endian>* object,
4186     const Symbol_value<32>* psymval,
4187     Arm_address address,
4188     Arm_address thumb_bit)
4189 {
4190   typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
4191   Valtype* wv = reinterpret_cast<Valtype*>(view);
4192   uint32_t upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
4193   uint32_t lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
4194   int32_t addend = This::thumb32_cond_branch_offset(upper_insn, lower_insn);
4195
4196   Arm_address branch_target = psymval->value(object, addend);
4197   int32_t branch_offset = branch_target - address;
4198
4199   // ??? Should handle interworking?  GCC might someday try to
4200   // use this for tail calls.
4201   // FIXME: We do support thumb entry to PLT yet.
4202   if (thumb_bit == 0)
4203     {
4204       gold_error(_("conditional branch to PLT in THUMB-2 not supported yet."));
4205       return This::STATUS_BAD_RELOC;
4206     }
4207
4208   // Put RELOCATION back into the insn.
4209   upper_insn = This::thumb32_cond_branch_upper(upper_insn, branch_offset);
4210   lower_insn = This::thumb32_cond_branch_lower(lower_insn, branch_offset);
4211
4212   // Put the relocated value back in the object file:
4213   elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
4214   elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
4215
4216   return (utils::has_overflow<21>(branch_offset)
4217           ? This::STATUS_OVERFLOW
4218           : This::STATUS_OKAY);
4219 }
4220
4221 // Get the GOT section, creating it if necessary.
4222
4223 template<bool big_endian>
4224 Arm_output_data_got<big_endian>*
4225 Target_arm<big_endian>::got_section(Symbol_table* symtab, Layout* layout)
4226 {
4227   if (this->got_ == NULL)
4228     {
4229       gold_assert(symtab != NULL && layout != NULL);
4230
4231       this->got_ = new Arm_output_data_got<big_endian>(symtab, layout);
4232
4233       layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
4234                                       (elfcpp::SHF_ALLOC | elfcpp::SHF_WRITE),
4235                                       this->got_, ORDER_DATA, false);
4236
4237       // The old GNU linker creates a .got.plt section.  We just
4238       // create another set of data in the .got section.  Note that we
4239       // always create a PLT if we create a GOT, although the PLT
4240       // might be empty.
4241       this->got_plt_ = new Output_data_space(4, "** GOT PLT");
4242       layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
4243                                       (elfcpp::SHF_ALLOC | elfcpp::SHF_WRITE),
4244                                       this->got_plt_, ORDER_DATA, false);
4245
4246       // The first three entries are reserved.
4247       this->got_plt_->set_current_data_size(3 * 4);
4248
4249       // Define _GLOBAL_OFFSET_TABLE_ at the start of the PLT.
4250       symtab->define_in_output_data("_GLOBAL_OFFSET_TABLE_", NULL,
4251                                     Symbol_table::PREDEFINED,
4252                                     this->got_plt_,
4253                                     0, 0, elfcpp::STT_OBJECT,
4254                                     elfcpp::STB_LOCAL,
4255                                     elfcpp::STV_HIDDEN, 0,
4256                                     false, false);
4257     }
4258   return this->got_;
4259 }
4260
4261 // Get the dynamic reloc section, creating it if necessary.
4262
4263 template<bool big_endian>
4264 typename Target_arm<big_endian>::Reloc_section*
4265 Target_arm<big_endian>::rel_dyn_section(Layout* layout)
4266 {
4267   if (this->rel_dyn_ == NULL)
4268     {
4269       gold_assert(layout != NULL);
4270       this->rel_dyn_ = new Reloc_section(parameters->options().combreloc());
4271       layout->add_output_section_data(".rel.dyn", elfcpp::SHT_REL,
4272                                       elfcpp::SHF_ALLOC, this->rel_dyn_,
4273                                       ORDER_DYNAMIC_RELOCS, false);
4274     }
4275   return this->rel_dyn_;
4276 }
4277
4278 // Insn_template methods.
4279
4280 // Return byte size of an instruction template.
4281
4282 size_t
4283 Insn_template::size() const
4284 {
4285   switch (this->type())
4286     {
4287     case THUMB16_TYPE:
4288     case THUMB16_SPECIAL_TYPE:
4289       return 2;
4290     case ARM_TYPE:
4291     case THUMB32_TYPE:
4292     case DATA_TYPE:
4293       return 4;
4294     default:
4295       gold_unreachable();
4296     }
4297 }
4298
4299 // Return alignment of an instruction template.
4300
4301 unsigned
4302 Insn_template::alignment() const
4303 {
4304   switch (this->type())
4305     {
4306     case THUMB16_TYPE:
4307     case THUMB16_SPECIAL_TYPE:
4308     case THUMB32_TYPE:
4309       return 2;
4310     case ARM_TYPE:
4311     case DATA_TYPE:
4312       return 4;
4313     default:
4314       gold_unreachable();
4315     }
4316 }
4317
4318 // Stub_template methods.
4319
4320 Stub_template::Stub_template(
4321     Stub_type type, const Insn_template* insns,
4322      size_t insn_count)
4323   : type_(type), insns_(insns), insn_count_(insn_count), alignment_(1),
4324     entry_in_thumb_mode_(false), relocs_()
4325 {
4326   off_t offset = 0;
4327
4328   // Compute byte size and alignment of stub template.
4329   for (size_t i = 0; i < insn_count; i++)
4330     {
4331       unsigned insn_alignment = insns[i].alignment();
4332       size_t insn_size = insns[i].size();
4333       gold_assert((offset & (insn_alignment - 1)) == 0);
4334       this->alignment_ = std::max(this->alignment_, insn_alignment);
4335       switch (insns[i].type())
4336         {
4337         case Insn_template::THUMB16_TYPE:
4338         case Insn_template::THUMB16_SPECIAL_TYPE:
4339           if (i == 0)
4340             this->entry_in_thumb_mode_ = true;
4341           break;
4342
4343         case Insn_template::THUMB32_TYPE:
4344           if (insns[i].r_type() != elfcpp::R_ARM_NONE)
4345             this->relocs_.push_back(Reloc(i, offset));
4346           if (i == 0)
4347             this->entry_in_thumb_mode_ = true;
4348           break;
4349
4350         case Insn_template::ARM_TYPE:
4351           // Handle cases where the target is encoded within the
4352           // instruction.
4353           if (insns[i].r_type() == elfcpp::R_ARM_JUMP24)
4354             this->relocs_.push_back(Reloc(i, offset));
4355           break;
4356
4357         case Insn_template::DATA_TYPE:
4358           // Entry point cannot be data.
4359           gold_assert(i != 0);
4360           this->relocs_.push_back(Reloc(i, offset));
4361           break;
4362
4363         default:
4364           gold_unreachable();
4365         }
4366       offset += insn_size; 
4367     }
4368   this->size_ = offset;
4369 }
4370
4371 // Stub methods.
4372
4373 // Template to implement do_write for a specific target endianness.
4374
4375 template<bool big_endian>
4376 void inline
4377 Stub::do_fixed_endian_write(unsigned char* view, section_size_type view_size)
4378 {
4379   const Stub_template* stub_template = this->stub_template();
4380   const Insn_template* insns = stub_template->insns();
4381
4382   // FIXME:  We do not handle BE8 encoding yet.
4383   unsigned char* pov = view;
4384   for (size_t i = 0; i < stub_template->insn_count(); i++)
4385     {
4386       switch (insns[i].type())
4387         {
4388         case Insn_template::THUMB16_TYPE:
4389           elfcpp::Swap<16, big_endian>::writeval(pov, insns[i].data() & 0xffff);
4390           break;
4391         case Insn_template::THUMB16_SPECIAL_TYPE:
4392           elfcpp::Swap<16, big_endian>::writeval(
4393               pov,
4394               this->thumb16_special(i));
4395           break;
4396         case Insn_template::THUMB32_TYPE:
4397           {
4398             uint32_t hi = (insns[i].data() >> 16) & 0xffff;
4399             uint32_t lo = insns[i].data() & 0xffff;
4400             elfcpp::Swap<16, big_endian>::writeval(pov, hi);
4401             elfcpp::Swap<16, big_endian>::writeval(pov + 2, lo);
4402           }
4403           break;
4404         case Insn_template::ARM_TYPE:
4405         case Insn_template::DATA_TYPE:
4406           elfcpp::Swap<32, big_endian>::writeval(pov, insns[i].data());
4407           break;
4408         default:
4409           gold_unreachable();
4410         }
4411       pov += insns[i].size();
4412     }
4413   gold_assert(static_cast<section_size_type>(pov - view) == view_size);
4414
4415
4416 // Reloc_stub::Key methods.
4417
4418 // Dump a Key as a string for debugging.
4419
4420 std::string
4421 Reloc_stub::Key::name() const
4422 {
4423   if (this->r_sym_ == invalid_index)
4424     {
4425       // Global symbol key name
4426       // <stub-type>:<symbol name>:<addend>.
4427       const std::string sym_name = this->u_.symbol->name();
4428       // We need to print two hex number and two colons.  So just add 100 bytes
4429       // to the symbol name size.
4430       size_t len = sym_name.size() + 100;
4431       char* buffer = new char[len];
4432       int c = snprintf(buffer, len, "%d:%s:%x", this->stub_type_,
4433                        sym_name.c_str(), this->addend_);
4434       gold_assert(c > 0 && c < static_cast<int>(len));
4435       delete[] buffer;
4436       return std::string(buffer);
4437     }
4438   else
4439     {
4440       // local symbol key name
4441       // <stub-type>:<object>:<r_sym>:<addend>.
4442       const size_t len = 200;
4443       char buffer[len];
4444       int c = snprintf(buffer, len, "%d:%p:%u:%x", this->stub_type_,
4445                        this->u_.relobj, this->r_sym_, this->addend_);
4446       gold_assert(c > 0 && c < static_cast<int>(len));
4447       return std::string(buffer);
4448     }
4449 }
4450
4451 // Reloc_stub methods.
4452
4453 // Determine the type of stub needed, if any, for a relocation of R_TYPE at
4454 // LOCATION to DESTINATION.
4455 // This code is based on the arm_type_of_stub function in
4456 // bfd/elf32-arm.c.  We have changed the interface a little to keep the Stub
4457 // class simple.
4458
4459 Stub_type
4460 Reloc_stub::stub_type_for_reloc(
4461    unsigned int r_type,
4462    Arm_address location,
4463    Arm_address destination,
4464    bool target_is_thumb)
4465 {
4466   Stub_type stub_type = arm_stub_none;
4467
4468   // This is a bit ugly but we want to avoid using a templated class for
4469   // big and little endianities.
4470   bool may_use_blx;
4471   bool should_force_pic_veneer;
4472   bool thumb2;
4473   bool thumb_only;
4474   if (parameters->target().is_big_endian())
4475     {
4476       const Target_arm<true>* big_endian_target =
4477         Target_arm<true>::default_target();
4478       may_use_blx = big_endian_target->may_use_v5t_interworking();
4479       should_force_pic_veneer = big_endian_target->should_force_pic_veneer();
4480       thumb2 = big_endian_target->using_thumb2();
4481       thumb_only = big_endian_target->using_thumb_only();
4482     }
4483   else
4484     {
4485       const Target_arm<false>* little_endian_target =
4486         Target_arm<false>::default_target();
4487       may_use_blx = little_endian_target->may_use_v5t_interworking();
4488       should_force_pic_veneer = little_endian_target->should_force_pic_veneer();
4489       thumb2 = little_endian_target->using_thumb2();
4490       thumb_only = little_endian_target->using_thumb_only();
4491     }
4492
4493   int64_t branch_offset;
4494   if (r_type == elfcpp::R_ARM_THM_CALL || r_type == elfcpp::R_ARM_THM_JUMP24)
4495     {
4496       // For THUMB BLX instruction, bit 1 of target comes from bit 1 of the
4497       // base address (instruction address + 4).
4498       if ((r_type == elfcpp::R_ARM_THM_CALL) && may_use_blx && !target_is_thumb)
4499         destination = utils::bit_select(destination, location, 0x2);
4500       branch_offset = static_cast<int64_t>(destination) - location;
4501         
4502       // Handle cases where:
4503       // - this call goes too far (different Thumb/Thumb2 max
4504       //   distance)
4505       // - it's a Thumb->Arm call and blx is not available, or it's a
4506       //   Thumb->Arm branch (not bl). A stub is needed in this case.
4507       if ((!thumb2
4508             && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
4509                 || (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
4510           || (thumb2
4511               && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
4512                   || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
4513           || ((!target_is_thumb)
4514               && (((r_type == elfcpp::R_ARM_THM_CALL) && !may_use_blx)
4515                   || (r_type == elfcpp::R_ARM_THM_JUMP24))))
4516         {
4517           if (target_is_thumb)
4518             {
4519               // Thumb to thumb.
4520               if (!thumb_only)
4521                 {
4522                   stub_type = (parameters->options().shared()
4523                                || should_force_pic_veneer)
4524                     // PIC stubs.
4525                     ? ((may_use_blx
4526                         && (r_type == elfcpp::R_ARM_THM_CALL))
4527                        // V5T and above. Stub starts with ARM code, so
4528                        // we must be able to switch mode before
4529                        // reaching it, which is only possible for 'bl'
4530                        // (ie R_ARM_THM_CALL relocation).
4531                        ? arm_stub_long_branch_any_thumb_pic
4532                        // On V4T, use Thumb code only.
4533                        : arm_stub_long_branch_v4t_thumb_thumb_pic)
4534
4535                     // non-PIC stubs.
4536                     : ((may_use_blx
4537                         && (r_type == elfcpp::R_ARM_THM_CALL))
4538                        ? arm_stub_long_branch_any_any // V5T and above.
4539                        : arm_stub_long_branch_v4t_thumb_thumb); // V4T.
4540                 }
4541               else
4542                 {
4543                   stub_type = (parameters->options().shared()
4544                                || should_force_pic_veneer)
4545                     ? arm_stub_long_branch_thumb_only_pic       // PIC stub.
4546                     : arm_stub_long_branch_thumb_only;  // non-PIC stub.
4547                 }
4548             }
4549           else
4550             {
4551               // Thumb to arm.
4552              
4553               // FIXME: We should check that the input section is from an
4554               // object that has interwork enabled.
4555
4556               stub_type = (parameters->options().shared()
4557                            || should_force_pic_veneer)
4558                 // PIC stubs.
4559                 ? ((may_use_blx
4560                     && (r_type == elfcpp::R_ARM_THM_CALL))
4561                    ? arm_stub_long_branch_any_arm_pic   // V5T and above.
4562                    : arm_stub_long_branch_v4t_thumb_arm_pic)    // V4T.
4563
4564                 // non-PIC stubs.
4565                 : ((may_use_blx
4566                     && (r_type == elfcpp::R_ARM_THM_CALL))
4567                    ? arm_stub_long_branch_any_any       // V5T and above.
4568                    : arm_stub_long_branch_v4t_thumb_arm);       // V4T.
4569
4570               // Handle v4t short branches.
4571               if ((stub_type == arm_stub_long_branch_v4t_thumb_arm)
4572                   && (branch_offset <= THM_MAX_FWD_BRANCH_OFFSET)
4573                   && (branch_offset >= THM_MAX_BWD_BRANCH_OFFSET))
4574                 stub_type = arm_stub_short_branch_v4t_thumb_arm;
4575             }
4576         }
4577     }
4578   else if (r_type == elfcpp::R_ARM_CALL
4579            || r_type == elfcpp::R_ARM_JUMP24
4580            || r_type == elfcpp::R_ARM_PLT32)
4581     {
4582       branch_offset = static_cast<int64_t>(destination) - location;
4583       if (target_is_thumb)
4584         {
4585           // Arm to thumb.
4586
4587           // FIXME: We should check that the input section is from an
4588           // object that has interwork enabled.
4589
4590           // We have an extra 2-bytes reach because of
4591           // the mode change (bit 24 (H) of BLX encoding).
4592           if (branch_offset > (ARM_MAX_FWD_BRANCH_OFFSET + 2)
4593               || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET)
4594               || ((r_type == elfcpp::R_ARM_CALL) && !may_use_blx)
4595               || (r_type == elfcpp::R_ARM_JUMP24)
4596               || (r_type == elfcpp::R_ARM_PLT32))
4597             {
4598               stub_type = (parameters->options().shared()
4599                            || should_force_pic_veneer)
4600                 // PIC stubs.
4601                 ? (may_use_blx
4602                    ? arm_stub_long_branch_any_thumb_pic// V5T and above.
4603                    : arm_stub_long_branch_v4t_arm_thumb_pic)    // V4T stub.
4604
4605                 // non-PIC stubs.
4606                 : (may_use_blx
4607                    ? arm_stub_long_branch_any_any       // V5T and above.
4608                    : arm_stub_long_branch_v4t_arm_thumb);       // V4T.
4609             }
4610         }
4611       else
4612         {
4613           // Arm to arm.
4614           if (branch_offset > ARM_MAX_FWD_BRANCH_OFFSET
4615               || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET))
4616             {
4617               stub_type = (parameters->options().shared()
4618                            || should_force_pic_veneer)
4619                 ? arm_stub_long_branch_any_arm_pic      // PIC stubs.
4620                 : arm_stub_long_branch_any_any;         /// non-PIC.
4621             }
4622         }
4623     }
4624
4625   return stub_type;
4626 }
4627
4628 // Cortex_a8_stub methods.
4629
4630 // Return the instruction for a THUMB16_SPECIAL_TYPE instruction template.
4631 // I is the position of the instruction template in the stub template.
4632
4633 uint16_t
4634 Cortex_a8_stub::do_thumb16_special(size_t i)
4635 {
4636   // The only use of this is to copy condition code from a conditional
4637   // branch being worked around to the corresponding conditional branch in
4638   // to the stub.
4639   gold_assert(this->stub_template()->type() == arm_stub_a8_veneer_b_cond
4640               && i == 0);
4641   uint16_t data = this->stub_template()->insns()[i].data();
4642   gold_assert((data & 0xff00U) == 0xd000U);
4643   data |= ((this->original_insn_ >> 22) & 0xf) << 8;
4644   return data;
4645 }
4646
4647 // Stub_factory methods.
4648
4649 Stub_factory::Stub_factory()
4650 {
4651   // The instruction template sequences are declared as static
4652   // objects and initialized first time the constructor runs.
4653  
4654   // Arm/Thumb -> Arm/Thumb long branch stub. On V5T and above, use blx
4655   // to reach the stub if necessary.
4656   static const Insn_template elf32_arm_stub_long_branch_any_any[] =
4657     {
4658       Insn_template::arm_insn(0xe51ff004),      // ldr   pc, [pc, #-4]
4659       Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4660                                                 // dcd   R_ARM_ABS32(X)
4661     };
4662   
4663   // V4T Arm -> Thumb long branch stub. Used on V4T where blx is not
4664   // available.
4665   static const Insn_template elf32_arm_stub_long_branch_v4t_arm_thumb[] =
4666     {
4667       Insn_template::arm_insn(0xe59fc000),      // ldr   ip, [pc, #0]
4668       Insn_template::arm_insn(0xe12fff1c),      // bx    ip
4669       Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4670                                                 // dcd   R_ARM_ABS32(X)
4671     };
4672   
4673   // Thumb -> Thumb long branch stub. Used on M-profile architectures.
4674   static const Insn_template elf32_arm_stub_long_branch_thumb_only[] =
4675     {
4676       Insn_template::thumb16_insn(0xb401),      // push {r0}
4677       Insn_template::thumb16_insn(0x4802),      // ldr  r0, [pc, #8]
4678       Insn_template::thumb16_insn(0x4684),      // mov  ip, r0
4679       Insn_template::thumb16_insn(0xbc01),      // pop  {r0}
4680       Insn_template::thumb16_insn(0x4760),      // bx   ip
4681       Insn_template::thumb16_insn(0xbf00),      // nop
4682       Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4683                                                 // dcd  R_ARM_ABS32(X)
4684     };
4685   
4686   // V4T Thumb -> Thumb long branch stub. Using the stack is not
4687   // allowed.
4688   static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_thumb[] =
4689     {
4690       Insn_template::thumb16_insn(0x4778),      // bx   pc
4691       Insn_template::thumb16_insn(0x46c0),      // nop
4692       Insn_template::arm_insn(0xe59fc000),      // ldr  ip, [pc, #0]
4693       Insn_template::arm_insn(0xe12fff1c),      // bx   ip
4694       Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4695                                                 // dcd  R_ARM_ABS32(X)
4696     };
4697   
4698   // V4T Thumb -> ARM long branch stub. Used on V4T where blx is not
4699   // available.
4700   static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_arm[] =
4701     {
4702       Insn_template::thumb16_insn(0x4778),      // bx   pc
4703       Insn_template::thumb16_insn(0x46c0),      // nop
4704       Insn_template::arm_insn(0xe51ff004),      // ldr   pc, [pc, #-4]
4705       Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4706                                                 // dcd   R_ARM_ABS32(X)
4707     };
4708   
4709   // V4T Thumb -> ARM short branch stub. Shorter variant of the above
4710   // one, when the destination is close enough.
4711   static const Insn_template elf32_arm_stub_short_branch_v4t_thumb_arm[] =
4712     {
4713       Insn_template::thumb16_insn(0x4778),              // bx   pc
4714       Insn_template::thumb16_insn(0x46c0),              // nop
4715       Insn_template::arm_rel_insn(0xea000000, -8),      // b    (X-8)
4716     };
4717   
4718   // ARM/Thumb -> ARM long branch stub, PIC.  On V5T and above, use
4719   // blx to reach the stub if necessary.
4720   static const Insn_template elf32_arm_stub_long_branch_any_arm_pic[] =
4721     {
4722       Insn_template::arm_insn(0xe59fc000),      // ldr   r12, [pc]
4723       Insn_template::arm_insn(0xe08ff00c),      // add   pc, pc, ip
4724       Insn_template::data_word(0, elfcpp::R_ARM_REL32, -4),
4725                                                 // dcd   R_ARM_REL32(X-4)
4726     };
4727   
4728   // ARM/Thumb -> Thumb long branch stub, PIC.  On V5T and above, use
4729   // blx to reach the stub if necessary.  We can not add into pc;
4730   // it is not guaranteed to mode switch (different in ARMv6 and
4731   // ARMv7).
4732   static const Insn_template elf32_arm_stub_long_branch_any_thumb_pic[] =
4733     {
4734       Insn_template::arm_insn(0xe59fc004),      // ldr   r12, [pc, #4]
4735       Insn_template::arm_insn(0xe08fc00c),      // add   ip, pc, ip
4736       Insn_template::arm_insn(0xe12fff1c),      // bx    ip
4737       Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
4738                                                 // dcd   R_ARM_REL32(X)
4739     };
4740   
4741   // V4T ARM -> ARM long branch stub, PIC.
4742   static const Insn_template elf32_arm_stub_long_branch_v4t_arm_thumb_pic[] =
4743     {
4744       Insn_template::arm_insn(0xe59fc004),      // ldr   ip, [pc, #4]
4745       Insn_template::arm_insn(0xe08fc00c),      // add   ip, pc, ip
4746       Insn_template::arm_insn(0xe12fff1c),      // bx    ip
4747       Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
4748                                                 // dcd   R_ARM_REL32(X)
4749     };
4750   
4751   // V4T Thumb -> ARM long branch stub, PIC.
4752   static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_arm_pic[] =
4753     {
4754       Insn_template::thumb16_insn(0x4778),      // bx   pc
4755       Insn_template::thumb16_insn(0x46c0),      // nop
4756       Insn_template::arm_insn(0xe59fc000),      // ldr  ip, [pc, #0]
4757       Insn_template::arm_insn(0xe08cf00f),      // add  pc, ip, pc
4758       Insn_template::data_word(0, elfcpp::R_ARM_REL32, -4),
4759                                                 // dcd  R_ARM_REL32(X)
4760     };
4761   
4762   // Thumb -> Thumb long branch stub, PIC. Used on M-profile
4763   // architectures.
4764   static const Insn_template elf32_arm_stub_long_branch_thumb_only_pic[] =
4765     {
4766       Insn_template::thumb16_insn(0xb401),      // push {r0}
4767       Insn_template::thumb16_insn(0x4802),      // ldr  r0, [pc, #8]
4768       Insn_template::thumb16_insn(0x46fc),      // mov  ip, pc
4769       Insn_template::thumb16_insn(0x4484),      // add  ip, r0
4770       Insn_template::thumb16_insn(0xbc01),      // pop  {r0}
4771       Insn_template::thumb16_insn(0x4760),      // bx   ip
4772       Insn_template::data_word(0, elfcpp::R_ARM_REL32, 4),
4773                                                 // dcd  R_ARM_REL32(X)
4774     };
4775   
4776   // V4T Thumb -> Thumb long branch stub, PIC. Using the stack is not
4777   // allowed.
4778   static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_thumb_pic[] =
4779     {
4780       Insn_template::thumb16_insn(0x4778),      // bx   pc
4781       Insn_template::thumb16_insn(0x46c0),      // nop
4782       Insn_template::arm_insn(0xe59fc004),      // ldr  ip, [pc, #4]
4783       Insn_template::arm_insn(0xe08fc00c),      // add   ip, pc, ip
4784       Insn_template::arm_insn(0xe12fff1c),      // bx   ip
4785       Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
4786                                                 // dcd  R_ARM_REL32(X)
4787     };
4788   
4789   // Cortex-A8 erratum-workaround stubs.
4790   
4791   // Stub used for conditional branches (which may be beyond +/-1MB away,
4792   // so we can't use a conditional branch to reach this stub).
4793   
4794   // original code:
4795   //
4796   //    b<cond> X
4797   // after:
4798   //
4799   static const Insn_template elf32_arm_stub_a8_veneer_b_cond[] =
4800     {
4801       Insn_template::thumb16_bcond_insn(0xd001),        //      b<cond>.n true
4802       Insn_template::thumb32_b_insn(0xf000b800, -4),    //      b.w after
4803       Insn_template::thumb32_b_insn(0xf000b800, -4)     // true:
4804                                                         //      b.w X
4805     };
4806   
4807   // Stub used for b.w and bl.w instructions.
4808   
4809   static const Insn_template elf32_arm_stub_a8_veneer_b[] =
4810     {
4811       Insn_template::thumb32_b_insn(0xf000b800, -4)     // b.w dest
4812     };
4813   
4814   static const Insn_template elf32_arm_stub_a8_veneer_bl[] =
4815     {
4816       Insn_template::thumb32_b_insn(0xf000b800, -4)     // b.w dest
4817     };
4818   
4819   // Stub used for Thumb-2 blx.w instructions.  We modified the original blx.w
4820   // instruction (which switches to ARM mode) to point to this stub.  Jump to
4821   // the real destination using an ARM-mode branch.
4822   static const Insn_template elf32_arm_stub_a8_veneer_blx[] =
4823     {
4824       Insn_template::arm_rel_insn(0xea000000, -8)       // b dest
4825     };
4826
4827   // Stub used to provide an interworking for R_ARM_V4BX relocation
4828   // (bx r[n] instruction).
4829   static const Insn_template elf32_arm_stub_v4_veneer_bx[] =
4830     {
4831       Insn_template::arm_insn(0xe3100001),              // tst   r<n>, #1
4832       Insn_template::arm_insn(0x01a0f000),              // moveq pc, r<n>
4833       Insn_template::arm_insn(0xe12fff10)               // bx    r<n>
4834     };
4835
4836   // Fill in the stub template look-up table.  Stub templates are constructed
4837   // per instance of Stub_factory for fast look-up without locking
4838   // in a thread-enabled environment.
4839
4840   this->stub_templates_[arm_stub_none] =
4841     new Stub_template(arm_stub_none, NULL, 0);
4842
4843 #define DEF_STUB(x)     \
4844   do \
4845     { \
4846       size_t array_size \
4847         = sizeof(elf32_arm_stub_##x) / sizeof(elf32_arm_stub_##x[0]); \
4848       Stub_type type = arm_stub_##x; \
4849       this->stub_templates_[type] = \
4850         new Stub_template(type, elf32_arm_stub_##x, array_size); \
4851     } \
4852   while (0);
4853
4854   DEF_STUBS
4855 #undef DEF_STUB
4856 }
4857
4858 // Stub_table methods.
4859
4860 // Remove all Cortex-A8 stub.
4861
4862 template<bool big_endian>
4863 void
4864 Stub_table<big_endian>::remove_all_cortex_a8_stubs()
4865 {
4866   for (Cortex_a8_stub_list::iterator p = this->cortex_a8_stubs_.begin();
4867        p != this->cortex_a8_stubs_.end();
4868        ++p)
4869     delete p->second;
4870   this->cortex_a8_stubs_.clear();
4871 }
4872
4873 // Relocate one stub.  This is a helper for Stub_table::relocate_stubs().
4874
4875 template<bool big_endian>
4876 void
4877 Stub_table<big_endian>::relocate_stub(
4878     Stub* stub,
4879     const Relocate_info<32, big_endian>* relinfo,
4880     Target_arm<big_endian>* arm_target,
4881     Output_section* output_section,
4882     unsigned char* view,
4883     Arm_address address,
4884     section_size_type view_size)
4885 {
4886   const Stub_template* stub_template = stub->stub_template();
4887   if (stub_template->reloc_count() != 0)
4888     {
4889       // Adjust view to cover the stub only.
4890       section_size_type offset = stub->offset();
4891       section_size_type stub_size = stub_template->size();
4892       gold_assert(offset + stub_size <= view_size);
4893
4894       arm_target->relocate_stub(stub, relinfo, output_section, view + offset,
4895                                 address + offset, stub_size);
4896     }
4897 }
4898
4899 // Relocate all stubs in this stub table.
4900
4901 template<bool big_endian>
4902 void
4903 Stub_table<big_endian>::relocate_stubs(
4904     const Relocate_info<32, big_endian>* relinfo,
4905     Target_arm<big_endian>* arm_target,
4906     Output_section* output_section,
4907     unsigned char* view,
4908     Arm_address address,
4909     section_size_type view_size)
4910 {
4911   // If we are passed a view bigger than the stub table's.  we need to
4912   // adjust the view.
4913   gold_assert(address == this->address()
4914               && (view_size
4915                   == static_cast<section_size_type>(this->data_size())));
4916
4917   // Relocate all relocation stubs.
4918   for (typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.begin();
4919       p != this->reloc_stubs_.end();
4920       ++p)
4921     this->relocate_stub(p->second, relinfo, arm_target, output_section, view,
4922                         address, view_size);
4923
4924   // Relocate all Cortex-A8 stubs.
4925   for (Cortex_a8_stub_list::iterator p = this->cortex_a8_stubs_.begin();
4926        p != this->cortex_a8_stubs_.end();
4927        ++p)
4928     this->relocate_stub(p->second, relinfo, arm_target, output_section, view,
4929                         address, view_size);
4930
4931   // Relocate all ARM V4BX stubs.
4932   for (Arm_v4bx_stub_list::iterator p = this->arm_v4bx_stubs_.begin();
4933        p != this->arm_v4bx_stubs_.end();
4934        ++p)
4935     {
4936       if (*p != NULL)
4937         this->relocate_stub(*p, relinfo, arm_target, output_section, view,
4938                             address, view_size);
4939     }
4940 }
4941
4942 // Write out the stubs to file.
4943
4944 template<bool big_endian>
4945 void
4946 Stub_table<big_endian>::do_write(Output_file* of)
4947 {
4948   off_t offset = this->offset();
4949   const section_size_type oview_size =
4950     convert_to_section_size_type(this->data_size());
4951   unsigned char* const oview = of->get_output_view(offset, oview_size);
4952
4953   // Write relocation stubs.
4954   for (typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.begin();
4955       p != this->reloc_stubs_.end();
4956       ++p)
4957     {
4958       Reloc_stub* stub = p->second;
4959       Arm_address address = this->address() + stub->offset();
4960       gold_assert(address
4961                   == align_address(address,
4962                                    stub->stub_template()->alignment()));
4963       stub->write(oview + stub->offset(), stub->stub_template()->size(),
4964                   big_endian);
4965     }
4966
4967   // Write Cortex-A8 stubs.
4968   for (Cortex_a8_stub_list::const_iterator p = this->cortex_a8_stubs_.begin();
4969        p != this->cortex_a8_stubs_.end();
4970        ++p)
4971     {
4972       Cortex_a8_stub* stub = p->second;
4973       Arm_address address = this->address() + stub->offset();
4974       gold_assert(address
4975                   == align_address(address,
4976                                    stub->stub_template()->alignment()));
4977       stub->write(oview + stub->offset(), stub->stub_template()->size(),
4978                   big_endian);
4979     }
4980
4981   // Write ARM V4BX relocation stubs.
4982   for (Arm_v4bx_stub_list::const_iterator p = this->arm_v4bx_stubs_.begin();
4983        p != this->arm_v4bx_stubs_.end();
4984        ++p)
4985     {
4986       if (*p == NULL)
4987         continue;
4988
4989       Arm_address address = this->address() + (*p)->offset();
4990       gold_assert(address
4991                   == align_address(address,
4992                                    (*p)->stub_template()->alignment()));
4993       (*p)->write(oview + (*p)->offset(), (*p)->stub_template()->size(),
4994                   big_endian);
4995     }
4996
4997   of->write_output_view(this->offset(), oview_size, oview);
4998 }
4999
5000 // Update the data size and address alignment of the stub table at the end
5001 // of a relaxation pass.   Return true if either the data size or the
5002 // alignment changed in this relaxation pass.
5003
5004 template<bool big_endian>
5005 bool
5006 Stub_table<big_endian>::update_data_size_and_addralign()
5007 {
5008   // Go over all stubs in table to compute data size and address alignment.
5009   off_t size = this->reloc_stubs_size_;
5010   unsigned addralign = this->reloc_stubs_addralign_;
5011
5012   for (Cortex_a8_stub_list::const_iterator p = this->cortex_a8_stubs_.begin();
5013        p != this->cortex_a8_stubs_.end();
5014        ++p)
5015     {
5016       const Stub_template* stub_template = p->second->stub_template();
5017       addralign = std::max(addralign, stub_template->alignment());
5018       size = (align_address(size, stub_template->alignment())
5019               + stub_template->size());
5020     }
5021
5022   for (Arm_v4bx_stub_list::const_iterator p = this->arm_v4bx_stubs_.begin();
5023        p != this->arm_v4bx_stubs_.end();
5024        ++p)
5025     {
5026       if (*p == NULL)
5027         continue;
5028
5029       const Stub_template* stub_template = (*p)->stub_template();
5030       addralign = std::max(addralign, stub_template->alignment());
5031       size = (align_address(size, stub_template->alignment())
5032               + stub_template->size());
5033     }
5034
5035   // Check if either data size or alignment changed in this pass.
5036   // Update prev_data_size_ and prev_addralign_.  These will be used
5037   // as the current data size and address alignment for the next pass.
5038   bool changed = size != this->prev_data_size_;
5039   this->prev_data_size_ = size; 
5040
5041   if (addralign != this->prev_addralign_)
5042     changed = true;
5043   this->prev_addralign_ = addralign;
5044
5045   return changed;
5046 }
5047
5048 // Finalize the stubs.  This sets the offsets of the stubs within the stub
5049 // table.  It also marks all input sections needing Cortex-A8 workaround.
5050
5051 template<bool big_endian>
5052 void
5053 Stub_table<big_endian>::finalize_stubs()
5054 {
5055   off_t off = this->reloc_stubs_size_;
5056   for (Cortex_a8_stub_list::const_iterator p = this->cortex_a8_stubs_.begin();
5057        p != this->cortex_a8_stubs_.end();
5058        ++p)
5059     {
5060       Cortex_a8_stub* stub = p->second;
5061       const Stub_template* stub_template = stub->stub_template();
5062       uint64_t stub_addralign = stub_template->alignment();
5063       off = align_address(off, stub_addralign);
5064       stub->set_offset(off);
5065       off += stub_template->size();
5066
5067       // Mark input section so that we can determine later if a code section
5068       // needs the Cortex-A8 workaround quickly.
5069       Arm_relobj<big_endian>* arm_relobj =
5070         Arm_relobj<big_endian>::as_arm_relobj(stub->relobj());
5071       arm_relobj->mark_section_for_cortex_a8_workaround(stub->shndx());
5072     }
5073
5074   for (Arm_v4bx_stub_list::const_iterator p = this->arm_v4bx_stubs_.begin();
5075       p != this->arm_v4bx_stubs_.end();
5076       ++p)
5077     {
5078       if (*p == NULL)
5079         continue;
5080
5081       const Stub_template* stub_template = (*p)->stub_template();
5082       uint64_t stub_addralign = stub_template->alignment();
5083       off = align_address(off, stub_addralign);
5084       (*p)->set_offset(off);
5085       off += stub_template->size();
5086     }
5087
5088   gold_assert(off <= this->prev_data_size_);
5089 }
5090
5091 // Apply Cortex-A8 workaround to an address range between VIEW_ADDRESS
5092 // and VIEW_ADDRESS + VIEW_SIZE - 1.  VIEW points to the mapped address
5093 // of the address range seen by the linker.
5094
5095 template<bool big_endian>
5096 void
5097 Stub_table<big_endian>::apply_cortex_a8_workaround_to_address_range(
5098     Target_arm<big_endian>* arm_target,
5099     unsigned char* view,
5100     Arm_address view_address,
5101     section_size_type view_size)
5102 {
5103   // Cortex-A8 stubs are sorted by addresses of branches being fixed up.
5104   for (Cortex_a8_stub_list::const_iterator p =
5105          this->cortex_a8_stubs_.lower_bound(view_address);
5106        ((p != this->cortex_a8_stubs_.end())
5107         && (p->first < (view_address + view_size)));
5108        ++p)
5109     {
5110       // We do not store the THUMB bit in the LSB of either the branch address
5111       // or the stub offset.  There is no need to strip the LSB.
5112       Arm_address branch_address = p->first;
5113       const Cortex_a8_stub* stub = p->second;
5114       Arm_address stub_address = this->address() + stub->offset();
5115
5116       // Offset of the branch instruction relative to this view.
5117       section_size_type offset =
5118         convert_to_section_size_type(branch_address - view_address);
5119       gold_assert((offset + 4) <= view_size);
5120
5121       arm_target->apply_cortex_a8_workaround(stub, stub_address,
5122                                              view + offset, branch_address);
5123     }
5124 }
5125
5126 // Arm_input_section methods.
5127
5128 // Initialize an Arm_input_section.
5129
5130 template<bool big_endian>
5131 void
5132 Arm_input_section<big_endian>::init()
5133 {
5134   Relobj* relobj = this->relobj();
5135   unsigned int shndx = this->shndx();
5136
5137   // We have to cache original size, alignment and contents to avoid locking
5138   // the original file.
5139   this->original_addralign_ =
5140     convert_types<uint32_t, uint64_t>(relobj->section_addralign(shndx));
5141
5142   // This is not efficient but we expect only a small number of relaxed
5143   // input sections for stubs.
5144   section_size_type section_size;
5145   const unsigned char* section_contents =
5146     relobj->section_contents(shndx, &section_size, false);
5147   this->original_size_ =
5148     convert_types<uint32_t, uint64_t>(relobj->section_size(shndx));
5149
5150   gold_assert(this->original_contents_ == NULL);
5151   this->original_contents_ = new unsigned char[section_size];
5152   memcpy(this->original_contents_, section_contents, section_size);
5153
5154   // We want to make this look like the original input section after
5155   // output sections are finalized.
5156   Output_section* os = relobj->output_section(shndx);
5157   off_t offset = relobj->output_section_offset(shndx);
5158   gold_assert(os != NULL && !relobj->is_output_section_offset_invalid(shndx));
5159   this->set_address(os->address() + offset);
5160   this->set_file_offset(os->offset() + offset);
5161
5162   this->set_current_data_size(this->original_size_);
5163   this->finalize_data_size();
5164 }
5165
5166 template<bool big_endian>
5167 void
5168 Arm_input_section<big_endian>::do_write(Output_file* of)
5169 {
5170   // We have to write out the original section content.
5171   gold_assert(this->original_contents_ != NULL);
5172   of->write(this->offset(), this->original_contents_,
5173             this->original_size_); 
5174
5175   // If this owns a stub table and it is not empty, write it.
5176   if (this->is_stub_table_owner() && !this->stub_table_->empty())
5177     this->stub_table_->write(of);
5178 }
5179
5180 // Finalize data size.
5181
5182 template<bool big_endian>
5183 void
5184 Arm_input_section<big_endian>::set_final_data_size()
5185 {
5186   off_t off = convert_types<off_t, uint64_t>(this->original_size_);
5187
5188   if (this->is_stub_table_owner())
5189     {
5190       this->stub_table_->finalize_data_size();
5191       off = align_address(off, this->stub_table_->addralign());
5192       off += this->stub_table_->data_size();
5193     }
5194   this->set_data_size(off);
5195 }
5196
5197 // Reset address and file offset.
5198
5199 template<bool big_endian>
5200 void
5201 Arm_input_section<big_endian>::do_reset_address_and_file_offset()
5202 {
5203   // Size of the original input section contents.
5204   off_t off = convert_types<off_t, uint64_t>(this->original_size_);
5205
5206   // If this is a stub table owner, account for the stub table size.
5207   if (this->is_stub_table_owner())
5208     {
5209       Stub_table<big_endian>* stub_table = this->stub_table_;
5210
5211       // Reset the stub table's address and file offset.  The
5212       // current data size for child will be updated after that.
5213       stub_table_->reset_address_and_file_offset();
5214       off = align_address(off, stub_table_->addralign());
5215       off += stub_table->current_data_size();
5216     }
5217
5218   this->set_current_data_size(off);
5219 }
5220
5221 // Arm_exidx_cantunwind methods.
5222
5223 // Write this to Output file OF for a fixed endianness.
5224
5225 template<bool big_endian>
5226 void
5227 Arm_exidx_cantunwind::do_fixed_endian_write(Output_file* of)
5228 {
5229   off_t offset = this->offset();
5230   const section_size_type oview_size = 8;
5231   unsigned char* const oview = of->get_output_view(offset, oview_size);
5232   
5233   typedef typename elfcpp::Swap_unaligned<32, big_endian>::Valtype Valtype;
5234
5235   Output_section* os = this->relobj_->output_section(this->shndx_);
5236   gold_assert(os != NULL);
5237
5238   Arm_relobj<big_endian>* arm_relobj =
5239     Arm_relobj<big_endian>::as_arm_relobj(this->relobj_);
5240   Arm_address output_offset =
5241     arm_relobj->get_output_section_offset(this->shndx_);
5242   Arm_address section_start;
5243   section_size_type section_size;
5244
5245   // Find out the end of the text section referred by this.
5246   if (output_offset != Arm_relobj<big_endian>::invalid_address)
5247     {
5248       section_start = os->address() + output_offset;
5249       const Arm_exidx_input_section* exidx_input_section =
5250         arm_relobj->exidx_input_section_by_link(this->shndx_);
5251       gold_assert(exidx_input_section != NULL);
5252       section_size =
5253         convert_to_section_size_type(exidx_input_section->text_size());
5254     }
5255   else
5256     {
5257       // Currently this only happens for a relaxed section.
5258       const Output_relaxed_input_section* poris =
5259         os->find_relaxed_input_section(this->relobj_, this->shndx_);
5260       gold_assert(poris != NULL);
5261       section_start = poris->address();
5262       section_size = convert_to_section_size_type(poris->data_size());
5263     }
5264
5265   // We always append this to the end of an EXIDX section.
5266   Arm_address output_address = section_start + section_size;
5267
5268   // Write out the entry.  The first word either points to the beginning
5269   // or after the end of a text section.  The second word is the special
5270   // EXIDX_CANTUNWIND value.
5271   uint32_t prel31_offset = output_address - this->address();
5272   if (utils::has_overflow<31>(offset))
5273     gold_error(_("PREL31 overflow in EXIDX_CANTUNWIND entry"));
5274   elfcpp::Swap_unaligned<32, big_endian>::writeval(oview,
5275                                                    prel31_offset & 0x7fffffffU);
5276   elfcpp::Swap_unaligned<32, big_endian>::writeval(oview + 4,
5277                                                    elfcpp::EXIDX_CANTUNWIND);
5278
5279   of->write_output_view(this->offset(), oview_size, oview);
5280 }
5281
5282 // Arm_exidx_merged_section methods.
5283
5284 // Constructor for Arm_exidx_merged_section.
5285 // EXIDX_INPUT_SECTION points to the unmodified EXIDX input section.
5286 // SECTION_OFFSET_MAP points to a section offset map describing how
5287 // parts of the input section are mapped to output.  DELETED_BYTES is
5288 // the number of bytes deleted from the EXIDX input section.
5289
5290 Arm_exidx_merged_section::Arm_exidx_merged_section(
5291     const Arm_exidx_input_section& exidx_input_section,
5292     const Arm_exidx_section_offset_map& section_offset_map,
5293     uint32_t deleted_bytes)
5294   : Output_relaxed_input_section(exidx_input_section.relobj(),
5295                                  exidx_input_section.shndx(),
5296                                  exidx_input_section.addralign()),
5297     exidx_input_section_(exidx_input_section),
5298     section_offset_map_(section_offset_map)
5299 {
5300   // If we retain or discard the whole EXIDX input section,  we would
5301   // not be here.
5302   gold_assert(deleted_bytes != 0
5303               && deleted_bytes != this->exidx_input_section_.size());
5304
5305   // Fix size here so that we do not need to implement set_final_data_size.
5306   uint32_t size = exidx_input_section.size() - deleted_bytes;
5307   this->set_data_size(size);
5308   this->fix_data_size();
5309
5310   // Allocate buffer for section contents and build contents.
5311   this->section_contents_ = new unsigned char[size];
5312 }
5313
5314 // Build the contents of a merged EXIDX output section.
5315
5316 void
5317 Arm_exidx_merged_section::build_contents(
5318     const unsigned char* original_contents,
5319     section_size_type original_size)
5320 {
5321   // Go over spans of input offsets and write only those that are not
5322   // discarded.
5323   section_offset_type in_start = 0;
5324   section_offset_type out_start = 0;
5325   section_offset_type in_max =
5326     convert_types<section_offset_type>(original_size);
5327   section_offset_type out_max =
5328     convert_types<section_offset_type>(this->data_size());
5329   for (Arm_exidx_section_offset_map::const_iterator p =
5330         this->section_offset_map_.begin();
5331       p != this->section_offset_map_.end();
5332       ++p)
5333     {
5334       section_offset_type in_end = p->first;
5335       gold_assert(in_end >= in_start);
5336       section_offset_type out_end = p->second;
5337       size_t in_chunk_size = convert_types<size_t>(in_end - in_start + 1);
5338       if (out_end != -1)
5339         {
5340           size_t out_chunk_size =
5341             convert_types<size_t>(out_end - out_start + 1);
5342
5343           gold_assert(out_chunk_size == in_chunk_size
5344                       && in_end < in_max && out_end < out_max);
5345
5346           memcpy(this->section_contents_ + out_start,
5347                  original_contents + in_start,
5348                  out_chunk_size);
5349           out_start += out_chunk_size;
5350         }
5351       in_start += in_chunk_size;
5352     }
5353 }
5354
5355 // Given an input OBJECT, an input section index SHNDX within that
5356 // object, and an OFFSET relative to the start of that input
5357 // section, return whether or not the corresponding offset within
5358 // the output section is known.  If this function returns true, it
5359 // sets *POUTPUT to the output offset.  The value -1 indicates that
5360 // this input offset is being discarded.
5361
5362 bool
5363 Arm_exidx_merged_section::do_output_offset(
5364     const Relobj* relobj,
5365     unsigned int shndx,
5366     section_offset_type offset,
5367     section_offset_type* poutput) const
5368 {
5369   // We only handle offsets for the original EXIDX input section.
5370   if (relobj != this->exidx_input_section_.relobj()
5371       || shndx != this->exidx_input_section_.shndx())
5372     return false;
5373
5374   section_offset_type section_size =
5375     convert_types<section_offset_type>(this->exidx_input_section_.size());
5376   if (offset < 0 || offset >= section_size)
5377     // Input offset is out of valid range.
5378     *poutput = -1;
5379   else
5380     {
5381       // We need to look up the section offset map to determine the output
5382       // offset.  Find the reference point in map that is first offset
5383       // bigger than or equal to this offset.
5384       Arm_exidx_section_offset_map::const_iterator p =
5385         this->section_offset_map_.lower_bound(offset);
5386
5387       // The section offset maps are build such that this should not happen if
5388       // input offset is in the valid range.
5389       gold_assert(p != this->section_offset_map_.end());
5390
5391       // We need to check if this is dropped.
5392      section_offset_type ref = p->first;
5393      section_offset_type mapped_ref = p->second;
5394
5395       if (mapped_ref != Arm_exidx_input_section::invalid_offset)
5396         // Offset is present in output.
5397         *poutput = mapped_ref + (offset - ref);
5398       else
5399         // Offset is discarded owing to EXIDX entry merging.
5400         *poutput = -1;
5401     }
5402   
5403   return true;
5404 }
5405
5406 // Write this to output file OF.
5407
5408 void
5409 Arm_exidx_merged_section::do_write(Output_file* of)
5410 {
5411   off_t offset = this->offset();
5412   const section_size_type oview_size = this->data_size();
5413   unsigned char* const oview = of->get_output_view(offset, oview_size);
5414   
5415   Output_section* os = this->relobj()->output_section(this->shndx());
5416   gold_assert(os != NULL);
5417
5418   memcpy(oview, this->section_contents_, oview_size);
5419   of->write_output_view(this->offset(), oview_size, oview);
5420 }
5421
5422 // Arm_exidx_fixup methods.
5423
5424 // Append an EXIDX_CANTUNWIND in the current output section if the last entry
5425 // is not an EXIDX_CANTUNWIND entry already.  The new EXIDX_CANTUNWIND entry
5426 // points to the end of the last seen EXIDX section.
5427
5428 void
5429 Arm_exidx_fixup::add_exidx_cantunwind_as_needed()
5430 {
5431   if (this->last_unwind_type_ != UT_EXIDX_CANTUNWIND
5432       && this->last_input_section_ != NULL)
5433     {
5434       Relobj* relobj = this->last_input_section_->relobj();
5435       unsigned int text_shndx = this->last_input_section_->link();
5436       Arm_exidx_cantunwind* cantunwind =
5437         new Arm_exidx_cantunwind(relobj, text_shndx);
5438       this->exidx_output_section_->add_output_section_data(cantunwind);
5439       this->last_unwind_type_ = UT_EXIDX_CANTUNWIND;
5440     }
5441 }
5442
5443 // Process an EXIDX section entry in input.  Return whether this entry
5444 // can be deleted in the output.  SECOND_WORD in the second word of the
5445 // EXIDX entry.
5446
5447 bool
5448 Arm_exidx_fixup::process_exidx_entry(uint32_t second_word)
5449 {
5450   bool delete_entry;
5451   if (second_word == elfcpp::EXIDX_CANTUNWIND)
5452     {
5453       // Merge if previous entry is also an EXIDX_CANTUNWIND.
5454       delete_entry = this->last_unwind_type_ == UT_EXIDX_CANTUNWIND;
5455       this->last_unwind_type_ = UT_EXIDX_CANTUNWIND;
5456     }
5457   else if ((second_word & 0x80000000) != 0)
5458     {
5459       // Inlined unwinding data.  Merge if equal to previous.
5460       delete_entry = (merge_exidx_entries_
5461                       && this->last_unwind_type_ == UT_INLINED_ENTRY
5462                       && this->last_inlined_entry_ == second_word);
5463       this->last_unwind_type_ = UT_INLINED_ENTRY;
5464       this->last_inlined_entry_ = second_word;
5465     }
5466   else
5467     {
5468       // Normal table entry.  In theory we could merge these too,
5469       // but duplicate entries are likely to be much less common.
5470       delete_entry = false;
5471       this->last_unwind_type_ = UT_NORMAL_ENTRY;
5472     }
5473   return delete_entry;
5474 }
5475
5476 // Update the current section offset map during EXIDX section fix-up.
5477 // If there is no map, create one.  INPUT_OFFSET is the offset of a
5478 // reference point, DELETED_BYTES is the number of deleted by in the
5479 // section so far.  If DELETE_ENTRY is true, the reference point and
5480 // all offsets after the previous reference point are discarded.
5481
5482 void
5483 Arm_exidx_fixup::update_offset_map(
5484     section_offset_type input_offset,
5485     section_size_type deleted_bytes,
5486     bool delete_entry)
5487 {
5488   if (this->section_offset_map_ == NULL)
5489     this->section_offset_map_ = new Arm_exidx_section_offset_map();
5490   section_offset_type output_offset;
5491   if (delete_entry)
5492     output_offset = Arm_exidx_input_section::invalid_offset;
5493   else
5494     output_offset = input_offset - deleted_bytes;
5495   (*this->section_offset_map_)[input_offset] = output_offset;
5496 }
5497
5498 // Process EXIDX_INPUT_SECTION for EXIDX entry merging.  Return the number of
5499 // bytes deleted.  SECTION_CONTENTS points to the contents of the EXIDX
5500 // section and SECTION_SIZE is the number of bytes pointed by SECTION_CONTENTS.
5501 // If some entries are merged, also store a pointer to a newly created
5502 // Arm_exidx_section_offset_map object in *PSECTION_OFFSET_MAP.  The caller
5503 // owns the map and is responsible for releasing it after use.
5504
5505 template<bool big_endian>
5506 uint32_t
5507 Arm_exidx_fixup::process_exidx_section(
5508     const Arm_exidx_input_section* exidx_input_section,
5509     const unsigned char* section_contents,
5510     section_size_type section_size,
5511     Arm_exidx_section_offset_map** psection_offset_map)
5512 {
5513   Relobj* relobj = exidx_input_section->relobj();
5514   unsigned shndx = exidx_input_section->shndx();
5515
5516   if ((section_size % 8) != 0)
5517     {
5518       // Something is wrong with this section.  Better not touch it.
5519       gold_error(_("uneven .ARM.exidx section size in %s section %u"),
5520                  relobj->name().c_str(), shndx);
5521       this->last_input_section_ = exidx_input_section;
5522       this->last_unwind_type_ = UT_NONE;
5523       return 0;
5524     }
5525   
5526   uint32_t deleted_bytes = 0;
5527   bool prev_delete_entry = false;
5528   gold_assert(this->section_offset_map_ == NULL);
5529
5530   for (section_size_type i = 0; i < section_size; i += 8)
5531     {
5532       typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
5533       const Valtype* wv =
5534           reinterpret_cast<const Valtype*>(section_contents + i + 4);
5535       uint32_t second_word = elfcpp::Swap<32, big_endian>::readval(wv);
5536
5537       bool delete_entry = this->process_exidx_entry(second_word);
5538
5539       // Entry deletion causes changes in output offsets.  We use a std::map
5540       // to record these.  And entry (x, y) means input offset x
5541       // is mapped to output offset y.  If y is invalid_offset, then x is
5542       // dropped in the output.  Because of the way std::map::lower_bound
5543       // works, we record the last offset in a region w.r.t to keeping or
5544       // dropping.  If there is no entry (x0, y0) for an input offset x0,
5545       // the output offset y0 of it is determined by the output offset y1 of
5546       // the smallest input offset x1 > x0 that there is an (x1, y1) entry
5547       // in the map.  If y1 is not -1, then y0 = y1 + x0 - x1.  Otherwise, y1
5548       // y0 is also -1.
5549       if (delete_entry != prev_delete_entry && i != 0)
5550         this->update_offset_map(i - 1, deleted_bytes, prev_delete_entry);
5551
5552       // Update total deleted bytes for this entry.
5553       if (delete_entry)
5554         deleted_bytes += 8;
5555
5556       prev_delete_entry = delete_entry;
5557     }
5558   
5559   // If section offset map is not NULL, make an entry for the end of
5560   // section.
5561   if (this->section_offset_map_ != NULL)
5562     update_offset_map(section_size - 1, deleted_bytes, prev_delete_entry);
5563
5564   *psection_offset_map = this->section_offset_map_;
5565   this->section_offset_map_ = NULL;
5566   this->last_input_section_ = exidx_input_section;
5567   
5568   // Set the first output text section so that we can link the EXIDX output
5569   // section to it.  Ignore any EXIDX input section that is completely merged.
5570   if (this->first_output_text_section_ == NULL
5571       && deleted_bytes != section_size)
5572     {
5573       unsigned int link = exidx_input_section->link();
5574       Output_section* os = relobj->output_section(link);
5575       gold_assert(os != NULL);
5576       this->first_output_text_section_ = os;
5577     }
5578
5579   return deleted_bytes;
5580 }
5581
5582 // Arm_output_section methods.
5583
5584 // Create a stub group for input sections from BEGIN to END.  OWNER
5585 // points to the input section to be the owner a new stub table.
5586
5587 template<bool big_endian>
5588 void
5589 Arm_output_section<big_endian>::create_stub_group(
5590   Input_section_list::const_iterator begin,
5591   Input_section_list::const_iterator end,
5592   Input_section_list::const_iterator owner,
5593   Target_arm<big_endian>* target,
5594   std::vector<Output_relaxed_input_section*>* new_relaxed_sections,
5595   const Task* task)
5596 {
5597   // We use a different kind of relaxed section in an EXIDX section.
5598   // The static casting from Output_relaxed_input_section to
5599   // Arm_input_section is invalid in an EXIDX section.  We are okay
5600   // because we should not be calling this for an EXIDX section. 
5601   gold_assert(this->type() != elfcpp::SHT_ARM_EXIDX);
5602
5603   // Currently we convert ordinary input sections into relaxed sections only
5604   // at this point but we may want to support creating relaxed input section
5605   // very early.  So we check here to see if owner is already a relaxed
5606   // section.
5607   
5608   Arm_input_section<big_endian>* arm_input_section;
5609   if (owner->is_relaxed_input_section())
5610     {
5611       arm_input_section =
5612         Arm_input_section<big_endian>::as_arm_input_section(
5613           owner->relaxed_input_section());
5614     }
5615   else
5616     {
5617       gold_assert(owner->is_input_section());
5618       // Create a new relaxed input section.  We need to lock the original
5619       // file.
5620       Task_lock_obj<Object> tl(task, owner->relobj());
5621       arm_input_section =
5622         target->new_arm_input_section(owner->relobj(), owner->shndx());
5623       new_relaxed_sections->push_back(arm_input_section);
5624     }
5625
5626   // Create a stub table.
5627   Stub_table<big_endian>* stub_table =
5628     target->new_stub_table(arm_input_section);
5629
5630   arm_input_section->set_stub_table(stub_table);
5631   
5632   Input_section_list::const_iterator p = begin;
5633   Input_section_list::const_iterator prev_p;
5634
5635   // Look for input sections or relaxed input sections in [begin ... end].
5636   do
5637     {
5638       if (p->is_input_section() || p->is_relaxed_input_section())
5639         {
5640           // The stub table information for input sections live
5641           // in their objects.
5642           Arm_relobj<big_endian>* arm_relobj =
5643             Arm_relobj<big_endian>::as_arm_relobj(p->relobj());
5644           arm_relobj->set_stub_table(p->shndx(), stub_table);
5645         }
5646       prev_p = p++;
5647     }
5648   while (prev_p != end);
5649 }
5650
5651 // Group input sections for stub generation.  GROUP_SIZE is roughly the limit
5652 // of stub groups.  We grow a stub group by adding input section until the
5653 // size is just below GROUP_SIZE.  The last input section will be converted
5654 // into a stub table.  If STUB_ALWAYS_AFTER_BRANCH is false, we also add
5655 // input section after the stub table, effectively double the group size.
5656 // 
5657 // This is similar to the group_sections() function in elf32-arm.c but is
5658 // implemented differently.
5659
5660 template<bool big_endian>
5661 void
5662 Arm_output_section<big_endian>::group_sections(
5663     section_size_type group_size,
5664     bool stubs_always_after_branch,
5665     Target_arm<big_endian>* target,
5666     const Task* task)
5667 {
5668   // We only care about sections containing code.
5669   if ((this->flags() & elfcpp::SHF_EXECINSTR) == 0)
5670     return;
5671
5672   // States for grouping.
5673   typedef enum
5674   {
5675     // No group is being built.
5676     NO_GROUP,
5677     // A group is being built but the stub table is not found yet.
5678     // We keep group a stub group until the size is just under GROUP_SIZE.
5679     // The last input section in the group will be used as the stub table.
5680     FINDING_STUB_SECTION,
5681     // A group is being built and we have already found a stub table.
5682     // We enter this state to grow a stub group by adding input section
5683     // after the stub table.  This effectively doubles the group size.
5684     HAS_STUB_SECTION
5685   } State;
5686
5687   // Any newly created relaxed sections are stored here.
5688   std::vector<Output_relaxed_input_section*> new_relaxed_sections;
5689
5690   State state = NO_GROUP;
5691   section_size_type off = 0;
5692   section_size_type group_begin_offset = 0;
5693   section_size_type group_end_offset = 0;
5694   section_size_type stub_table_end_offset = 0;
5695   Input_section_list::const_iterator group_begin =
5696     this->input_sections().end();
5697   Input_section_list::const_iterator stub_table =
5698     this->input_sections().end();
5699   Input_section_list::const_iterator group_end = this->input_sections().end();
5700   for (Input_section_list::const_iterator p = this->input_sections().begin();
5701        p != this->input_sections().end();
5702        ++p)
5703     {
5704       section_size_type section_begin_offset =
5705         align_address(off, p->addralign());
5706       section_size_type section_end_offset =
5707         section_begin_offset + p->data_size(); 
5708       
5709       // Check to see if we should group the previously seen sections.
5710       switch (state)
5711         {
5712         case NO_GROUP:
5713           break;
5714
5715         case FINDING_STUB_SECTION:
5716           // Adding this section makes the group larger than GROUP_SIZE.
5717           if (section_end_offset - group_begin_offset >= group_size)
5718             {
5719               if (stubs_always_after_branch)
5720                 {       
5721                   gold_assert(group_end != this->input_sections().end());
5722                   this->create_stub_group(group_begin, group_end, group_end,
5723                                           target, &new_relaxed_sections,
5724                                           task);
5725                   state = NO_GROUP;
5726                 }
5727               else
5728                 {
5729                   // But wait, there's more!  Input sections up to
5730                   // stub_group_size bytes after the stub table can be
5731                   // handled by it too.
5732                   state = HAS_STUB_SECTION;
5733                   stub_table = group_end;
5734                   stub_table_end_offset = group_end_offset;
5735                 }
5736             }
5737             break;
5738
5739         case HAS_STUB_SECTION:
5740           // Adding this section makes the post stub-section group larger
5741           // than GROUP_SIZE.
5742           if (section_end_offset - stub_table_end_offset >= group_size)
5743            {
5744              gold_assert(group_end != this->input_sections().end());
5745              this->create_stub_group(group_begin, group_end, stub_table,
5746                                      target, &new_relaxed_sections, task);
5747              state = NO_GROUP;
5748            }
5749            break;
5750
5751           default:
5752             gold_unreachable();
5753         }       
5754
5755       // If we see an input section and currently there is no group, start
5756       // a new one.  Skip any empty sections.  We look at the data size
5757       // instead of calling p->relobj()->section_size() to avoid locking.
5758       if ((p->is_input_section() || p->is_relaxed_input_section())
5759           && (p->data_size() != 0))
5760         {
5761           if (state == NO_GROUP)
5762             {
5763               state = FINDING_STUB_SECTION;
5764               group_begin = p;
5765               group_begin_offset = section_begin_offset;
5766             }
5767
5768           // Keep track of the last input section seen.
5769           group_end = p;
5770           group_end_offset = section_end_offset;
5771         }
5772
5773       off = section_end_offset;
5774     }
5775
5776   // Create a stub group for any ungrouped sections.
5777   if (state == FINDING_STUB_SECTION || state == HAS_STUB_SECTION)
5778     {
5779       gold_assert(group_end != this->input_sections().end());
5780       this->create_stub_group(group_begin, group_end,
5781                               (state == FINDING_STUB_SECTION
5782                                ? group_end
5783                                : stub_table),
5784                                target, &new_relaxed_sections, task);
5785     }
5786
5787   // Convert input section into relaxed input section in a batch.
5788   if (!new_relaxed_sections.empty())
5789     this->convert_input_sections_to_relaxed_sections(new_relaxed_sections);
5790
5791   // Update the section offsets
5792   for (size_t i = 0; i < new_relaxed_sections.size(); ++i)
5793     {
5794       Arm_relobj<big_endian>* arm_relobj =
5795         Arm_relobj<big_endian>::as_arm_relobj(
5796           new_relaxed_sections[i]->relobj());
5797       unsigned int shndx = new_relaxed_sections[i]->shndx();
5798       // Tell Arm_relobj that this input section is converted.
5799       arm_relobj->convert_input_section_to_relaxed_section(shndx);
5800     }
5801 }
5802
5803 // Append non empty text sections in this to LIST in ascending
5804 // order of their position in this.
5805
5806 template<bool big_endian>
5807 void
5808 Arm_output_section<big_endian>::append_text_sections_to_list(
5809     Text_section_list* list)
5810 {
5811   gold_assert((this->flags() & elfcpp::SHF_ALLOC) != 0);
5812
5813   for (Input_section_list::const_iterator p = this->input_sections().begin();
5814        p != this->input_sections().end();
5815        ++p)
5816     {
5817       // We only care about plain or relaxed input sections.  We also
5818       // ignore any merged sections.
5819       if (p->is_input_section() || p->is_relaxed_input_section())
5820         list->push_back(Text_section_list::value_type(p->relobj(),
5821                                                       p->shndx()));
5822     }
5823 }
5824
5825 template<bool big_endian>
5826 void
5827 Arm_output_section<big_endian>::fix_exidx_coverage(
5828     Layout* layout,
5829     const Text_section_list& sorted_text_sections,
5830     Symbol_table* symtab,
5831     bool merge_exidx_entries,
5832     const Task* task)
5833 {
5834   // We should only do this for the EXIDX output section.
5835   gold_assert(this->type() == elfcpp::SHT_ARM_EXIDX);
5836
5837   // We don't want the relaxation loop to undo these changes, so we discard
5838   // the current saved states and take another one after the fix-up.
5839   this->discard_states();
5840
5841   // Remove all input sections.
5842   uint64_t address = this->address();
5843   typedef std::list<Output_section::Input_section> Input_section_list;
5844   Input_section_list input_sections;
5845   this->reset_address_and_file_offset();
5846   this->get_input_sections(address, std::string(""), &input_sections);
5847
5848   if (!this->input_sections().empty())
5849     gold_error(_("Found non-EXIDX input sections in EXIDX output section"));
5850   
5851   // Go through all the known input sections and record them.
5852   typedef Unordered_set<Section_id, Section_id_hash> Section_id_set;
5853   typedef Unordered_map<Section_id, const Output_section::Input_section*,
5854                         Section_id_hash> Text_to_exidx_map;
5855   Text_to_exidx_map text_to_exidx_map;
5856   for (Input_section_list::const_iterator p = input_sections.begin();
5857        p != input_sections.end();
5858        ++p)
5859     {
5860       // This should never happen.  At this point, we should only see
5861       // plain EXIDX input sections.
5862       gold_assert(!p->is_relaxed_input_section());
5863       text_to_exidx_map[Section_id(p->relobj(), p->shndx())] = &(*p);
5864     }
5865
5866   Arm_exidx_fixup exidx_fixup(this, merge_exidx_entries);
5867
5868   // Go over the sorted text sections.
5869   typedef Unordered_set<Section_id, Section_id_hash> Section_id_set;
5870   Section_id_set processed_input_sections;
5871   for (Text_section_list::const_iterator p = sorted_text_sections.begin();
5872        p != sorted_text_sections.end();
5873        ++p)
5874     {
5875       Relobj* relobj = p->first;
5876       unsigned int shndx = p->second;
5877
5878       Arm_relobj<big_endian>* arm_relobj =
5879          Arm_relobj<big_endian>::as_arm_relobj(relobj);
5880       const Arm_exidx_input_section* exidx_input_section =
5881          arm_relobj->exidx_input_section_by_link(shndx);
5882
5883       // If this text section has no EXIDX section or if the EXIDX section
5884       // has errors, force an EXIDX_CANTUNWIND entry pointing to the end
5885       // of the last seen EXIDX section.
5886       if (exidx_input_section == NULL || exidx_input_section->has_errors())
5887         {
5888           exidx_fixup.add_exidx_cantunwind_as_needed();
5889           continue;
5890         }
5891
5892       Relobj* exidx_relobj = exidx_input_section->relobj();
5893       unsigned int exidx_shndx = exidx_input_section->shndx();
5894       Section_id sid(exidx_relobj, exidx_shndx);
5895       Text_to_exidx_map::const_iterator iter = text_to_exidx_map.find(sid);
5896       if (iter == text_to_exidx_map.end())
5897         {
5898           // This is odd.  We have not seen this EXIDX input section before.
5899           // We cannot do fix-up.  If we saw a SECTIONS clause in a script,
5900           // issue a warning instead.  We assume the user knows what he
5901           // or she is doing.  Otherwise, this is an error.
5902           if (layout->script_options()->saw_sections_clause())
5903             gold_warning(_("unwinding may not work because EXIDX input section"
5904                            " %u of %s is not in EXIDX output section"),
5905                          exidx_shndx, exidx_relobj->name().c_str());
5906           else
5907             gold_error(_("unwinding may not work because EXIDX input section"
5908                          " %u of %s is not in EXIDX output section"),
5909                        exidx_shndx, exidx_relobj->name().c_str());
5910
5911           exidx_fixup.add_exidx_cantunwind_as_needed();
5912           continue;
5913         }
5914
5915       // We need to access the contents of the EXIDX section, lock the
5916       // object here.
5917       Task_lock_obj<Object> tl(task, exidx_relobj);
5918       section_size_type exidx_size;
5919       const unsigned char* exidx_contents =
5920         exidx_relobj->section_contents(exidx_shndx, &exidx_size, false); 
5921
5922       // Fix up coverage and append input section to output data list.
5923       Arm_exidx_section_offset_map* section_offset_map = NULL;
5924       uint32_t deleted_bytes =
5925         exidx_fixup.process_exidx_section<big_endian>(exidx_input_section,
5926                                                       exidx_contents,
5927                                                       exidx_size,
5928                                                       &section_offset_map);
5929
5930       if (deleted_bytes == exidx_input_section->size())
5931         {
5932           // The whole EXIDX section got merged.  Remove it from output.
5933           gold_assert(section_offset_map == NULL);
5934           exidx_relobj->set_output_section(exidx_shndx, NULL);
5935
5936           // All local symbols defined in this input section will be dropped.
5937           // We need to adjust output local symbol count.
5938           arm_relobj->set_output_local_symbol_count_needs_update();
5939         }
5940       else if (deleted_bytes > 0)
5941         {
5942           // Some entries are merged.  We need to convert this EXIDX input
5943           // section into a relaxed section.
5944           gold_assert(section_offset_map != NULL);
5945
5946           Arm_exidx_merged_section* merged_section =
5947             new Arm_exidx_merged_section(*exidx_input_section,
5948                                          *section_offset_map, deleted_bytes);
5949           merged_section->build_contents(exidx_contents, exidx_size);
5950
5951           const std::string secname = exidx_relobj->section_name(exidx_shndx);
5952           this->add_relaxed_input_section(layout, merged_section, secname);
5953           arm_relobj->convert_input_section_to_relaxed_section(exidx_shndx);
5954
5955           // All local symbols defined in discarded portions of this input
5956           // section will be dropped.  We need to adjust output local symbol
5957           // count.
5958           arm_relobj->set_output_local_symbol_count_needs_update();
5959         }
5960       else
5961         {
5962           // Just add back the EXIDX input section.
5963           gold_assert(section_offset_map == NULL);
5964           const Output_section::Input_section* pis = iter->second;
5965           gold_assert(pis->is_input_section());
5966           this->add_script_input_section(*pis);
5967         }
5968
5969       processed_input_sections.insert(Section_id(exidx_relobj, exidx_shndx)); 
5970     }
5971
5972   // Insert an EXIDX_CANTUNWIND entry at the end of output if necessary.
5973   exidx_fixup.add_exidx_cantunwind_as_needed();
5974
5975   // Remove any known EXIDX input sections that are not processed.
5976   for (Input_section_list::const_iterator p = input_sections.begin();
5977        p != input_sections.end();
5978        ++p)
5979     {
5980       if (processed_input_sections.find(Section_id(p->relobj(), p->shndx()))
5981           == processed_input_sections.end())
5982         {
5983           // We discard a known EXIDX section because its linked
5984           // text section has been folded by ICF.  We also discard an
5985           // EXIDX section with error, the output does not matter in this
5986           // case.  We do this to avoid triggering asserts.
5987           Arm_relobj<big_endian>* arm_relobj =
5988             Arm_relobj<big_endian>::as_arm_relobj(p->relobj());
5989           const Arm_exidx_input_section* exidx_input_section =
5990             arm_relobj->exidx_input_section_by_shndx(p->shndx());
5991           gold_assert(exidx_input_section != NULL);
5992           if (!exidx_input_section->has_errors())
5993             {
5994               unsigned int text_shndx = exidx_input_section->link();
5995               gold_assert(symtab->is_section_folded(p->relobj(), text_shndx));
5996             }
5997
5998           // Remove this from link.  We also need to recount the
5999           // local symbols.
6000           p->relobj()->set_output_section(p->shndx(), NULL);
6001           arm_relobj->set_output_local_symbol_count_needs_update();
6002         }
6003     }
6004     
6005   // Link exidx output section to the first seen output section and
6006   // set correct entry size.
6007   this->set_link_section(exidx_fixup.first_output_text_section());
6008   this->set_entsize(8);
6009
6010   // Make changes permanent.
6011   this->save_states();
6012   this->set_section_offsets_need_adjustment();
6013 }
6014
6015 // Link EXIDX output sections to text output sections.
6016
6017 template<bool big_endian>
6018 void
6019 Arm_output_section<big_endian>::set_exidx_section_link()
6020 {
6021   gold_assert(this->type() == elfcpp::SHT_ARM_EXIDX);
6022   if (!this->input_sections().empty())
6023     {
6024       Input_section_list::const_iterator p = this->input_sections().begin();
6025       Arm_relobj<big_endian>* arm_relobj =
6026         Arm_relobj<big_endian>::as_arm_relobj(p->relobj());
6027       unsigned exidx_shndx = p->shndx();
6028       const Arm_exidx_input_section* exidx_input_section =
6029         arm_relobj->exidx_input_section_by_shndx(exidx_shndx);
6030       gold_assert(exidx_input_section != NULL);
6031       unsigned int text_shndx = exidx_input_section->link();
6032       Output_section* os = arm_relobj->output_section(text_shndx);
6033       this->set_link_section(os);
6034     }
6035 }
6036
6037 // Arm_relobj methods.
6038
6039 // Determine if an input section is scannable for stub processing.  SHDR is
6040 // the header of the section and SHNDX is the section index.  OS is the output
6041 // section for the input section and SYMTAB is the global symbol table used to
6042 // look up ICF information.
6043
6044 template<bool big_endian>
6045 bool
6046 Arm_relobj<big_endian>::section_is_scannable(
6047     const elfcpp::Shdr<32, big_endian>& shdr,
6048     unsigned int shndx,
6049     const Output_section* os,
6050     const Symbol_table* symtab)
6051 {
6052   // Skip any empty sections, unallocated sections or sections whose
6053   // type are not SHT_PROGBITS.
6054   if (shdr.get_sh_size() == 0
6055       || (shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0
6056       || shdr.get_sh_type() != elfcpp::SHT_PROGBITS)
6057     return false;
6058
6059   // Skip any discarded or ICF'ed sections.
6060   if (os == NULL || symtab->is_section_folded(this, shndx))
6061     return false;
6062
6063   // If this requires special offset handling, check to see if it is
6064   // a relaxed section.  If this is not, then it is a merged section that
6065   // we cannot handle.
6066   if (this->is_output_section_offset_invalid(shndx))
6067     {
6068       const Output_relaxed_input_section* poris =
6069         os->find_relaxed_input_section(this, shndx);
6070       if (poris == NULL)
6071         return false;
6072     }
6073
6074   return true;
6075 }
6076
6077 // Determine if we want to scan the SHNDX-th section for relocation stubs.
6078 // This is a helper for Arm_relobj::scan_sections_for_stubs() below.
6079
6080 template<bool big_endian>
6081 bool
6082 Arm_relobj<big_endian>::section_needs_reloc_stub_scanning(
6083     const elfcpp::Shdr<32, big_endian>& shdr,
6084     const Relobj::Output_sections& out_sections,
6085     const Symbol_table* symtab,
6086     const unsigned char* pshdrs)
6087 {
6088   unsigned int sh_type = shdr.get_sh_type();
6089   if (sh_type != elfcpp::SHT_REL && sh_type != elfcpp::SHT_RELA)
6090     return false;
6091
6092   // Ignore empty section.
6093   off_t sh_size = shdr.get_sh_size();
6094   if (sh_size == 0)
6095     return false;
6096
6097   // Ignore reloc section with unexpected symbol table.  The
6098   // error will be reported in the final link.
6099   if (this->adjust_shndx(shdr.get_sh_link()) != this->symtab_shndx())
6100     return false;
6101
6102   unsigned int reloc_size;
6103   if (sh_type == elfcpp::SHT_REL)
6104     reloc_size = elfcpp::Elf_sizes<32>::rel_size;
6105   else
6106     reloc_size = elfcpp::Elf_sizes<32>::rela_size;
6107
6108   // Ignore reloc section with unexpected entsize or uneven size.
6109   // The error will be reported in the final link.
6110   if (reloc_size != shdr.get_sh_entsize() || sh_size % reloc_size != 0)
6111     return false;
6112
6113   // Ignore reloc section with bad info.  This error will be
6114   // reported in the final link.
6115   unsigned int index = this->adjust_shndx(shdr.get_sh_info());
6116   if (index >= this->shnum())
6117     return false;
6118
6119   const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
6120   const elfcpp::Shdr<32, big_endian> text_shdr(pshdrs + index * shdr_size);
6121   return this->section_is_scannable(text_shdr, index,
6122                                    out_sections[index], symtab);
6123 }
6124
6125 // Return the output address of either a plain input section or a relaxed
6126 // input section.  SHNDX is the section index.  We define and use this
6127 // instead of calling Output_section::output_address because that is slow
6128 // for large output.
6129
6130 template<bool big_endian>
6131 Arm_address
6132 Arm_relobj<big_endian>::simple_input_section_output_address(
6133     unsigned int shndx,
6134     Output_section* os)
6135 {
6136   if (this->is_output_section_offset_invalid(shndx))
6137     {
6138       const Output_relaxed_input_section* poris =
6139         os->find_relaxed_input_section(this, shndx);
6140       // We do not handle merged sections here.
6141       gold_assert(poris != NULL);
6142       return poris->address();
6143     }
6144   else
6145     return os->address() + this->get_output_section_offset(shndx);
6146 }
6147
6148 // Determine if we want to scan the SHNDX-th section for non-relocation stubs.
6149 // This is a helper for Arm_relobj::scan_sections_for_stubs() below.
6150
6151 template<bool big_endian>
6152 bool
6153 Arm_relobj<big_endian>::section_needs_cortex_a8_stub_scanning(
6154     const elfcpp::Shdr<32, big_endian>& shdr,
6155     unsigned int shndx,
6156     Output_section* os,
6157     const Symbol_table* symtab)
6158 {
6159   if (!this->section_is_scannable(shdr, shndx, os, symtab))
6160     return false;
6161
6162   // If the section does not cross any 4K-boundaries, it does not need to
6163   // be scanned.
6164   Arm_address address = this->simple_input_section_output_address(shndx, os);
6165   if ((address & ~0xfffU) == ((address + shdr.get_sh_size() - 1) & ~0xfffU))
6166     return false;
6167
6168   return true;
6169 }
6170
6171 // Scan a section for Cortex-A8 workaround.
6172
6173 template<bool big_endian>
6174 void
6175 Arm_relobj<big_endian>::scan_section_for_cortex_a8_erratum(
6176     const elfcpp::Shdr<32, big_endian>& shdr,
6177     unsigned int shndx,
6178     Output_section* os,
6179     Target_arm<big_endian>* arm_target)
6180 {
6181   // Look for the first mapping symbol in this section.  It should be
6182   // at (shndx, 0).
6183   Mapping_symbol_position section_start(shndx, 0);
6184   typename Mapping_symbols_info::const_iterator p =
6185     this->mapping_symbols_info_.lower_bound(section_start);
6186
6187   // There are no mapping symbols for this section.  Treat it as a data-only
6188   // section.  Issue a warning if section is marked as containing
6189   // instructions.
6190   if (p == this->mapping_symbols_info_.end() || p->first.first != shndx)
6191     {
6192       if ((this->section_flags(shndx) & elfcpp::SHF_EXECINSTR) != 0)
6193         gold_warning(_("cannot scan executable section %u of %s for Cortex-A8 "
6194                        "erratum because it has no mapping symbols."),
6195                      shndx, this->name().c_str());
6196       return;
6197     }
6198
6199   Arm_address output_address =
6200     this->simple_input_section_output_address(shndx, os);
6201
6202   // Get the section contents.
6203   section_size_type input_view_size = 0;
6204   const unsigned char* input_view =
6205     this->section_contents(shndx, &input_view_size, false);
6206
6207   // We need to go through the mapping symbols to determine what to
6208   // scan.  There are two reasons.  First, we should look at THUMB code and
6209   // THUMB code only.  Second, we only want to look at the 4K-page boundary
6210   // to speed up the scanning.
6211   
6212   while (p != this->mapping_symbols_info_.end()
6213         && p->first.first == shndx)
6214     {
6215       typename Mapping_symbols_info::const_iterator next =
6216         this->mapping_symbols_info_.upper_bound(p->first);
6217
6218       // Only scan part of a section with THUMB code.
6219       if (p->second == 't')
6220         {
6221           // Determine the end of this range.
6222           section_size_type span_start =
6223             convert_to_section_size_type(p->first.second);
6224           section_size_type span_end;
6225           if (next != this->mapping_symbols_info_.end()
6226               && next->first.first == shndx)
6227             span_end = convert_to_section_size_type(next->first.second);
6228           else
6229             span_end = convert_to_section_size_type(shdr.get_sh_size());
6230           
6231           if (((span_start + output_address) & ~0xfffUL)
6232               != ((span_end + output_address - 1) & ~0xfffUL))
6233             {
6234               arm_target->scan_span_for_cortex_a8_erratum(this, shndx,
6235                                                           span_start, span_end,
6236                                                           input_view,
6237                                                           output_address);
6238             }
6239         }
6240
6241       p = next; 
6242     }
6243 }
6244
6245 // Scan relocations for stub generation.
6246
6247 template<bool big_endian>
6248 void
6249 Arm_relobj<big_endian>::scan_sections_for_stubs(
6250     Target_arm<big_endian>* arm_target,
6251     const Symbol_table* symtab,
6252     const Layout* layout)
6253 {
6254   unsigned int shnum = this->shnum();
6255   const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
6256
6257   // Read the section headers.
6258   const unsigned char* pshdrs = this->get_view(this->elf_file()->shoff(),
6259                                                shnum * shdr_size,
6260                                                true, true);
6261
6262   // To speed up processing, we set up hash tables for fast lookup of
6263   // input offsets to output addresses.
6264   this->initialize_input_to_output_maps();
6265
6266   const Relobj::Output_sections& out_sections(this->output_sections());
6267
6268   Relocate_info<32, big_endian> relinfo;
6269   relinfo.symtab = symtab;
6270   relinfo.layout = layout;
6271   relinfo.object = this;
6272
6273   // Do relocation stubs scanning.
6274   const unsigned char* p = pshdrs + shdr_size;
6275   for (unsigned int i = 1; i < shnum; ++i, p += shdr_size)
6276     {
6277       const elfcpp::Shdr<32, big_endian> shdr(p);
6278       if (this->section_needs_reloc_stub_scanning(shdr, out_sections, symtab,
6279                                                   pshdrs))
6280         {
6281           unsigned int index = this->adjust_shndx(shdr.get_sh_info());
6282           Arm_address output_offset = this->get_output_section_offset(index);
6283           Arm_address output_address;
6284           if (output_offset != invalid_address)
6285             output_address = out_sections[index]->address() + output_offset;
6286           else
6287             {
6288               // Currently this only happens for a relaxed section.
6289               const Output_relaxed_input_section* poris =
6290               out_sections[index]->find_relaxed_input_section(this, index);
6291               gold_assert(poris != NULL);
6292               output_address = poris->address();
6293             }
6294
6295           // Get the relocations.
6296           const unsigned char* prelocs = this->get_view(shdr.get_sh_offset(),
6297                                                         shdr.get_sh_size(),
6298                                                         true, false);
6299
6300           // Get the section contents.  This does work for the case in which
6301           // we modify the contents of an input section.  We need to pass the
6302           // output view under such circumstances.
6303           section_size_type input_view_size = 0;
6304           const unsigned char* input_view =
6305             this->section_contents(index, &input_view_size, false);
6306
6307           relinfo.reloc_shndx = i;
6308           relinfo.data_shndx = index;
6309           unsigned int sh_type = shdr.get_sh_type();
6310           unsigned int reloc_size;
6311           if (sh_type == elfcpp::SHT_REL)
6312             reloc_size = elfcpp::Elf_sizes<32>::rel_size;
6313           else
6314             reloc_size = elfcpp::Elf_sizes<32>::rela_size;
6315
6316           Output_section* os = out_sections[index];
6317           arm_target->scan_section_for_stubs(&relinfo, sh_type, prelocs,
6318                                              shdr.get_sh_size() / reloc_size,
6319                                              os,
6320                                              output_offset == invalid_address,
6321                                              input_view, output_address,
6322                                              input_view_size);
6323         }
6324     }
6325
6326   // Do Cortex-A8 erratum stubs scanning.  This has to be done for a section
6327   // after its relocation section, if there is one, is processed for
6328   // relocation stubs.  Merging this loop with the one above would have been
6329   // complicated since we would have had to make sure that relocation stub
6330   // scanning is done first.
6331   if (arm_target->fix_cortex_a8())
6332     {
6333       const unsigned char* p = pshdrs + shdr_size;
6334       for (unsigned int i = 1; i < shnum; ++i, p += shdr_size)
6335         {
6336           const elfcpp::Shdr<32, big_endian> shdr(p);
6337           if (this->section_needs_cortex_a8_stub_scanning(shdr, i,
6338                                                           out_sections[i],
6339                                                           symtab))
6340             this->scan_section_for_cortex_a8_erratum(shdr, i, out_sections[i],
6341                                                      arm_target);
6342         }
6343     }
6344
6345   // After we've done the relocations, we release the hash tables,
6346   // since we no longer need them.
6347   this->free_input_to_output_maps();
6348 }
6349
6350 // Count the local symbols.  The ARM backend needs to know if a symbol
6351 // is a THUMB function or not.  For global symbols, it is easy because
6352 // the Symbol object keeps the ELF symbol type.  For local symbol it is
6353 // harder because we cannot access this information.   So we override the
6354 // do_count_local_symbol in parent and scan local symbols to mark
6355 // THUMB functions.  This is not the most efficient way but I do not want to
6356 // slow down other ports by calling a per symbol target hook inside
6357 // Sized_relobj_file<size, big_endian>::do_count_local_symbols. 
6358
6359 template<bool big_endian>
6360 void
6361 Arm_relobj<big_endian>::do_count_local_symbols(
6362     Stringpool_template<char>* pool,
6363     Stringpool_template<char>* dynpool)
6364 {
6365   // We need to fix-up the values of any local symbols whose type are
6366   // STT_ARM_TFUNC.
6367   
6368   // Ask parent to count the local symbols.
6369   Sized_relobj_file<32, big_endian>::do_count_local_symbols(pool, dynpool);
6370   const unsigned int loccount = this->local_symbol_count();
6371   if (loccount == 0)
6372     return;
6373
6374   // Initialize the thumb function bit-vector.
6375   std::vector<bool> empty_vector(loccount, false);
6376   this->local_symbol_is_thumb_function_.swap(empty_vector);
6377
6378   // Read the symbol table section header.
6379   const unsigned int symtab_shndx = this->symtab_shndx();
6380   elfcpp::Shdr<32, big_endian>
6381       symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
6382   gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
6383
6384   // Read the local symbols.
6385   const int sym_size =elfcpp::Elf_sizes<32>::sym_size;
6386   gold_assert(loccount == symtabshdr.get_sh_info());
6387   off_t locsize = loccount * sym_size;
6388   const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
6389                                               locsize, true, true);
6390
6391   // For mapping symbol processing, we need to read the symbol names.
6392   unsigned int strtab_shndx = this->adjust_shndx(symtabshdr.get_sh_link());
6393   if (strtab_shndx >= this->shnum())
6394     {
6395       this->error(_("invalid symbol table name index: %u"), strtab_shndx);
6396       return;
6397     }
6398
6399   elfcpp::Shdr<32, big_endian>
6400     strtabshdr(this, this->elf_file()->section_header(strtab_shndx));
6401   if (strtabshdr.get_sh_type() != elfcpp::SHT_STRTAB)
6402     {
6403       this->error(_("symbol table name section has wrong type: %u"),
6404                   static_cast<unsigned int>(strtabshdr.get_sh_type()));
6405       return;
6406     }
6407   const char* pnames =
6408     reinterpret_cast<const char*>(this->get_view(strtabshdr.get_sh_offset(),
6409                                                  strtabshdr.get_sh_size(),
6410                                                  false, false));
6411
6412   // Loop over the local symbols and mark any local symbols pointing
6413   // to THUMB functions.
6414
6415   // Skip the first dummy symbol.
6416   psyms += sym_size;
6417   typename Sized_relobj_file<32, big_endian>::Local_values* plocal_values =
6418     this->local_values();
6419   for (unsigned int i = 1; i < loccount; ++i, psyms += sym_size)
6420     {
6421       elfcpp::Sym<32, big_endian> sym(psyms);
6422       elfcpp::STT st_type = sym.get_st_type();
6423       Symbol_value<32>& lv((*plocal_values)[i]);
6424       Arm_address input_value = lv.input_value();
6425
6426       // Check to see if this is a mapping symbol.
6427       const char* sym_name = pnames + sym.get_st_name();
6428       if (Target_arm<big_endian>::is_mapping_symbol_name(sym_name))
6429         {
6430           bool is_ordinary;
6431           unsigned int input_shndx =
6432             this->adjust_sym_shndx(i, sym.get_st_shndx(), &is_ordinary);
6433           gold_assert(is_ordinary);
6434
6435           // Strip of LSB in case this is a THUMB symbol.
6436           Mapping_symbol_position msp(input_shndx, input_value & ~1U);
6437           this->mapping_symbols_info_[msp] = sym_name[1];
6438         }
6439
6440       if (st_type == elfcpp::STT_ARM_TFUNC
6441           || (st_type == elfcpp::STT_FUNC && ((input_value & 1) != 0)))
6442         {
6443           // This is a THUMB function.  Mark this and canonicalize the
6444           // symbol value by setting LSB.
6445           this->local_symbol_is_thumb_function_[i] = true;
6446           if ((input_value & 1) == 0)
6447             lv.set_input_value(input_value | 1);
6448         }
6449     }
6450 }
6451
6452 // Relocate sections.
6453 template<bool big_endian>
6454 void
6455 Arm_relobj<big_endian>::do_relocate_sections(
6456     const Symbol_table* symtab,
6457     const Layout* layout,
6458     const unsigned char* pshdrs,
6459     Output_file* of,
6460     typename Sized_relobj_file<32, big_endian>::Views* pviews)
6461 {
6462   // Call parent to relocate sections.
6463   Sized_relobj_file<32, big_endian>::do_relocate_sections(symtab, layout,
6464                                                           pshdrs, of, pviews); 
6465
6466   // We do not generate stubs if doing a relocatable link.
6467   if (parameters->options().relocatable())
6468     return;
6469
6470   // Relocate stub tables.
6471   unsigned int shnum = this->shnum();
6472
6473   Target_arm<big_endian>* arm_target =
6474     Target_arm<big_endian>::default_target();
6475
6476   Relocate_info<32, big_endian> relinfo;
6477   relinfo.symtab = symtab;
6478   relinfo.layout = layout;
6479   relinfo.object = this;
6480
6481   for (unsigned int i = 1; i < shnum; ++i)
6482     {
6483       Arm_input_section<big_endian>* arm_input_section =
6484         arm_target->find_arm_input_section(this, i);
6485
6486       if (arm_input_section != NULL
6487           && arm_input_section->is_stub_table_owner()
6488           && !arm_input_section->stub_table()->empty())
6489         {
6490           // We cannot discard a section if it owns a stub table.
6491           Output_section* os = this->output_section(i);
6492           gold_assert(os != NULL);
6493
6494           relinfo.reloc_shndx = elfcpp::SHN_UNDEF;
6495           relinfo.reloc_shdr = NULL;
6496           relinfo.data_shndx = i;
6497           relinfo.data_shdr = pshdrs + i * elfcpp::Elf_sizes<32>::shdr_size;
6498
6499           gold_assert((*pviews)[i].view != NULL);
6500
6501           // We are passed the output section view.  Adjust it to cover the
6502           // stub table only.
6503           Stub_table<big_endian>* stub_table = arm_input_section->stub_table();
6504           gold_assert((stub_table->address() >= (*pviews)[i].address)
6505                       && ((stub_table->address() + stub_table->data_size())
6506                           <= (*pviews)[i].address + (*pviews)[i].view_size));
6507
6508           off_t offset = stub_table->address() - (*pviews)[i].address;
6509           unsigned char* view = (*pviews)[i].view + offset;
6510           Arm_address address = stub_table->address();
6511           section_size_type view_size = stub_table->data_size();
6512  
6513           stub_table->relocate_stubs(&relinfo, arm_target, os, view, address,
6514                                      view_size);
6515         }
6516
6517       // Apply Cortex A8 workaround if applicable.
6518       if (this->section_has_cortex_a8_workaround(i))
6519         {
6520           unsigned char* view = (*pviews)[i].view;
6521           Arm_address view_address = (*pviews)[i].address;
6522           section_size_type view_size = (*pviews)[i].view_size;
6523           Stub_table<big_endian>* stub_table = this->stub_tables_[i];
6524
6525           // Adjust view to cover section.
6526           Output_section* os = this->output_section(i);
6527           gold_assert(os != NULL);
6528           Arm_address section_address =
6529             this->simple_input_section_output_address(i, os);
6530           uint64_t section_size = this->section_size(i);
6531
6532           gold_assert(section_address >= view_address
6533                       && ((section_address + section_size)
6534                           <= (view_address + view_size)));
6535
6536           unsigned char* section_view = view + (section_address - view_address);
6537
6538           // Apply the Cortex-A8 workaround to the output address range
6539           // corresponding to this input section.
6540           stub_table->apply_cortex_a8_workaround_to_address_range(
6541               arm_target,
6542               section_view,
6543               section_address,
6544               section_size);
6545         }
6546     }
6547 }
6548
6549 // Find the linked text section of an EXIDX section by looking at the first
6550 // relocation.  4.4.1 of the EHABI specifications says that an EXIDX section
6551 // must be linked to its associated code section via the sh_link field of
6552 // its section header.  However, some tools are broken and the link is not
6553 // always set.  LD just drops such an EXIDX section silently, causing the
6554 // associated code not unwindabled.   Here we try a little bit harder to
6555 // discover the linked code section.
6556 //
6557 // PSHDR points to the section header of a relocation section of an EXIDX
6558 // section.  If we can find a linked text section, return true and
6559 // store the text section index in the location PSHNDX.  Otherwise
6560 // return false.
6561
6562 template<bool big_endian>
6563 bool
6564 Arm_relobj<big_endian>::find_linked_text_section(
6565     const unsigned char* pshdr,
6566     const unsigned char* psyms,
6567     unsigned int* pshndx)
6568 {
6569   elfcpp::Shdr<32, big_endian> shdr(pshdr);
6570   
6571   // If there is no relocation, we cannot find the linked text section.
6572   size_t reloc_size;
6573   if (shdr.get_sh_type() == elfcpp::SHT_REL)
6574       reloc_size = elfcpp::Elf_sizes<32>::rel_size;
6575   else
6576       reloc_size = elfcpp::Elf_sizes<32>::rela_size;
6577   size_t reloc_count = shdr.get_sh_size() / reloc_size;
6578  
6579   // Get the relocations.
6580   const unsigned char* prelocs =
6581       this->get_view(shdr.get_sh_offset(), shdr.get_sh_size(), true, false); 
6582
6583   // Find the REL31 relocation for the first word of the first EXIDX entry.
6584   for (size_t i = 0; i < reloc_count; ++i, prelocs += reloc_size)
6585     {
6586       Arm_address r_offset;
6587       typename elfcpp::Elf_types<32>::Elf_WXword r_info;
6588       if (shdr.get_sh_type() == elfcpp::SHT_REL)
6589         {
6590           typename elfcpp::Rel<32, big_endian> reloc(prelocs);
6591           r_info = reloc.get_r_info();
6592           r_offset = reloc.get_r_offset();
6593         }
6594       else
6595         {
6596           typename elfcpp::Rela<32, big_endian> reloc(prelocs);
6597           r_info = reloc.get_r_info();
6598           r_offset = reloc.get_r_offset();
6599         }
6600
6601       unsigned int r_type = elfcpp::elf_r_type<32>(r_info);
6602       if (r_type != elfcpp::R_ARM_PREL31 && r_type != elfcpp::R_ARM_SBREL31)
6603         continue;
6604
6605       unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
6606       if (r_sym == 0
6607           || r_sym >= this->local_symbol_count()
6608           || r_offset != 0)
6609         continue;
6610
6611       // This is the relocation for the first word of the first EXIDX entry.
6612       // We expect to see a local section symbol.
6613       const int sym_size = elfcpp::Elf_sizes<32>::sym_size;
6614       elfcpp::Sym<32, big_endian> sym(psyms + r_sym * sym_size);
6615       if (sym.get_st_type() == elfcpp::STT_SECTION)
6616         {
6617           bool is_ordinary;
6618           *pshndx =
6619             this->adjust_sym_shndx(r_sym, sym.get_st_shndx(), &is_ordinary);
6620           gold_assert(is_ordinary);
6621           return true;
6622         }
6623       else
6624         return false;
6625     }
6626
6627   return false;
6628 }
6629
6630 // Make an EXIDX input section object for an EXIDX section whose index is
6631 // SHNDX.  SHDR is the section header of the EXIDX section and TEXT_SHNDX
6632 // is the section index of the linked text section.
6633
6634 template<bool big_endian>
6635 void
6636 Arm_relobj<big_endian>::make_exidx_input_section(
6637     unsigned int shndx,
6638     const elfcpp::Shdr<32, big_endian>& shdr,
6639     unsigned int text_shndx,
6640     const elfcpp::Shdr<32, big_endian>& text_shdr)
6641 {
6642   // Create an Arm_exidx_input_section object for this EXIDX section.
6643   Arm_exidx_input_section* exidx_input_section =
6644     new Arm_exidx_input_section(this, shndx, text_shndx, shdr.get_sh_size(),
6645                                 shdr.get_sh_addralign(),
6646                                 text_shdr.get_sh_size());
6647
6648   gold_assert(this->exidx_section_map_[shndx] == NULL);
6649   this->exidx_section_map_[shndx] = exidx_input_section;
6650
6651   if (text_shndx == elfcpp::SHN_UNDEF || text_shndx >= this->shnum())
6652     {
6653       gold_error(_("EXIDX section %s(%u) links to invalid section %u in %s"),
6654                  this->section_name(shndx).c_str(), shndx, text_shndx,
6655                  this->name().c_str());
6656       exidx_input_section->set_has_errors();
6657     } 
6658   else if (this->exidx_section_map_[text_shndx] != NULL)
6659     {
6660       unsigned other_exidx_shndx =
6661         this->exidx_section_map_[text_shndx]->shndx();
6662       gold_error(_("EXIDX sections %s(%u) and %s(%u) both link to text section"
6663                    "%s(%u) in %s"),
6664                  this->section_name(shndx).c_str(), shndx,
6665                  this->section_name(other_exidx_shndx).c_str(),
6666                  other_exidx_shndx, this->section_name(text_shndx).c_str(),
6667                  text_shndx, this->name().c_str());
6668       exidx_input_section->set_has_errors();
6669     }
6670   else
6671      this->exidx_section_map_[text_shndx] = exidx_input_section;
6672
6673   // Check section flags of text section.
6674   if ((text_shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0)
6675     {
6676       gold_error(_("EXIDX section %s(%u) links to non-allocated section %s(%u) "
6677                    " in %s"),
6678                  this->section_name(shndx).c_str(), shndx,
6679                  this->section_name(text_shndx).c_str(), text_shndx,
6680                  this->name().c_str());
6681       exidx_input_section->set_has_errors();
6682     }
6683   else if ((text_shdr.get_sh_flags() & elfcpp::SHF_EXECINSTR) == 0)
6684     // I would like to make this an error but currently ld just ignores
6685     // this.
6686     gold_warning(_("EXIDX section %s(%u) links to non-executable section "
6687                    "%s(%u) in %s"),
6688                  this->section_name(shndx).c_str(), shndx,
6689                  this->section_name(text_shndx).c_str(), text_shndx,
6690                  this->name().c_str());
6691 }
6692
6693 // Read the symbol information.
6694
6695 template<bool big_endian>
6696 void
6697 Arm_relobj<big_endian>::do_read_symbols(Read_symbols_data* sd)
6698 {
6699   // Call parent class to read symbol information.
6700   Sized_relobj_file<32, big_endian>::do_read_symbols(sd);
6701
6702   // If this input file is a binary file, it has no processor
6703   // specific flags and attributes section.
6704   Input_file::Format format = this->input_file()->format();
6705   if (format != Input_file::FORMAT_ELF)
6706     {
6707       gold_assert(format == Input_file::FORMAT_BINARY);
6708       this->merge_flags_and_attributes_ = false;
6709       return;
6710     }
6711
6712   // Read processor-specific flags in ELF file header.
6713   const unsigned char* pehdr = this->get_view(elfcpp::file_header_offset,
6714                                               elfcpp::Elf_sizes<32>::ehdr_size,
6715                                               true, false);
6716   elfcpp::Ehdr<32, big_endian> ehdr(pehdr);
6717   this->processor_specific_flags_ = ehdr.get_e_flags();
6718
6719   // Go over the section headers and look for .ARM.attributes and .ARM.exidx
6720   // sections.
6721   std::vector<unsigned int> deferred_exidx_sections;
6722   const size_t shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
6723   const unsigned char* pshdrs = sd->section_headers->data();
6724   const unsigned char* ps = pshdrs + shdr_size;
6725   bool must_merge_flags_and_attributes = false;
6726   for (unsigned int i = 1; i < this->shnum(); ++i, ps += shdr_size)
6727     {
6728       elfcpp::Shdr<32, big_endian> shdr(ps);
6729
6730       // Sometimes an object has no contents except the section name string
6731       // table and an empty symbol table with the undefined symbol.  We
6732       // don't want to merge processor-specific flags from such an object.
6733       if (shdr.get_sh_type() == elfcpp::SHT_SYMTAB)
6734         {
6735           // Symbol table is not empty.
6736           const elfcpp::Elf_types<32>::Elf_WXword sym_size =
6737              elfcpp::Elf_sizes<32>::sym_size;
6738           if (shdr.get_sh_size() > sym_size)
6739             must_merge_flags_and_attributes = true;
6740         }
6741       else if (shdr.get_sh_type() != elfcpp::SHT_STRTAB)
6742         // If this is neither an empty symbol table nor a string table,
6743         // be conservative.
6744         must_merge_flags_and_attributes = true;
6745
6746       if (shdr.get_sh_type() == elfcpp::SHT_ARM_ATTRIBUTES)
6747         {
6748           gold_assert(this->attributes_section_data_ == NULL);
6749           section_offset_type section_offset = shdr.get_sh_offset();
6750           section_size_type section_size =
6751             convert_to_section_size_type(shdr.get_sh_size());
6752           const unsigned char* view =
6753              this->get_view(section_offset, section_size, true, false);
6754           this->attributes_section_data_ =
6755             new Attributes_section_data(view, section_size);
6756         }
6757       else if (shdr.get_sh_type() == elfcpp::SHT_ARM_EXIDX)
6758         {
6759           unsigned int text_shndx = this->adjust_shndx(shdr.get_sh_link());
6760           if (text_shndx == elfcpp::SHN_UNDEF)
6761             deferred_exidx_sections.push_back(i);
6762           else
6763             {
6764               elfcpp::Shdr<32, big_endian> text_shdr(pshdrs
6765                                                      + text_shndx * shdr_size);
6766               this->make_exidx_input_section(i, shdr, text_shndx, text_shdr);
6767             }
6768           // EHABI 4.4.1 requires that SHF_LINK_ORDER flag to be set.
6769           if ((shdr.get_sh_flags() & elfcpp::SHF_LINK_ORDER) == 0)
6770             gold_warning(_("SHF_LINK_ORDER not set in EXIDX section %s of %s"),
6771                          this->section_name(i).c_str(), this->name().c_str());
6772         }
6773     }
6774
6775   // This is rare.
6776   if (!must_merge_flags_and_attributes)
6777     {
6778       gold_assert(deferred_exidx_sections.empty());
6779       this->merge_flags_and_attributes_ = false;
6780       return;
6781     }
6782
6783   // Some tools are broken and they do not set the link of EXIDX sections. 
6784   // We look at the first relocation to figure out the linked sections.
6785   if (!deferred_exidx_sections.empty())
6786     {
6787       // We need to go over the section headers again to find the mapping
6788       // from sections being relocated to their relocation sections.  This is
6789       // a bit inefficient as we could do that in the loop above.  However,
6790       // we do not expect any deferred EXIDX sections normally.  So we do not
6791       // want to slow down the most common path.
6792       typedef Unordered_map<unsigned int, unsigned int> Reloc_map;
6793       Reloc_map reloc_map;
6794       ps = pshdrs + shdr_size;
6795       for (unsigned int i = 1; i < this->shnum(); ++i, ps += shdr_size)
6796         {
6797           elfcpp::Shdr<32, big_endian> shdr(ps);
6798           elfcpp::Elf_Word sh_type = shdr.get_sh_type();
6799           if (sh_type == elfcpp::SHT_REL || sh_type == elfcpp::SHT_RELA)
6800             {
6801               unsigned int info_shndx = this->adjust_shndx(shdr.get_sh_info());
6802               if (info_shndx >= this->shnum())
6803                 gold_error(_("relocation section %u has invalid info %u"),
6804                            i, info_shndx);
6805               Reloc_map::value_type value(info_shndx, i);
6806               std::pair<Reloc_map::iterator, bool> result =
6807                 reloc_map.insert(value);
6808               if (!result.second)
6809                 gold_error(_("section %u has multiple relocation sections "
6810                              "%u and %u"),
6811                            info_shndx, i, reloc_map[info_shndx]);
6812             }
6813         }
6814
6815       // Read the symbol table section header.
6816       const unsigned int symtab_shndx = this->symtab_shndx();
6817       elfcpp::Shdr<32, big_endian>
6818           symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
6819       gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
6820
6821       // Read the local symbols.
6822       const int sym_size =elfcpp::Elf_sizes<32>::sym_size;
6823       const unsigned int loccount = this->local_symbol_count();
6824       gold_assert(loccount == symtabshdr.get_sh_info());
6825       off_t locsize = loccount * sym_size;
6826       const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
6827                                                   locsize, true, true);
6828
6829       // Process the deferred EXIDX sections. 
6830       for (unsigned int i = 0; i < deferred_exidx_sections.size(); ++i)
6831         {
6832           unsigned int shndx = deferred_exidx_sections[i];
6833           elfcpp::Shdr<32, big_endian> shdr(pshdrs + shndx * shdr_size);
6834           unsigned int text_shndx = elfcpp::SHN_UNDEF;
6835           Reloc_map::const_iterator it = reloc_map.find(shndx);
6836           if (it != reloc_map.end())
6837             find_linked_text_section(pshdrs + it->second * shdr_size,
6838                                      psyms, &text_shndx);
6839           elfcpp::Shdr<32, big_endian> text_shdr(pshdrs
6840                                                  + text_shndx * shdr_size);
6841           this->make_exidx_input_section(shndx, shdr, text_shndx, text_shdr);
6842         }
6843     }
6844 }
6845
6846 // Process relocations for garbage collection.  The ARM target uses .ARM.exidx
6847 // sections for unwinding.  These sections are referenced implicitly by 
6848 // text sections linked in the section headers.  If we ignore these implicit
6849 // references, the .ARM.exidx sections and any .ARM.extab sections they use
6850 // will be garbage-collected incorrectly.  Hence we override the same function
6851 // in the base class to handle these implicit references.
6852
6853 template<bool big_endian>
6854 void
6855 Arm_relobj<big_endian>::do_gc_process_relocs(Symbol_table* symtab,
6856                                              Layout* layout,
6857                                              Read_relocs_data* rd)
6858 {
6859   // First, call base class method to process relocations in this object.
6860   Sized_relobj_file<32, big_endian>::do_gc_process_relocs(symtab, layout, rd);
6861
6862   // If --gc-sections is not specified, there is nothing more to do.
6863   // This happens when --icf is used but --gc-sections is not.
6864   if (!parameters->options().gc_sections())
6865     return;
6866   
6867   unsigned int shnum = this->shnum();
6868   const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
6869   const unsigned char* pshdrs = this->get_view(this->elf_file()->shoff(),
6870                                                shnum * shdr_size,
6871                                                true, true);
6872
6873   // Scan section headers for sections of type SHT_ARM_EXIDX.  Add references
6874   // to these from the linked text sections.
6875   const unsigned char* ps = pshdrs + shdr_size;
6876   for (unsigned int i = 1; i < shnum; ++i, ps += shdr_size)
6877     {
6878       elfcpp::Shdr<32, big_endian> shdr(ps);
6879       if (shdr.get_sh_type() == elfcpp::SHT_ARM_EXIDX)
6880         {
6881           // Found an .ARM.exidx section, add it to the set of reachable
6882           // sections from its linked text section.
6883           unsigned int text_shndx = this->adjust_shndx(shdr.get_sh_link());
6884           symtab->gc()->add_reference(this, text_shndx, this, i);
6885         }
6886     }
6887 }
6888
6889 // Update output local symbol count.  Owing to EXIDX entry merging, some local
6890 // symbols  will be removed in output.  Adjust output local symbol count
6891 // accordingly.  We can only changed the static output local symbol count.  It
6892 // is too late to change the dynamic symbols.
6893
6894 template<bool big_endian>
6895 void
6896 Arm_relobj<big_endian>::update_output_local_symbol_count()
6897 {
6898   // Caller should check that this needs updating.  We want caller checking
6899   // because output_local_symbol_count_needs_update() is most likely inlined.
6900   gold_assert(this->output_local_symbol_count_needs_update_);
6901
6902   gold_assert(this->symtab_shndx() != -1U);
6903   if (this->symtab_shndx() == 0)
6904     {
6905       // This object has no symbols.  Weird but legal.
6906       return;
6907     }
6908
6909   // Read the symbol table section header.
6910   const unsigned int symtab_shndx = this->symtab_shndx();
6911   elfcpp::Shdr<32, big_endian>
6912     symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
6913   gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
6914
6915   // Read the local symbols.
6916   const int sym_size = elfcpp::Elf_sizes<32>::sym_size;
6917   const unsigned int loccount = this->local_symbol_count();
6918   gold_assert(loccount == symtabshdr.get_sh_info());
6919   off_t locsize = loccount * sym_size;
6920   const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
6921                                               locsize, true, true);
6922
6923   // Loop over the local symbols.
6924
6925   typedef typename Sized_relobj_file<32, big_endian>::Output_sections
6926      Output_sections;
6927   const Output_sections& out_sections(this->output_sections());
6928   unsigned int shnum = this->shnum();
6929   unsigned int count = 0;
6930   // Skip the first, dummy, symbol.
6931   psyms += sym_size;
6932   for (unsigned int i = 1; i < loccount; ++i, psyms += sym_size)
6933     {
6934       elfcpp::Sym<32, big_endian> sym(psyms);
6935
6936       Symbol_value<32>& lv((*this->local_values())[i]);
6937
6938       // This local symbol was already discarded by do_count_local_symbols.
6939       if (lv.is_output_symtab_index_set() && !lv.has_output_symtab_entry())
6940         continue;
6941
6942       bool is_ordinary;
6943       unsigned int shndx = this->adjust_sym_shndx(i, sym.get_st_shndx(),
6944                                                   &is_ordinary);
6945
6946       if (shndx < shnum)
6947         {
6948           Output_section* os = out_sections[shndx];
6949
6950           // This local symbol no longer has an output section.  Discard it.
6951           if (os == NULL)
6952             {
6953               lv.set_no_output_symtab_entry();
6954               continue;
6955             }
6956
6957           // Currently we only discard parts of EXIDX input sections.
6958           // We explicitly check for a merged EXIDX input section to avoid
6959           // calling Output_section_data::output_offset unless necessary.
6960           if ((this->get_output_section_offset(shndx) == invalid_address)
6961               && (this->exidx_input_section_by_shndx(shndx) != NULL))
6962             {
6963               section_offset_type output_offset =
6964                 os->output_offset(this, shndx, lv.input_value());
6965               if (output_offset == -1)
6966                 {
6967                   // This symbol is defined in a part of an EXIDX input section
6968                   // that is discarded due to entry merging.
6969                   lv.set_no_output_symtab_entry();
6970                   continue;
6971                 }       
6972             }
6973         }
6974
6975       ++count;
6976     }
6977
6978   this->set_output_local_symbol_count(count);
6979   this->output_local_symbol_count_needs_update_ = false;
6980 }
6981
6982 // Arm_dynobj methods.
6983
6984 // Read the symbol information.
6985
6986 template<bool big_endian>
6987 void
6988 Arm_dynobj<big_endian>::do_read_symbols(Read_symbols_data* sd)
6989 {
6990   // Call parent class to read symbol information.
6991   Sized_dynobj<32, big_endian>::do_read_symbols(sd);
6992
6993   // Read processor-specific flags in ELF file header.
6994   const unsigned char* pehdr = this->get_view(elfcpp::file_header_offset,
6995                                               elfcpp::Elf_sizes<32>::ehdr_size,
6996                                               true, false);
6997   elfcpp::Ehdr<32, big_endian> ehdr(pehdr);
6998   this->processor_specific_flags_ = ehdr.get_e_flags();
6999
7000   // Read the attributes section if there is one.
7001   // We read from the end because gas seems to put it near the end of
7002   // the section headers.
7003   const size_t shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
7004   const unsigned char* ps =
7005     sd->section_headers->data() + shdr_size * (this->shnum() - 1);
7006   for (unsigned int i = this->shnum(); i > 0; --i, ps -= shdr_size)
7007     {
7008       elfcpp::Shdr<32, big_endian> shdr(ps);
7009       if (shdr.get_sh_type() == elfcpp::SHT_ARM_ATTRIBUTES)
7010         {
7011           section_offset_type section_offset = shdr.get_sh_offset();
7012           section_size_type section_size =
7013             convert_to_section_size_type(shdr.get_sh_size());
7014           const unsigned char* view =
7015             this->get_view(section_offset, section_size, true, false);
7016           this->attributes_section_data_ =
7017             new Attributes_section_data(view, section_size);
7018           break;
7019         }
7020     }
7021 }
7022
7023 // Stub_addend_reader methods.
7024
7025 // Read the addend of a REL relocation of type R_TYPE at VIEW.
7026
7027 template<bool big_endian>
7028 elfcpp::Elf_types<32>::Elf_Swxword
7029 Stub_addend_reader<elfcpp::SHT_REL, big_endian>::operator()(
7030     unsigned int r_type,
7031     const unsigned char* view,
7032     const typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc&) const
7033 {
7034   typedef struct Arm_relocate_functions<big_endian> RelocFuncs;
7035   
7036   switch (r_type)
7037     {
7038     case elfcpp::R_ARM_CALL:
7039     case elfcpp::R_ARM_JUMP24:
7040     case elfcpp::R_ARM_PLT32:
7041       {
7042         typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
7043         const Valtype* wv = reinterpret_cast<const Valtype*>(view);
7044         Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
7045         return utils::sign_extend<26>(val << 2);
7046       }
7047
7048     case elfcpp::R_ARM_THM_CALL:
7049     case elfcpp::R_ARM_THM_JUMP24:
7050     case elfcpp::R_ARM_THM_XPC22:
7051       {
7052         typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
7053         const Valtype* wv = reinterpret_cast<const Valtype*>(view);
7054         Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
7055         Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
7056         return RelocFuncs::thumb32_branch_offset(upper_insn, lower_insn);
7057       }
7058
7059     case elfcpp::R_ARM_THM_JUMP19:
7060       {
7061         typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
7062         const Valtype* wv = reinterpret_cast<const Valtype*>(view);
7063         Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
7064         Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
7065         return RelocFuncs::thumb32_cond_branch_offset(upper_insn, lower_insn);
7066       }
7067
7068     default:
7069       gold_unreachable();
7070     }
7071 }
7072
7073 // Arm_output_data_got methods.
7074
7075 // Add a GOT pair for R_ARM_TLS_GD32.  The creates a pair of GOT entries.
7076 // The first one is initialized to be 1, which is the module index for
7077 // the main executable and the second one 0.  A reloc of the type
7078 // R_ARM_TLS_DTPOFF32 will be created for the second GOT entry and will
7079 // be applied by gold.  GSYM is a global symbol.
7080 //
7081 template<bool big_endian>
7082 void
7083 Arm_output_data_got<big_endian>::add_tls_gd32_with_static_reloc(
7084     unsigned int got_type,
7085     Symbol* gsym)
7086 {
7087   if (gsym->has_got_offset(got_type))
7088     return;
7089
7090   // We are doing a static link.  Just mark it as belong to module 1,
7091   // the executable.
7092   unsigned int got_offset = this->add_constant(1);
7093   gsym->set_got_offset(got_type, got_offset); 
7094   got_offset = this->add_constant(0);
7095   this->static_relocs_.push_back(Static_reloc(got_offset,
7096                                               elfcpp::R_ARM_TLS_DTPOFF32,
7097                                               gsym));
7098 }
7099
7100 // Same as the above but for a local symbol.
7101
7102 template<bool big_endian>
7103 void
7104 Arm_output_data_got<big_endian>::add_tls_gd32_with_static_reloc(
7105   unsigned int got_type,
7106   Sized_relobj_file<32, big_endian>* object,
7107   unsigned int index)
7108 {
7109   if (object->local_has_got_offset(index, got_type))
7110     return;
7111
7112   // We are doing a static link.  Just mark it as belong to module 1,
7113   // the executable.
7114   unsigned int got_offset = this->add_constant(1);
7115   object->set_local_got_offset(index, got_type, got_offset);
7116   got_offset = this->add_constant(0);
7117   this->static_relocs_.push_back(Static_reloc(got_offset, 
7118                                               elfcpp::R_ARM_TLS_DTPOFF32, 
7119                                               object, index));
7120 }
7121
7122 template<bool big_endian>
7123 void
7124 Arm_output_data_got<big_endian>::do_write(Output_file* of)
7125 {
7126   // Call parent to write out GOT.
7127   Output_data_got<32, big_endian>::do_write(of);
7128
7129   // We are done if there is no fix up.
7130   if (this->static_relocs_.empty())
7131     return;
7132
7133   gold_assert(parameters->doing_static_link());
7134
7135   const off_t offset = this->offset();
7136   const section_size_type oview_size =
7137     convert_to_section_size_type(this->data_size());
7138   unsigned char* const oview = of->get_output_view(offset, oview_size);
7139
7140   Output_segment* tls_segment = this->layout_->tls_segment();
7141   gold_assert(tls_segment != NULL);
7142   
7143   // The thread pointer $tp points to the TCB, which is followed by the
7144   // TLS.  So we need to adjust $tp relative addressing by this amount.
7145   Arm_address aligned_tcb_size =
7146     align_address(ARM_TCB_SIZE, tls_segment->maximum_alignment());
7147
7148   for (size_t i = 0; i < this->static_relocs_.size(); ++i)
7149     {
7150       Static_reloc& reloc(this->static_relocs_[i]);
7151       
7152       Arm_address value;
7153       if (!reloc.symbol_is_global())
7154         {
7155           Sized_relobj_file<32, big_endian>* object = reloc.relobj();
7156           const Symbol_value<32>* psymval =
7157             reloc.relobj()->local_symbol(reloc.index());
7158
7159           // We are doing static linking.  Issue an error and skip this
7160           // relocation if the symbol is undefined or in a discarded_section.
7161           bool is_ordinary;
7162           unsigned int shndx = psymval->input_shndx(&is_ordinary);
7163           if ((shndx == elfcpp::SHN_UNDEF)
7164               || (is_ordinary
7165                   && shndx != elfcpp::SHN_UNDEF
7166                   && !object->is_section_included(shndx)
7167                   && !this->symbol_table_->is_section_folded(object, shndx)))
7168             {
7169               gold_error(_("undefined or discarded local symbol %u from "
7170                            " object %s in GOT"),
7171                          reloc.index(), reloc.relobj()->name().c_str());
7172               continue;
7173             }
7174           
7175           value = psymval->value(object, 0);
7176         }
7177       else
7178         {
7179           const Symbol* gsym = reloc.symbol();
7180           gold_assert(gsym != NULL);
7181           if (gsym->is_forwarder())
7182             gsym = this->symbol_table_->resolve_forwards(gsym);
7183
7184           // We are doing static linking.  Issue an error and skip this
7185           // relocation if the symbol is undefined or in a discarded_section
7186           // unless it is a weakly_undefined symbol.
7187           if ((gsym->is_defined_in_discarded_section()
7188                || gsym->is_undefined())
7189               && !gsym->is_weak_undefined())
7190             {
7191               gold_error(_("undefined or discarded symbol %s in GOT"),
7192                          gsym->name());
7193               continue;
7194             }
7195
7196           if (!gsym->is_weak_undefined())
7197             {
7198               const Sized_symbol<32>* sym =
7199                 static_cast<const Sized_symbol<32>*>(gsym);
7200               value = sym->value();
7201             }
7202           else
7203               value = 0;
7204         }
7205
7206       unsigned got_offset = reloc.got_offset();
7207       gold_assert(got_offset < oview_size);
7208
7209       typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
7210       Valtype* wv = reinterpret_cast<Valtype*>(oview + got_offset);
7211       Valtype x;
7212       switch (reloc.r_type())
7213         {
7214         case elfcpp::R_ARM_TLS_DTPOFF32:
7215           x = value;
7216           break;
7217         case elfcpp::R_ARM_TLS_TPOFF32:
7218           x = value + aligned_tcb_size;
7219           break;
7220         default:
7221           gold_unreachable();
7222         }
7223       elfcpp::Swap<32, big_endian>::writeval(wv, x);
7224     }
7225
7226   of->write_output_view(offset, oview_size, oview);
7227 }
7228
7229 // A class to handle the PLT data.
7230
7231 template<bool big_endian>
7232 class Output_data_plt_arm : public Output_section_data
7233 {
7234  public:
7235   typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, big_endian>
7236     Reloc_section;
7237
7238   Output_data_plt_arm(Layout*, Output_data_space*);
7239
7240   // Add an entry to the PLT.
7241   void
7242   add_entry(Symbol* gsym);
7243
7244   // Return the .rel.plt section data.
7245   const Reloc_section*
7246   rel_plt() const
7247   { return this->rel_; }
7248
7249   // Return the number of PLT entries.
7250   unsigned int
7251   entry_count() const
7252   { return this->count_; }
7253
7254   // Return the offset of the first non-reserved PLT entry.
7255   static unsigned int
7256   first_plt_entry_offset()
7257   { return sizeof(first_plt_entry); }
7258
7259   // Return the size of a PLT entry.
7260   static unsigned int
7261   get_plt_entry_size()
7262   { return sizeof(plt_entry); }
7263
7264  protected:
7265   void
7266   do_adjust_output_section(Output_section* os);
7267
7268   // Write to a map file.
7269   void
7270   do_print_to_mapfile(Mapfile* mapfile) const
7271   { mapfile->print_output_data(this, _("** PLT")); }
7272
7273  private:
7274   // Template for the first PLT entry.
7275   static const uint32_t first_plt_entry[5];
7276
7277   // Template for subsequent PLT entries. 
7278   static const uint32_t plt_entry[3];
7279
7280   // Set the final size.
7281   void
7282   set_final_data_size()
7283   {
7284     this->set_data_size(sizeof(first_plt_entry)
7285                         + this->count_ * sizeof(plt_entry));
7286   }
7287
7288   // Write out the PLT data.
7289   void
7290   do_write(Output_file*);
7291
7292   // The reloc section.
7293   Reloc_section* rel_;
7294   // The .got.plt section.
7295   Output_data_space* got_plt_;
7296   // The number of PLT entries.
7297   unsigned int count_;
7298 };
7299
7300 // Create the PLT section.  The ordinary .got section is an argument,
7301 // since we need to refer to the start.  We also create our own .got
7302 // section just for PLT entries.
7303
7304 template<bool big_endian>
7305 Output_data_plt_arm<big_endian>::Output_data_plt_arm(Layout* layout,
7306                                                      Output_data_space* got_plt)
7307   : Output_section_data(4), got_plt_(got_plt), count_(0)
7308 {
7309   this->rel_ = new Reloc_section(false);
7310   layout->add_output_section_data(".rel.plt", elfcpp::SHT_REL,
7311                                   elfcpp::SHF_ALLOC, this->rel_,
7312                                   ORDER_DYNAMIC_PLT_RELOCS, false);
7313 }
7314
7315 template<bool big_endian>
7316 void
7317 Output_data_plt_arm<big_endian>::do_adjust_output_section(Output_section* os)
7318 {
7319   os->set_entsize(0);
7320 }
7321
7322 // Add an entry to the PLT.
7323
7324 template<bool big_endian>
7325 void
7326 Output_data_plt_arm<big_endian>::add_entry(Symbol* gsym)
7327 {
7328   gold_assert(!gsym->has_plt_offset());
7329
7330   // Note that when setting the PLT offset we skip the initial
7331   // reserved PLT entry.
7332   gsym->set_plt_offset((this->count_) * sizeof(plt_entry)
7333                        + sizeof(first_plt_entry));
7334
7335   ++this->count_;
7336
7337   section_offset_type got_offset = this->got_plt_->current_data_size();
7338
7339   // Every PLT entry needs a GOT entry which points back to the PLT
7340   // entry (this will be changed by the dynamic linker, normally
7341   // lazily when the function is called).
7342   this->got_plt_->set_current_data_size(got_offset + 4);
7343
7344   // Every PLT entry needs a reloc.
7345   gsym->set_needs_dynsym_entry();
7346   this->rel_->add_global(gsym, elfcpp::R_ARM_JUMP_SLOT, this->got_plt_,
7347                          got_offset);
7348
7349   // Note that we don't need to save the symbol.  The contents of the
7350   // PLT are independent of which symbols are used.  The symbols only
7351   // appear in the relocations.
7352 }
7353
7354 // ARM PLTs.
7355 // FIXME:  This is not very flexible.  Right now this has only been tested
7356 // on armv5te.  If we are to support additional architecture features like
7357 // Thumb-2 or BE8, we need to make this more flexible like GNU ld.
7358
7359 // The first entry in the PLT.
7360 template<bool big_endian>
7361 const uint32_t Output_data_plt_arm<big_endian>::first_plt_entry[5] =
7362 {
7363   0xe52de004,   // str   lr, [sp, #-4]!
7364   0xe59fe004,   // ldr   lr, [pc, #4]
7365   0xe08fe00e,   // add   lr, pc, lr 
7366   0xe5bef008,   // ldr   pc, [lr, #8]!
7367   0x00000000,   // &GOT[0] - .
7368 };
7369
7370 // Subsequent entries in the PLT.
7371
7372 template<bool big_endian>
7373 const uint32_t Output_data_plt_arm<big_endian>::plt_entry[3] =
7374 {
7375   0xe28fc600,   // add   ip, pc, #0xNN00000
7376   0xe28cca00,   // add   ip, ip, #0xNN000
7377   0xe5bcf000,   // ldr   pc, [ip, #0xNNN]!
7378 };
7379
7380 // Write out the PLT.  This uses the hand-coded instructions above,
7381 // and adjusts them as needed.  This is all specified by the arm ELF
7382 // Processor Supplement.
7383
7384 template<bool big_endian>
7385 void
7386 Output_data_plt_arm<big_endian>::do_write(Output_file* of)
7387 {
7388   const off_t offset = this->offset();
7389   const section_size_type oview_size =
7390     convert_to_section_size_type(this->data_size());
7391   unsigned char* const oview = of->get_output_view(offset, oview_size);
7392
7393   const off_t got_file_offset = this->got_plt_->offset();
7394   const section_size_type got_size =
7395     convert_to_section_size_type(this->got_plt_->data_size());
7396   unsigned char* const got_view = of->get_output_view(got_file_offset,
7397                                                       got_size);
7398   unsigned char* pov = oview;
7399
7400   Arm_address plt_address = this->address();
7401   Arm_address got_address = this->got_plt_->address();
7402
7403   // Write first PLT entry.  All but the last word are constants.
7404   const size_t num_first_plt_words = (sizeof(first_plt_entry)
7405                                       / sizeof(plt_entry[0]));
7406   for (size_t i = 0; i < num_first_plt_words - 1; i++)
7407     elfcpp::Swap<32, big_endian>::writeval(pov + i * 4, first_plt_entry[i]);
7408   // Last word in first PLT entry is &GOT[0] - .
7409   elfcpp::Swap<32, big_endian>::writeval(pov + 16,
7410                                          got_address - (plt_address + 16));
7411   pov += sizeof(first_plt_entry);
7412
7413   unsigned char* got_pov = got_view;
7414
7415   memset(got_pov, 0, 12);
7416   got_pov += 12;
7417
7418   const int rel_size = elfcpp::Elf_sizes<32>::rel_size;
7419   unsigned int plt_offset = sizeof(first_plt_entry);
7420   unsigned int plt_rel_offset = 0;
7421   unsigned int got_offset = 12;
7422   const unsigned int count = this->count_;
7423   for (unsigned int i = 0;
7424        i < count;
7425        ++i,
7426          pov += sizeof(plt_entry),
7427          got_pov += 4,
7428          plt_offset += sizeof(plt_entry),
7429          plt_rel_offset += rel_size,
7430          got_offset += 4)
7431     {
7432       // Set and adjust the PLT entry itself.
7433       int32_t offset = ((got_address + got_offset)
7434                          - (plt_address + plt_offset + 8));
7435
7436       gold_assert(offset >= 0 && offset < 0x0fffffff);
7437       uint32_t plt_insn0 = plt_entry[0] | ((offset >> 20) & 0xff);
7438       elfcpp::Swap<32, big_endian>::writeval(pov, plt_insn0);
7439       uint32_t plt_insn1 = plt_entry[1] | ((offset >> 12) & 0xff);
7440       elfcpp::Swap<32, big_endian>::writeval(pov + 4, plt_insn1);
7441       uint32_t plt_insn2 = plt_entry[2] | (offset & 0xfff);
7442       elfcpp::Swap<32, big_endian>::writeval(pov + 8, plt_insn2);
7443
7444       // Set the entry in the GOT.
7445       elfcpp::Swap<32, big_endian>::writeval(got_pov, plt_address);
7446     }
7447
7448   gold_assert(static_cast<section_size_type>(pov - oview) == oview_size);
7449   gold_assert(static_cast<section_size_type>(got_pov - got_view) == got_size);
7450
7451   of->write_output_view(offset, oview_size, oview);
7452   of->write_output_view(got_file_offset, got_size, got_view);
7453 }
7454
7455 // Create a PLT entry for a global symbol.
7456
7457 template<bool big_endian>
7458 void
7459 Target_arm<big_endian>::make_plt_entry(Symbol_table* symtab, Layout* layout,
7460                                        Symbol* gsym)
7461 {
7462   if (gsym->has_plt_offset())
7463     return;
7464
7465   if (this->plt_ == NULL)
7466     {
7467       // Create the GOT sections first.
7468       this->got_section(symtab, layout);
7469
7470       this->plt_ = new Output_data_plt_arm<big_endian>(layout, this->got_plt_);
7471       layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS,
7472                                       (elfcpp::SHF_ALLOC
7473                                        | elfcpp::SHF_EXECINSTR),
7474                                       this->plt_, ORDER_PLT, false);
7475     }
7476   this->plt_->add_entry(gsym);
7477 }
7478
7479 // Return the number of entries in the PLT.
7480
7481 template<bool big_endian>
7482 unsigned int
7483 Target_arm<big_endian>::plt_entry_count() const
7484 {
7485   if (this->plt_ == NULL)
7486     return 0;
7487   return this->plt_->entry_count();
7488 }
7489
7490 // Return the offset of the first non-reserved PLT entry.
7491
7492 template<bool big_endian>
7493 unsigned int
7494 Target_arm<big_endian>::first_plt_entry_offset() const
7495 {
7496   return Output_data_plt_arm<big_endian>::first_plt_entry_offset();
7497 }
7498
7499 // Return the size of each PLT entry.
7500
7501 template<bool big_endian>
7502 unsigned int
7503 Target_arm<big_endian>::plt_entry_size() const
7504 {
7505   return Output_data_plt_arm<big_endian>::get_plt_entry_size();
7506 }
7507
7508 // Get the section to use for TLS_DESC relocations.
7509
7510 template<bool big_endian>
7511 typename Target_arm<big_endian>::Reloc_section*
7512 Target_arm<big_endian>::rel_tls_desc_section(Layout* layout) const
7513 {
7514   return this->plt_section()->rel_tls_desc(layout);
7515 }
7516
7517 // Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
7518
7519 template<bool big_endian>
7520 void
7521 Target_arm<big_endian>::define_tls_base_symbol(
7522     Symbol_table* symtab,
7523     Layout* layout)
7524 {
7525   if (this->tls_base_symbol_defined_)
7526     return;
7527
7528   Output_segment* tls_segment = layout->tls_segment();
7529   if (tls_segment != NULL)
7530     {
7531       bool is_exec = parameters->options().output_is_executable();
7532       symtab->define_in_output_segment("_TLS_MODULE_BASE_", NULL,
7533                                        Symbol_table::PREDEFINED,
7534                                        tls_segment, 0, 0,
7535                                        elfcpp::STT_TLS,
7536                                        elfcpp::STB_LOCAL,
7537                                        elfcpp::STV_HIDDEN, 0,
7538                                        (is_exec
7539                                         ? Symbol::SEGMENT_END
7540                                         : Symbol::SEGMENT_START),
7541                                        true);
7542     }
7543   this->tls_base_symbol_defined_ = true;
7544 }
7545
7546 // Create a GOT entry for the TLS module index.
7547
7548 template<bool big_endian>
7549 unsigned int
7550 Target_arm<big_endian>::got_mod_index_entry(
7551     Symbol_table* symtab,
7552     Layout* layout,
7553     Sized_relobj_file<32, big_endian>* object)
7554 {
7555   if (this->got_mod_index_offset_ == -1U)
7556     {
7557       gold_assert(symtab != NULL && layout != NULL && object != NULL);
7558       Arm_output_data_got<big_endian>* got = this->got_section(symtab, layout);
7559       unsigned int got_offset;
7560       if (!parameters->doing_static_link())
7561         {
7562           got_offset = got->add_constant(0);
7563           Reloc_section* rel_dyn = this->rel_dyn_section(layout);
7564           rel_dyn->add_local(object, 0, elfcpp::R_ARM_TLS_DTPMOD32, got,
7565                              got_offset);
7566         }
7567       else
7568         {
7569           // We are doing a static link.  Just mark it as belong to module 1,
7570           // the executable.
7571           got_offset = got->add_constant(1);
7572         }
7573
7574       got->add_constant(0);
7575       this->got_mod_index_offset_ = got_offset;
7576     }
7577   return this->got_mod_index_offset_;
7578 }
7579
7580 // Optimize the TLS relocation type based on what we know about the
7581 // symbol.  IS_FINAL is true if the final address of this symbol is
7582 // known at link time.
7583
7584 template<bool big_endian>
7585 tls::Tls_optimization
7586 Target_arm<big_endian>::optimize_tls_reloc(bool, int)
7587 {
7588   // FIXME: Currently we do not do any TLS optimization.
7589   return tls::TLSOPT_NONE;
7590 }
7591
7592 // Get the Reference_flags for a particular relocation.
7593
7594 template<bool big_endian>
7595 int
7596 Target_arm<big_endian>::Scan::get_reference_flags(unsigned int r_type)
7597 {
7598   switch (r_type)
7599     {
7600     case elfcpp::R_ARM_NONE:
7601     case elfcpp::R_ARM_V4BX:
7602     case elfcpp::R_ARM_GNU_VTENTRY:
7603     case elfcpp::R_ARM_GNU_VTINHERIT:
7604       // No symbol reference.
7605       return 0;
7606
7607     case elfcpp::R_ARM_ABS32:
7608     case elfcpp::R_ARM_ABS16:
7609     case elfcpp::R_ARM_ABS12:
7610     case elfcpp::R_ARM_THM_ABS5:
7611     case elfcpp::R_ARM_ABS8:
7612     case elfcpp::R_ARM_BASE_ABS:
7613     case elfcpp::R_ARM_MOVW_ABS_NC:
7614     case elfcpp::R_ARM_MOVT_ABS:
7615     case elfcpp::R_ARM_THM_MOVW_ABS_NC:
7616     case elfcpp::R_ARM_THM_MOVT_ABS:
7617     case elfcpp::R_ARM_ABS32_NOI:
7618       return Symbol::ABSOLUTE_REF;
7619
7620     case elfcpp::R_ARM_REL32:
7621     case elfcpp::R_ARM_LDR_PC_G0:
7622     case elfcpp::R_ARM_SBREL32:
7623     case elfcpp::R_ARM_THM_PC8:
7624     case elfcpp::R_ARM_BASE_PREL:
7625     case elfcpp::R_ARM_MOVW_PREL_NC:
7626     case elfcpp::R_ARM_MOVT_PREL:
7627     case elfcpp::R_ARM_THM_MOVW_PREL_NC:
7628     case elfcpp::R_ARM_THM_MOVT_PREL:
7629     case elfcpp::R_ARM_THM_ALU_PREL_11_0:
7630     case elfcpp::R_ARM_THM_PC12:
7631     case elfcpp::R_ARM_REL32_NOI:
7632     case elfcpp::R_ARM_ALU_PC_G0_NC:
7633     case elfcpp::R_ARM_ALU_PC_G0:
7634     case elfcpp::R_ARM_ALU_PC_G1_NC:
7635     case elfcpp::R_ARM_ALU_PC_G1:
7636     case elfcpp::R_ARM_ALU_PC_G2:
7637     case elfcpp::R_ARM_LDR_PC_G1:
7638     case elfcpp::R_ARM_LDR_PC_G2:
7639     case elfcpp::R_ARM_LDRS_PC_G0:
7640     case elfcpp::R_ARM_LDRS_PC_G1:
7641     case elfcpp::R_ARM_LDRS_PC_G2:
7642     case elfcpp::R_ARM_LDC_PC_G0:
7643     case elfcpp::R_ARM_LDC_PC_G1:
7644     case elfcpp::R_ARM_LDC_PC_G2:
7645     case elfcpp::R_ARM_ALU_SB_G0_NC:
7646     case elfcpp::R_ARM_ALU_SB_G0:
7647     case elfcpp::R_ARM_ALU_SB_G1_NC:
7648     case elfcpp::R_ARM_ALU_SB_G1:
7649     case elfcpp::R_ARM_ALU_SB_G2:
7650     case elfcpp::R_ARM_LDR_SB_G0:
7651     case elfcpp::R_ARM_LDR_SB_G1:
7652     case elfcpp::R_ARM_LDR_SB_G2:
7653     case elfcpp::R_ARM_LDRS_SB_G0:
7654     case elfcpp::R_ARM_LDRS_SB_G1:
7655     case elfcpp::R_ARM_LDRS_SB_G2:
7656     case elfcpp::R_ARM_LDC_SB_G0:
7657     case elfcpp::R_ARM_LDC_SB_G1:
7658     case elfcpp::R_ARM_LDC_SB_G2:
7659     case elfcpp::R_ARM_MOVW_BREL_NC:
7660     case elfcpp::R_ARM_MOVT_BREL:
7661     case elfcpp::R_ARM_MOVW_BREL:
7662     case elfcpp::R_ARM_THM_MOVW_BREL_NC:
7663     case elfcpp::R_ARM_THM_MOVT_BREL:
7664     case elfcpp::R_ARM_THM_MOVW_BREL:
7665     case elfcpp::R_ARM_GOTOFF32:
7666     case elfcpp::R_ARM_GOTOFF12:
7667     case elfcpp::R_ARM_SBREL31:
7668       return Symbol::RELATIVE_REF;
7669
7670     case elfcpp::R_ARM_PLT32:
7671     case elfcpp::R_ARM_CALL:
7672     case elfcpp::R_ARM_JUMP24:
7673     case elfcpp::R_ARM_THM_CALL:
7674     case elfcpp::R_ARM_THM_JUMP24:
7675     case elfcpp::R_ARM_THM_JUMP19:
7676     case elfcpp::R_ARM_THM_JUMP6:
7677     case elfcpp::R_ARM_THM_JUMP11:
7678     case elfcpp::R_ARM_THM_JUMP8:
7679     // R_ARM_PREL31 is not used to relocate call/jump instructions but
7680     // in unwind tables. It may point to functions via PLTs.
7681     // So we treat it like call/jump relocations above.
7682     case elfcpp::R_ARM_PREL31:
7683       return Symbol::FUNCTION_CALL | Symbol::RELATIVE_REF;
7684
7685     case elfcpp::R_ARM_GOT_BREL:
7686     case elfcpp::R_ARM_GOT_ABS:
7687     case elfcpp::R_ARM_GOT_PREL:
7688       // Absolute in GOT.
7689       return Symbol::ABSOLUTE_REF;
7690
7691     case elfcpp::R_ARM_TLS_GD32:        // Global-dynamic
7692     case elfcpp::R_ARM_TLS_LDM32:       // Local-dynamic
7693     case elfcpp::R_ARM_TLS_LDO32:       // Alternate local-dynamic
7694     case elfcpp::R_ARM_TLS_IE32:        // Initial-exec
7695     case elfcpp::R_ARM_TLS_LE32:        // Local-exec
7696       return Symbol::TLS_REF;
7697
7698     case elfcpp::R_ARM_TARGET1:
7699     case elfcpp::R_ARM_TARGET2:
7700     case elfcpp::R_ARM_COPY:
7701     case elfcpp::R_ARM_GLOB_DAT:
7702     case elfcpp::R_ARM_JUMP_SLOT:
7703     case elfcpp::R_ARM_RELATIVE:
7704     case elfcpp::R_ARM_PC24:
7705     case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
7706     case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
7707     case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
7708     default:
7709       // Not expected.  We will give an error later.
7710       return 0;
7711     }
7712 }
7713
7714 // Report an unsupported relocation against a local symbol.
7715
7716 template<bool big_endian>
7717 void
7718 Target_arm<big_endian>::Scan::unsupported_reloc_local(
7719     Sized_relobj_file<32, big_endian>* object,
7720     unsigned int r_type)
7721 {
7722   gold_error(_("%s: unsupported reloc %u against local symbol"),
7723              object->name().c_str(), r_type);
7724 }
7725
7726 // We are about to emit a dynamic relocation of type R_TYPE.  If the
7727 // dynamic linker does not support it, issue an error.  The GNU linker
7728 // only issues a non-PIC error for an allocated read-only section.
7729 // Here we know the section is allocated, but we don't know that it is
7730 // read-only.  But we check for all the relocation types which the
7731 // glibc dynamic linker supports, so it seems appropriate to issue an
7732 // error even if the section is not read-only.
7733
7734 template<bool big_endian>
7735 void
7736 Target_arm<big_endian>::Scan::check_non_pic(Relobj* object,
7737                                             unsigned int r_type)
7738 {
7739   switch (r_type)
7740     {
7741     // These are the relocation types supported by glibc for ARM.
7742     case elfcpp::R_ARM_RELATIVE:
7743     case elfcpp::R_ARM_COPY:
7744     case elfcpp::R_ARM_GLOB_DAT:
7745     case elfcpp::R_ARM_JUMP_SLOT:
7746     case elfcpp::R_ARM_ABS32:
7747     case elfcpp::R_ARM_ABS32_NOI:
7748     case elfcpp::R_ARM_PC24:
7749     // FIXME: The following 3 types are not supported by Android's dynamic
7750     // linker.
7751     case elfcpp::R_ARM_TLS_DTPMOD32:
7752     case elfcpp::R_ARM_TLS_DTPOFF32:
7753     case elfcpp::R_ARM_TLS_TPOFF32:
7754       return;
7755
7756     default:
7757       {
7758         // This prevents us from issuing more than one error per reloc
7759         // section.  But we can still wind up issuing more than one
7760         // error per object file.
7761         if (this->issued_non_pic_error_)
7762           return;
7763         const Arm_reloc_property* reloc_property =
7764           arm_reloc_property_table->get_reloc_property(r_type);
7765         gold_assert(reloc_property != NULL);
7766         object->error(_("requires unsupported dynamic reloc %s; "
7767                       "recompile with -fPIC"),
7768                       reloc_property->name().c_str());
7769         this->issued_non_pic_error_ = true;
7770         return;
7771       }
7772
7773     case elfcpp::R_ARM_NONE:
7774       gold_unreachable();
7775     }
7776 }
7777
7778 // Scan a relocation for a local symbol.
7779 // FIXME: This only handles a subset of relocation types used by Android
7780 // on ARM v5te devices.
7781
7782 template<bool big_endian>
7783 inline void
7784 Target_arm<big_endian>::Scan::local(Symbol_table* symtab,
7785                                     Layout* layout,
7786                                     Target_arm* target,
7787                                     Sized_relobj_file<32, big_endian>* object,
7788                                     unsigned int data_shndx,
7789                                     Output_section* output_section,
7790                                     const elfcpp::Rel<32, big_endian>& reloc,
7791                                     unsigned int r_type,
7792                                     const elfcpp::Sym<32, big_endian>& lsym)
7793 {
7794   r_type = get_real_reloc_type(r_type);
7795   switch (r_type)
7796     {
7797     case elfcpp::R_ARM_NONE:
7798     case elfcpp::R_ARM_V4BX:
7799     case elfcpp::R_ARM_GNU_VTENTRY:
7800     case elfcpp::R_ARM_GNU_VTINHERIT:
7801       break;
7802
7803     case elfcpp::R_ARM_ABS32:
7804     case elfcpp::R_ARM_ABS32_NOI:
7805       // If building a shared library (or a position-independent
7806       // executable), we need to create a dynamic relocation for
7807       // this location. The relocation applied at link time will
7808       // apply the link-time value, so we flag the location with
7809       // an R_ARM_RELATIVE relocation so the dynamic loader can
7810       // relocate it easily.
7811       if (parameters->options().output_is_position_independent())
7812         {
7813           Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7814           unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7815           // If we are to add more other reloc types than R_ARM_ABS32,
7816           // we need to add check_non_pic(object, r_type) here.
7817           rel_dyn->add_local_relative(object, r_sym, elfcpp::R_ARM_RELATIVE,
7818                                       output_section, data_shndx,
7819                                       reloc.get_r_offset());
7820         }
7821       break;
7822
7823     case elfcpp::R_ARM_ABS16:
7824     case elfcpp::R_ARM_ABS12:
7825     case elfcpp::R_ARM_THM_ABS5:
7826     case elfcpp::R_ARM_ABS8:
7827     case elfcpp::R_ARM_BASE_ABS:
7828     case elfcpp::R_ARM_MOVW_ABS_NC:
7829     case elfcpp::R_ARM_MOVT_ABS:
7830     case elfcpp::R_ARM_THM_MOVW_ABS_NC:
7831     case elfcpp::R_ARM_THM_MOVT_ABS:
7832       // If building a shared library (or a position-independent
7833       // executable), we need to create a dynamic relocation for
7834       // this location. Because the addend needs to remain in the
7835       // data section, we need to be careful not to apply this
7836       // relocation statically.
7837       if (parameters->options().output_is_position_independent())
7838         {
7839           check_non_pic(object, r_type);
7840           Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7841           unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7842           if (lsym.get_st_type() != elfcpp::STT_SECTION)
7843             rel_dyn->add_local(object, r_sym, r_type, output_section,
7844                                data_shndx, reloc.get_r_offset());
7845           else
7846             {
7847               gold_assert(lsym.get_st_value() == 0);
7848               unsigned int shndx = lsym.get_st_shndx();
7849               bool is_ordinary;
7850               shndx = object->adjust_sym_shndx(r_sym, shndx,
7851                                                &is_ordinary);
7852               if (!is_ordinary)
7853                 object->error(_("section symbol %u has bad shndx %u"),
7854                               r_sym, shndx);
7855               else
7856                 rel_dyn->add_local_section(object, shndx,
7857                                            r_type, output_section,
7858                                            data_shndx, reloc.get_r_offset());
7859             }
7860         }
7861       break;
7862
7863     case elfcpp::R_ARM_REL32:
7864     case elfcpp::R_ARM_LDR_PC_G0:
7865     case elfcpp::R_ARM_SBREL32:
7866     case elfcpp::R_ARM_THM_CALL:
7867     case elfcpp::R_ARM_THM_PC8:
7868     case elfcpp::R_ARM_BASE_PREL:
7869     case elfcpp::R_ARM_PLT32:
7870     case elfcpp::R_ARM_CALL:
7871     case elfcpp::R_ARM_JUMP24:
7872     case elfcpp::R_ARM_THM_JUMP24:
7873     case elfcpp::R_ARM_SBREL31:
7874     case elfcpp::R_ARM_PREL31:
7875     case elfcpp::R_ARM_MOVW_PREL_NC:
7876     case elfcpp::R_ARM_MOVT_PREL:
7877     case elfcpp::R_ARM_THM_MOVW_PREL_NC:
7878     case elfcpp::R_ARM_THM_MOVT_PREL:
7879     case elfcpp::R_ARM_THM_JUMP19:
7880     case elfcpp::R_ARM_THM_JUMP6:
7881     case elfcpp::R_ARM_THM_ALU_PREL_11_0:
7882     case elfcpp::R_ARM_THM_PC12:
7883     case elfcpp::R_ARM_REL32_NOI:
7884     case elfcpp::R_ARM_ALU_PC_G0_NC:
7885     case elfcpp::R_ARM_ALU_PC_G0:
7886     case elfcpp::R_ARM_ALU_PC_G1_NC:
7887     case elfcpp::R_ARM_ALU_PC_G1:
7888     case elfcpp::R_ARM_ALU_PC_G2:
7889     case elfcpp::R_ARM_LDR_PC_G1:
7890     case elfcpp::R_ARM_LDR_PC_G2:
7891     case elfcpp::R_ARM_LDRS_PC_G0:
7892     case elfcpp::R_ARM_LDRS_PC_G1:
7893     case elfcpp::R_ARM_LDRS_PC_G2:
7894     case elfcpp::R_ARM_LDC_PC_G0:
7895     case elfcpp::R_ARM_LDC_PC_G1:
7896     case elfcpp::R_ARM_LDC_PC_G2:
7897     case elfcpp::R_ARM_ALU_SB_G0_NC:
7898     case elfcpp::R_ARM_ALU_SB_G0:
7899     case elfcpp::R_ARM_ALU_SB_G1_NC:
7900     case elfcpp::R_ARM_ALU_SB_G1:
7901     case elfcpp::R_ARM_ALU_SB_G2:
7902     case elfcpp::R_ARM_LDR_SB_G0:
7903     case elfcpp::R_ARM_LDR_SB_G1:
7904     case elfcpp::R_ARM_LDR_SB_G2:
7905     case elfcpp::R_ARM_LDRS_SB_G0:
7906     case elfcpp::R_ARM_LDRS_SB_G1:
7907     case elfcpp::R_ARM_LDRS_SB_G2:
7908     case elfcpp::R_ARM_LDC_SB_G0:
7909     case elfcpp::R_ARM_LDC_SB_G1:
7910     case elfcpp::R_ARM_LDC_SB_G2:
7911     case elfcpp::R_ARM_MOVW_BREL_NC:
7912     case elfcpp::R_ARM_MOVT_BREL:
7913     case elfcpp::R_ARM_MOVW_BREL:
7914     case elfcpp::R_ARM_THM_MOVW_BREL_NC:
7915     case elfcpp::R_ARM_THM_MOVT_BREL:
7916     case elfcpp::R_ARM_THM_MOVW_BREL:
7917     case elfcpp::R_ARM_THM_JUMP11:
7918     case elfcpp::R_ARM_THM_JUMP8:
7919       // We don't need to do anything for a relative addressing relocation
7920       // against a local symbol if it does not reference the GOT.
7921       break;
7922
7923     case elfcpp::R_ARM_GOTOFF32:
7924     case elfcpp::R_ARM_GOTOFF12:
7925       // We need a GOT section:
7926       target->got_section(symtab, layout);
7927       break;
7928
7929     case elfcpp::R_ARM_GOT_BREL:
7930     case elfcpp::R_ARM_GOT_PREL:
7931       {
7932         // The symbol requires a GOT entry.
7933         Arm_output_data_got<big_endian>* got =
7934           target->got_section(symtab, layout);
7935         unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7936         if (got->add_local(object, r_sym, GOT_TYPE_STANDARD))
7937           {
7938             // If we are generating a shared object, we need to add a
7939             // dynamic RELATIVE relocation for this symbol's GOT entry.
7940             if (parameters->options().output_is_position_independent())
7941               {
7942                 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7943                 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7944                 rel_dyn->add_local_relative(
7945                     object, r_sym, elfcpp::R_ARM_RELATIVE, got,
7946                     object->local_got_offset(r_sym, GOT_TYPE_STANDARD));
7947               }
7948           }
7949       }
7950       break;
7951
7952     case elfcpp::R_ARM_TARGET1:
7953     case elfcpp::R_ARM_TARGET2:
7954       // This should have been mapped to another type already.
7955       // Fall through.
7956     case elfcpp::R_ARM_COPY:
7957     case elfcpp::R_ARM_GLOB_DAT:
7958     case elfcpp::R_ARM_JUMP_SLOT:
7959     case elfcpp::R_ARM_RELATIVE:
7960       // These are relocations which should only be seen by the
7961       // dynamic linker, and should never be seen here.
7962       gold_error(_("%s: unexpected reloc %u in object file"),
7963                  object->name().c_str(), r_type);
7964       break;
7965
7966
7967       // These are initial TLS relocs, which are expected when
7968       // linking.
7969     case elfcpp::R_ARM_TLS_GD32:        // Global-dynamic
7970     case elfcpp::R_ARM_TLS_LDM32:       // Local-dynamic
7971     case elfcpp::R_ARM_TLS_LDO32:       // Alternate local-dynamic
7972     case elfcpp::R_ARM_TLS_IE32:        // Initial-exec
7973     case elfcpp::R_ARM_TLS_LE32:        // Local-exec
7974       {
7975         bool output_is_shared = parameters->options().shared();
7976         const tls::Tls_optimization optimized_type
7977             = Target_arm<big_endian>::optimize_tls_reloc(!output_is_shared,
7978                                                          r_type);
7979         switch (r_type)
7980           {
7981           case elfcpp::R_ARM_TLS_GD32:          // Global-dynamic
7982             if (optimized_type == tls::TLSOPT_NONE)
7983               {
7984                 // Create a pair of GOT entries for the module index and
7985                 // dtv-relative offset.
7986                 Arm_output_data_got<big_endian>* got
7987                     = target->got_section(symtab, layout);
7988                 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7989                 unsigned int shndx = lsym.get_st_shndx();
7990                 bool is_ordinary;
7991                 shndx = object->adjust_sym_shndx(r_sym, shndx, &is_ordinary);
7992                 if (!is_ordinary)
7993                   {
7994                     object->error(_("local symbol %u has bad shndx %u"),
7995                                   r_sym, shndx);
7996                     break;
7997                   }
7998
7999                 if (!parameters->doing_static_link())
8000                   got->add_local_pair_with_rel(object, r_sym, shndx,
8001                                                GOT_TYPE_TLS_PAIR,
8002                                                target->rel_dyn_section(layout),
8003                                                elfcpp::R_ARM_TLS_DTPMOD32, 0);
8004                 else
8005                   got->add_tls_gd32_with_static_reloc(GOT_TYPE_TLS_PAIR,
8006                                                       object, r_sym);
8007               }
8008             else
8009               // FIXME: TLS optimization not supported yet.
8010               gold_unreachable();
8011             break;
8012
8013           case elfcpp::R_ARM_TLS_LDM32:         // Local-dynamic
8014             if (optimized_type == tls::TLSOPT_NONE)
8015               {
8016                 // Create a GOT entry for the module index.
8017                 target->got_mod_index_entry(symtab, layout, object);
8018               }
8019             else
8020               // FIXME: TLS optimization not supported yet.
8021               gold_unreachable();
8022             break;
8023
8024           case elfcpp::R_ARM_TLS_LDO32:         // Alternate local-dynamic
8025             break;
8026
8027           case elfcpp::R_ARM_TLS_IE32:          // Initial-exec
8028             layout->set_has_static_tls();
8029             if (optimized_type == tls::TLSOPT_NONE)
8030               {
8031                 // Create a GOT entry for the tp-relative offset.
8032                 Arm_output_data_got<big_endian>* got
8033                   = target->got_section(symtab, layout);
8034                 unsigned int r_sym =
8035                    elfcpp::elf_r_sym<32>(reloc.get_r_info());
8036                 if (!parameters->doing_static_link())
8037                     got->add_local_with_rel(object, r_sym, GOT_TYPE_TLS_OFFSET,
8038                                             target->rel_dyn_section(layout),
8039                                             elfcpp::R_ARM_TLS_TPOFF32);
8040                 else if (!object->local_has_got_offset(r_sym,
8041                                                        GOT_TYPE_TLS_OFFSET))
8042                   {
8043                     got->add_local(object, r_sym, GOT_TYPE_TLS_OFFSET);
8044                     unsigned int got_offset =
8045                       object->local_got_offset(r_sym, GOT_TYPE_TLS_OFFSET);
8046                     got->add_static_reloc(got_offset,
8047                                           elfcpp::R_ARM_TLS_TPOFF32, object,
8048                                           r_sym);
8049                   }
8050               }
8051             else
8052               // FIXME: TLS optimization not supported yet.
8053               gold_unreachable();
8054             break;
8055
8056           case elfcpp::R_ARM_TLS_LE32:          // Local-exec
8057             layout->set_has_static_tls();
8058             if (output_is_shared)
8059               {
8060                 // We need to create a dynamic relocation.
8061                 gold_assert(lsym.get_st_type() != elfcpp::STT_SECTION);
8062                 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
8063                 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8064                 rel_dyn->add_local(object, r_sym, elfcpp::R_ARM_TLS_TPOFF32,
8065                                    output_section, data_shndx,
8066                                    reloc.get_r_offset());
8067               }
8068             break;
8069
8070           default:
8071             gold_unreachable();
8072           }
8073       }
8074       break;
8075
8076     case elfcpp::R_ARM_PC24:
8077     case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
8078     case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
8079     case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
8080     default:
8081       unsupported_reloc_local(object, r_type);
8082       break;
8083     }
8084 }
8085
8086 // Report an unsupported relocation against a global symbol.
8087
8088 template<bool big_endian>
8089 void
8090 Target_arm<big_endian>::Scan::unsupported_reloc_global(
8091     Sized_relobj_file<32, big_endian>* object,
8092     unsigned int r_type,
8093     Symbol* gsym)
8094 {
8095   gold_error(_("%s: unsupported reloc %u against global symbol %s"),
8096              object->name().c_str(), r_type, gsym->demangled_name().c_str());
8097 }
8098
8099 template<bool big_endian>
8100 inline bool
8101 Target_arm<big_endian>::Scan::possible_function_pointer_reloc(
8102     unsigned int r_type)
8103 {
8104   switch (r_type)
8105     {
8106     case elfcpp::R_ARM_PC24:
8107     case elfcpp::R_ARM_THM_CALL:
8108     case elfcpp::R_ARM_PLT32:
8109     case elfcpp::R_ARM_CALL:
8110     case elfcpp::R_ARM_JUMP24:
8111     case elfcpp::R_ARM_THM_JUMP24:
8112     case elfcpp::R_ARM_SBREL31:
8113     case elfcpp::R_ARM_PREL31:
8114     case elfcpp::R_ARM_THM_JUMP19:
8115     case elfcpp::R_ARM_THM_JUMP6:
8116     case elfcpp::R_ARM_THM_JUMP11:
8117     case elfcpp::R_ARM_THM_JUMP8:
8118       // All the relocations above are branches except SBREL31 and PREL31.
8119       return false;
8120
8121     default:
8122       // Be conservative and assume this is a function pointer.
8123       return true;
8124     }
8125 }
8126
8127 template<bool big_endian>
8128 inline bool
8129 Target_arm<big_endian>::Scan::local_reloc_may_be_function_pointer(
8130   Symbol_table*,
8131   Layout*,
8132   Target_arm<big_endian>* target,
8133   Sized_relobj_file<32, big_endian>*,
8134   unsigned int,
8135   Output_section*,
8136   const elfcpp::Rel<32, big_endian>&,
8137   unsigned int r_type,
8138   const elfcpp::Sym<32, big_endian>&)
8139 {
8140   r_type = target->get_real_reloc_type(r_type);
8141   return possible_function_pointer_reloc(r_type);
8142 }
8143
8144 template<bool big_endian>
8145 inline bool
8146 Target_arm<big_endian>::Scan::global_reloc_may_be_function_pointer(
8147   Symbol_table*,
8148   Layout*,
8149   Target_arm<big_endian>* target,
8150   Sized_relobj_file<32, big_endian>*,
8151   unsigned int,
8152   Output_section*,
8153   const elfcpp::Rel<32, big_endian>&,
8154   unsigned int r_type,
8155   Symbol* gsym)
8156 {
8157   // GOT is not a function.
8158   if (strcmp(gsym->name(), "_GLOBAL_OFFSET_TABLE_") == 0)
8159     return false;
8160
8161   r_type = target->get_real_reloc_type(r_type);
8162   return possible_function_pointer_reloc(r_type);
8163 }
8164
8165 // Scan a relocation for a global symbol.
8166
8167 template<bool big_endian>
8168 inline void
8169 Target_arm<big_endian>::Scan::global(Symbol_table* symtab,
8170                                      Layout* layout,
8171                                      Target_arm* target,
8172                                      Sized_relobj_file<32, big_endian>* object,
8173                                      unsigned int data_shndx,
8174                                      Output_section* output_section,
8175                                      const elfcpp::Rel<32, big_endian>& reloc,
8176                                      unsigned int r_type,
8177                                      Symbol* gsym)
8178 {
8179   // A reference to _GLOBAL_OFFSET_TABLE_ implies that we need a got
8180   // section.  We check here to avoid creating a dynamic reloc against
8181   // _GLOBAL_OFFSET_TABLE_.
8182   if (!target->has_got_section()
8183       && strcmp(gsym->name(), "_GLOBAL_OFFSET_TABLE_") == 0)
8184     target->got_section(symtab, layout);
8185
8186   r_type = get_real_reloc_type(r_type);
8187   switch (r_type)
8188     {
8189     case elfcpp::R_ARM_NONE:
8190     case elfcpp::R_ARM_V4BX:
8191     case elfcpp::R_ARM_GNU_VTENTRY:
8192     case elfcpp::R_ARM_GNU_VTINHERIT:
8193       break;
8194
8195     case elfcpp::R_ARM_ABS32:
8196     case elfcpp::R_ARM_ABS16:
8197     case elfcpp::R_ARM_ABS12:
8198     case elfcpp::R_ARM_THM_ABS5:
8199     case elfcpp::R_ARM_ABS8:
8200     case elfcpp::R_ARM_BASE_ABS:
8201     case elfcpp::R_ARM_MOVW_ABS_NC:
8202     case elfcpp::R_ARM_MOVT_ABS:
8203     case elfcpp::R_ARM_THM_MOVW_ABS_NC:
8204     case elfcpp::R_ARM_THM_MOVT_ABS:
8205     case elfcpp::R_ARM_ABS32_NOI:
8206       // Absolute addressing relocations.
8207       {
8208         // Make a PLT entry if necessary.
8209         if (this->symbol_needs_plt_entry(gsym))
8210           {
8211             target->make_plt_entry(symtab, layout, gsym);
8212             // Since this is not a PC-relative relocation, we may be
8213             // taking the address of a function. In that case we need to
8214             // set the entry in the dynamic symbol table to the address of
8215             // the PLT entry.
8216             if (gsym->is_from_dynobj() && !parameters->options().shared())
8217               gsym->set_needs_dynsym_value();
8218           }
8219         // Make a dynamic relocation if necessary.
8220         if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type)))
8221           {
8222             if (gsym->may_need_copy_reloc())
8223               {
8224                 target->copy_reloc(symtab, layout, object,
8225                                    data_shndx, output_section, gsym, reloc);
8226               }
8227             else if ((r_type == elfcpp::R_ARM_ABS32
8228                       || r_type == elfcpp::R_ARM_ABS32_NOI)
8229                      && gsym->can_use_relative_reloc(false))
8230               {
8231                 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8232                 rel_dyn->add_global_relative(gsym, elfcpp::R_ARM_RELATIVE,
8233                                              output_section, object,
8234                                              data_shndx, reloc.get_r_offset());
8235               }
8236             else
8237               {
8238                 check_non_pic(object, r_type);
8239                 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8240                 rel_dyn->add_global(gsym, r_type, output_section, object,
8241                                     data_shndx, reloc.get_r_offset());
8242               }
8243           }
8244       }
8245       break;
8246
8247     case elfcpp::R_ARM_GOTOFF32:
8248     case elfcpp::R_ARM_GOTOFF12:
8249       // We need a GOT section.
8250       target->got_section(symtab, layout);
8251       break;
8252       
8253     case elfcpp::R_ARM_REL32:
8254     case elfcpp::R_ARM_LDR_PC_G0:
8255     case elfcpp::R_ARM_SBREL32:
8256     case elfcpp::R_ARM_THM_PC8:
8257     case elfcpp::R_ARM_BASE_PREL:
8258     case elfcpp::R_ARM_MOVW_PREL_NC:
8259     case elfcpp::R_ARM_MOVT_PREL:
8260     case elfcpp::R_ARM_THM_MOVW_PREL_NC:
8261     case elfcpp::R_ARM_THM_MOVT_PREL:
8262     case elfcpp::R_ARM_THM_ALU_PREL_11_0:
8263     case elfcpp::R_ARM_THM_PC12:
8264     case elfcpp::R_ARM_REL32_NOI:
8265     case elfcpp::R_ARM_ALU_PC_G0_NC:
8266     case elfcpp::R_ARM_ALU_PC_G0:
8267     case elfcpp::R_ARM_ALU_PC_G1_NC:
8268     case elfcpp::R_ARM_ALU_PC_G1:
8269     case elfcpp::R_ARM_ALU_PC_G2:
8270     case elfcpp::R_ARM_LDR_PC_G1:
8271     case elfcpp::R_ARM_LDR_PC_G2:
8272     case elfcpp::R_ARM_LDRS_PC_G0:
8273     case elfcpp::R_ARM_LDRS_PC_G1:
8274     case elfcpp::R_ARM_LDRS_PC_G2:
8275     case elfcpp::R_ARM_LDC_PC_G0:
8276     case elfcpp::R_ARM_LDC_PC_G1:
8277     case elfcpp::R_ARM_LDC_PC_G2:
8278     case elfcpp::R_ARM_ALU_SB_G0_NC:
8279     case elfcpp::R_ARM_ALU_SB_G0:
8280     case elfcpp::R_ARM_ALU_SB_G1_NC:
8281     case elfcpp::R_ARM_ALU_SB_G1:
8282     case elfcpp::R_ARM_ALU_SB_G2:
8283     case elfcpp::R_ARM_LDR_SB_G0:
8284     case elfcpp::R_ARM_LDR_SB_G1:
8285     case elfcpp::R_ARM_LDR_SB_G2:
8286     case elfcpp::R_ARM_LDRS_SB_G0:
8287     case elfcpp::R_ARM_LDRS_SB_G1:
8288     case elfcpp::R_ARM_LDRS_SB_G2:
8289     case elfcpp::R_ARM_LDC_SB_G0:
8290     case elfcpp::R_ARM_LDC_SB_G1:
8291     case elfcpp::R_ARM_LDC_SB_G2:
8292     case elfcpp::R_ARM_MOVW_BREL_NC:
8293     case elfcpp::R_ARM_MOVT_BREL:
8294     case elfcpp::R_ARM_MOVW_BREL:
8295     case elfcpp::R_ARM_THM_MOVW_BREL_NC:
8296     case elfcpp::R_ARM_THM_MOVT_BREL:
8297     case elfcpp::R_ARM_THM_MOVW_BREL:
8298       // Relative addressing relocations.
8299       {
8300         // Make a dynamic relocation if necessary.
8301         if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type)))
8302           {
8303             if (target->may_need_copy_reloc(gsym))
8304               {
8305                 target->copy_reloc(symtab, layout, object,
8306                                    data_shndx, output_section, gsym, reloc);
8307               }
8308             else
8309               {
8310                 check_non_pic(object, r_type);
8311                 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8312                 rel_dyn->add_global(gsym, r_type, output_section, object,
8313                                     data_shndx, reloc.get_r_offset());
8314               }
8315           }
8316       }
8317       break;
8318
8319     case elfcpp::R_ARM_THM_CALL:
8320     case elfcpp::R_ARM_PLT32:
8321     case elfcpp::R_ARM_CALL:
8322     case elfcpp::R_ARM_JUMP24:
8323     case elfcpp::R_ARM_THM_JUMP24:
8324     case elfcpp::R_ARM_SBREL31:
8325     case elfcpp::R_ARM_PREL31:
8326     case elfcpp::R_ARM_THM_JUMP19:
8327     case elfcpp::R_ARM_THM_JUMP6:
8328     case elfcpp::R_ARM_THM_JUMP11:
8329     case elfcpp::R_ARM_THM_JUMP8:
8330       // All the relocation above are branches except for the PREL31 ones.
8331       // A PREL31 relocation can point to a personality function in a shared
8332       // library.  In that case we want to use a PLT because we want to
8333       // call the personality routine and the dynamic linkers we care about
8334       // do not support dynamic PREL31 relocations. An REL31 relocation may
8335       // point to a function whose unwinding behaviour is being described but
8336       // we will not mistakenly generate a PLT for that because we should use
8337       // a local section symbol.
8338
8339       // If the symbol is fully resolved, this is just a relative
8340       // local reloc.  Otherwise we need a PLT entry.
8341       if (gsym->final_value_is_known())
8342         break;
8343       // If building a shared library, we can also skip the PLT entry
8344       // if the symbol is defined in the output file and is protected
8345       // or hidden.
8346       if (gsym->is_defined()
8347           && !gsym->is_from_dynobj()
8348           && !gsym->is_preemptible())
8349         break;
8350       target->make_plt_entry(symtab, layout, gsym);
8351       break;
8352
8353     case elfcpp::R_ARM_GOT_BREL:
8354     case elfcpp::R_ARM_GOT_ABS:
8355     case elfcpp::R_ARM_GOT_PREL:
8356       {
8357         // The symbol requires a GOT entry.
8358         Arm_output_data_got<big_endian>* got =
8359           target->got_section(symtab, layout);
8360         if (gsym->final_value_is_known())
8361           got->add_global(gsym, GOT_TYPE_STANDARD);
8362         else
8363           {
8364             // If this symbol is not fully resolved, we need to add a
8365             // GOT entry with a dynamic relocation.
8366             Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8367             if (gsym->is_from_dynobj()
8368                 || gsym->is_undefined()
8369                 || gsym->is_preemptible())
8370               got->add_global_with_rel(gsym, GOT_TYPE_STANDARD,
8371                                        rel_dyn, elfcpp::R_ARM_GLOB_DAT);
8372             else
8373               {
8374                 if (got->add_global(gsym, GOT_TYPE_STANDARD))
8375                   rel_dyn->add_global_relative(
8376                       gsym, elfcpp::R_ARM_RELATIVE, got,
8377                       gsym->got_offset(GOT_TYPE_STANDARD));
8378               }
8379           }
8380       }
8381       break;
8382
8383     case elfcpp::R_ARM_TARGET1:
8384     case elfcpp::R_ARM_TARGET2:
8385       // These should have been mapped to other types already.
8386       // Fall through.
8387     case elfcpp::R_ARM_COPY:
8388     case elfcpp::R_ARM_GLOB_DAT:
8389     case elfcpp::R_ARM_JUMP_SLOT:
8390     case elfcpp::R_ARM_RELATIVE:
8391       // These are relocations which should only be seen by the
8392       // dynamic linker, and should never be seen here.
8393       gold_error(_("%s: unexpected reloc %u in object file"),
8394                  object->name().c_str(), r_type);
8395       break;
8396
8397       // These are initial tls relocs, which are expected when
8398       // linking.
8399     case elfcpp::R_ARM_TLS_GD32:        // Global-dynamic
8400     case elfcpp::R_ARM_TLS_LDM32:       // Local-dynamic
8401     case elfcpp::R_ARM_TLS_LDO32:       // Alternate local-dynamic
8402     case elfcpp::R_ARM_TLS_IE32:        // Initial-exec
8403     case elfcpp::R_ARM_TLS_LE32:        // Local-exec
8404       {
8405         const bool is_final = gsym->final_value_is_known();
8406         const tls::Tls_optimization optimized_type
8407             = Target_arm<big_endian>::optimize_tls_reloc(is_final, r_type);
8408         switch (r_type)
8409           {
8410           case elfcpp::R_ARM_TLS_GD32:          // Global-dynamic
8411             if (optimized_type == tls::TLSOPT_NONE)
8412               {
8413                 // Create a pair of GOT entries for the module index and
8414                 // dtv-relative offset.
8415                 Arm_output_data_got<big_endian>* got
8416                     = target->got_section(symtab, layout);
8417                 if (!parameters->doing_static_link())
8418                   got->add_global_pair_with_rel(gsym, GOT_TYPE_TLS_PAIR,
8419                                                 target->rel_dyn_section(layout),
8420                                                 elfcpp::R_ARM_TLS_DTPMOD32,
8421                                                 elfcpp::R_ARM_TLS_DTPOFF32);
8422                 else
8423                   got->add_tls_gd32_with_static_reloc(GOT_TYPE_TLS_PAIR, gsym);
8424               }
8425             else
8426               // FIXME: TLS optimization not supported yet.
8427               gold_unreachable();
8428             break;
8429
8430           case elfcpp::R_ARM_TLS_LDM32:         // Local-dynamic
8431             if (optimized_type == tls::TLSOPT_NONE)
8432               {
8433                 // Create a GOT entry for the module index.
8434                 target->got_mod_index_entry(symtab, layout, object);
8435               }
8436             else
8437               // FIXME: TLS optimization not supported yet.
8438               gold_unreachable();
8439             break;
8440
8441           case elfcpp::R_ARM_TLS_LDO32:         // Alternate local-dynamic
8442             break;
8443
8444           case elfcpp::R_ARM_TLS_IE32:          // Initial-exec
8445             layout->set_has_static_tls();
8446             if (optimized_type == tls::TLSOPT_NONE)
8447               {
8448                 // Create a GOT entry for the tp-relative offset.
8449                 Arm_output_data_got<big_endian>* got
8450                   = target->got_section(symtab, layout);
8451                 if (!parameters->doing_static_link())
8452                   got->add_global_with_rel(gsym, GOT_TYPE_TLS_OFFSET,
8453                                            target->rel_dyn_section(layout),
8454                                            elfcpp::R_ARM_TLS_TPOFF32);
8455                 else if (!gsym->has_got_offset(GOT_TYPE_TLS_OFFSET))
8456                   {
8457                     got->add_global(gsym, GOT_TYPE_TLS_OFFSET);
8458                     unsigned int got_offset =
8459                        gsym->got_offset(GOT_TYPE_TLS_OFFSET);
8460                     got->add_static_reloc(got_offset,
8461                                           elfcpp::R_ARM_TLS_TPOFF32, gsym);
8462                   }
8463               }
8464             else
8465               // FIXME: TLS optimization not supported yet.
8466               gold_unreachable();
8467             break;
8468
8469           case elfcpp::R_ARM_TLS_LE32:  // Local-exec
8470             layout->set_has_static_tls();
8471             if (parameters->options().shared())
8472               {
8473                 // We need to create a dynamic relocation.
8474                 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8475                 rel_dyn->add_global(gsym, elfcpp::R_ARM_TLS_TPOFF32,
8476                                     output_section, object,
8477                                     data_shndx, reloc.get_r_offset());
8478               }
8479             break;
8480
8481           default:
8482             gold_unreachable();
8483           }
8484       }
8485       break;
8486
8487     case elfcpp::R_ARM_PC24:
8488     case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
8489     case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
8490     case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
8491     default:
8492       unsupported_reloc_global(object, r_type, gsym);
8493       break;
8494     }
8495 }
8496
8497 // Process relocations for gc.
8498
8499 template<bool big_endian>
8500 void
8501 Target_arm<big_endian>::gc_process_relocs(
8502     Symbol_table* symtab,
8503     Layout* layout,
8504     Sized_relobj_file<32, big_endian>* object,
8505     unsigned int data_shndx,
8506     unsigned int,
8507     const unsigned char* prelocs,
8508     size_t reloc_count,
8509     Output_section* output_section,
8510     bool needs_special_offset_handling,
8511     size_t local_symbol_count,
8512     const unsigned char* plocal_symbols)
8513 {
8514   typedef Target_arm<big_endian> Arm;
8515   typedef typename Target_arm<big_endian>::Scan Scan;
8516
8517   gold::gc_process_relocs<32, big_endian, Arm, elfcpp::SHT_REL, Scan,
8518                           typename Target_arm::Relocatable_size_for_reloc>(
8519     symtab,
8520     layout,
8521     this,
8522     object,
8523     data_shndx,
8524     prelocs,
8525     reloc_count,
8526     output_section,
8527     needs_special_offset_handling,
8528     local_symbol_count,
8529     plocal_symbols);
8530 }
8531
8532 // Scan relocations for a section.
8533
8534 template<bool big_endian>
8535 void
8536 Target_arm<big_endian>::scan_relocs(Symbol_table* symtab,
8537                                     Layout* layout,
8538                                     Sized_relobj_file<32, big_endian>* object,
8539                                     unsigned int data_shndx,
8540                                     unsigned int sh_type,
8541                                     const unsigned char* prelocs,
8542                                     size_t reloc_count,
8543                                     Output_section* output_section,
8544                                     bool needs_special_offset_handling,
8545                                     size_t local_symbol_count,
8546                                     const unsigned char* plocal_symbols)
8547 {
8548   typedef typename Target_arm<big_endian>::Scan Scan;
8549   if (sh_type == elfcpp::SHT_RELA)
8550     {
8551       gold_error(_("%s: unsupported RELA reloc section"),
8552                  object->name().c_str());
8553       return;
8554     }
8555
8556   gold::scan_relocs<32, big_endian, Target_arm, elfcpp::SHT_REL, Scan>(
8557     symtab,
8558     layout,
8559     this,
8560     object,
8561     data_shndx,
8562     prelocs,
8563     reloc_count,
8564     output_section,
8565     needs_special_offset_handling,
8566     local_symbol_count,
8567     plocal_symbols);
8568 }
8569
8570 // Finalize the sections.
8571
8572 template<bool big_endian>
8573 void
8574 Target_arm<big_endian>::do_finalize_sections(
8575     Layout* layout,
8576     const Input_objects* input_objects,
8577     Symbol_table* symtab)
8578 {
8579   bool merged_any_attributes = false;
8580   // Merge processor-specific flags.
8581   for (Input_objects::Relobj_iterator p = input_objects->relobj_begin();
8582        p != input_objects->relobj_end();
8583        ++p)
8584     {
8585       Arm_relobj<big_endian>* arm_relobj =
8586         Arm_relobj<big_endian>::as_arm_relobj(*p);
8587       if (arm_relobj->merge_flags_and_attributes())
8588         {
8589           this->merge_processor_specific_flags(
8590               arm_relobj->name(),
8591               arm_relobj->processor_specific_flags());
8592           this->merge_object_attributes(arm_relobj->name().c_str(),
8593                                         arm_relobj->attributes_section_data());
8594           merged_any_attributes = true;
8595         }
8596     } 
8597
8598   for (Input_objects::Dynobj_iterator p = input_objects->dynobj_begin();
8599        p != input_objects->dynobj_end();
8600        ++p)
8601     {
8602       Arm_dynobj<big_endian>* arm_dynobj =
8603         Arm_dynobj<big_endian>::as_arm_dynobj(*p);
8604       this->merge_processor_specific_flags(
8605           arm_dynobj->name(),
8606           arm_dynobj->processor_specific_flags());
8607       this->merge_object_attributes(arm_dynobj->name().c_str(),
8608                                     arm_dynobj->attributes_section_data());
8609       merged_any_attributes = true;
8610     }
8611
8612   // Create an empty uninitialized attribute section if we still don't have it
8613   // at this moment.  This happens if there is no attributes sections in all
8614   // inputs.
8615   if (this->attributes_section_data_ == NULL)
8616     this->attributes_section_data_ = new Attributes_section_data(NULL, 0);
8617
8618   const Object_attribute* cpu_arch_attr =
8619     this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
8620   // Check if we need to use Cortex-A8 workaround.
8621   if (parameters->options().user_set_fix_cortex_a8())
8622     this->fix_cortex_a8_ = parameters->options().fix_cortex_a8();
8623   else
8624     {
8625       // If neither --fix-cortex-a8 nor --no-fix-cortex-a8 is used, turn on
8626       // Cortex-A8 erratum workaround for ARMv7-A or ARMv7 with unknown
8627       // profile.  
8628       const Object_attribute* cpu_arch_profile_attr =
8629         this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch_profile);
8630       this->fix_cortex_a8_ =
8631         (cpu_arch_attr->int_value() == elfcpp::TAG_CPU_ARCH_V7
8632          && (cpu_arch_profile_attr->int_value() == 'A'
8633              || cpu_arch_profile_attr->int_value() == 0));
8634     }
8635   
8636   // Check if we can use V4BX interworking.
8637   // The V4BX interworking stub contains BX instruction,
8638   // which is not specified for some profiles.
8639   if (this->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING
8640       && !this->may_use_v4t_interworking())
8641     gold_error(_("unable to provide V4BX reloc interworking fix up; "
8642                  "the target profile does not support BX instruction"));
8643
8644   // Fill in some more dynamic tags.
8645   const Reloc_section* rel_plt = (this->plt_ == NULL
8646                                   ? NULL
8647                                   : this->plt_->rel_plt());
8648   layout->add_target_dynamic_tags(true, this->got_plt_, rel_plt,
8649                                   this->rel_dyn_, true, false);
8650
8651   // Emit any relocs we saved in an attempt to avoid generating COPY
8652   // relocs.
8653   if (this->copy_relocs_.any_saved_relocs())
8654     this->copy_relocs_.emit(this->rel_dyn_section(layout));
8655
8656   // Handle the .ARM.exidx section.
8657   Output_section* exidx_section = layout->find_output_section(".ARM.exidx");
8658
8659   if (!parameters->options().relocatable())
8660     {
8661       if (exidx_section != NULL
8662           && exidx_section->type() == elfcpp::SHT_ARM_EXIDX)
8663         {
8664           // Create __exidx_start and __exidx_end symbols.
8665           symtab->define_in_output_data("__exidx_start", NULL,
8666                                         Symbol_table::PREDEFINED,
8667                                         exidx_section, 0, 0, elfcpp::STT_OBJECT,
8668                                         elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN,
8669                                         0, false, true);
8670           symtab->define_in_output_data("__exidx_end", NULL,
8671                                         Symbol_table::PREDEFINED,
8672                                         exidx_section, 0, 0, elfcpp::STT_OBJECT,
8673                                         elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN,
8674                                         0, true, true);
8675
8676           // For the ARM target, we need to add a PT_ARM_EXIDX segment for
8677           // the .ARM.exidx section.
8678           if (!layout->script_options()->saw_phdrs_clause())
8679             {
8680               gold_assert(layout->find_output_segment(elfcpp::PT_ARM_EXIDX, 0,
8681                                                       0)
8682                           == NULL);
8683               Output_segment*  exidx_segment =
8684                 layout->make_output_segment(elfcpp::PT_ARM_EXIDX, elfcpp::PF_R);
8685               exidx_segment->add_output_section_to_nonload(exidx_section,
8686                                                            elfcpp::PF_R);
8687             }
8688         }
8689       else
8690         {
8691           symtab->define_as_constant("__exidx_start", NULL,
8692                                      Symbol_table::PREDEFINED,
8693                                      0, 0, elfcpp::STT_OBJECT,
8694                                      elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
8695                                      true, false);
8696           symtab->define_as_constant("__exidx_end", NULL,
8697                                      Symbol_table::PREDEFINED,
8698                                      0, 0, elfcpp::STT_OBJECT,
8699                                      elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
8700                                      true, false);
8701         }
8702     }
8703
8704   // Create an .ARM.attributes section if we have merged any attributes
8705   // from inputs.
8706   if (merged_any_attributes)
8707     {
8708       Output_attributes_section_data* attributes_section =
8709       new Output_attributes_section_data(*this->attributes_section_data_);
8710       layout->add_output_section_data(".ARM.attributes",
8711                                       elfcpp::SHT_ARM_ATTRIBUTES, 0,
8712                                       attributes_section, ORDER_INVALID,
8713                                       false);
8714     }
8715
8716   // Fix up links in section EXIDX headers.
8717   for (Layout::Section_list::const_iterator p = layout->section_list().begin();
8718        p != layout->section_list().end();
8719        ++p)
8720     if ((*p)->type() == elfcpp::SHT_ARM_EXIDX)
8721       {
8722         Arm_output_section<big_endian>* os =
8723           Arm_output_section<big_endian>::as_arm_output_section(*p);
8724         os->set_exidx_section_link();
8725       }
8726 }
8727
8728 // Return whether a direct absolute static relocation needs to be applied.
8729 // In cases where Scan::local() or Scan::global() has created
8730 // a dynamic relocation other than R_ARM_RELATIVE, the addend
8731 // of the relocation is carried in the data, and we must not
8732 // apply the static relocation.
8733
8734 template<bool big_endian>
8735 inline bool
8736 Target_arm<big_endian>::Relocate::should_apply_static_reloc(
8737     const Sized_symbol<32>* gsym,
8738     unsigned int r_type,
8739     bool is_32bit,
8740     Output_section* output_section)
8741 {
8742   // If the output section is not allocated, then we didn't call
8743   // scan_relocs, we didn't create a dynamic reloc, and we must apply
8744   // the reloc here.
8745   if ((output_section->flags() & elfcpp::SHF_ALLOC) == 0)
8746       return true;
8747
8748   int ref_flags = Scan::get_reference_flags(r_type);
8749
8750   // For local symbols, we will have created a non-RELATIVE dynamic
8751   // relocation only if (a) the output is position independent,
8752   // (b) the relocation is absolute (not pc- or segment-relative), and
8753   // (c) the relocation is not 32 bits wide.
8754   if (gsym == NULL)
8755     return !(parameters->options().output_is_position_independent()
8756              && (ref_flags & Symbol::ABSOLUTE_REF)
8757              && !is_32bit);
8758
8759   // For global symbols, we use the same helper routines used in the
8760   // scan pass.  If we did not create a dynamic relocation, or if we
8761   // created a RELATIVE dynamic relocation, we should apply the static
8762   // relocation.
8763   bool has_dyn = gsym->needs_dynamic_reloc(ref_flags);
8764   bool is_rel = (ref_flags & Symbol::ABSOLUTE_REF)
8765                  && gsym->can_use_relative_reloc(ref_flags
8766                                                  & Symbol::FUNCTION_CALL);
8767   return !has_dyn || is_rel;
8768 }
8769
8770 // Perform a relocation.
8771
8772 template<bool big_endian>
8773 inline bool
8774 Target_arm<big_endian>::Relocate::relocate(
8775     const Relocate_info<32, big_endian>* relinfo,
8776     Target_arm* target,
8777     Output_section* output_section,
8778     size_t relnum,
8779     const elfcpp::Rel<32, big_endian>& rel,
8780     unsigned int r_type,
8781     const Sized_symbol<32>* gsym,
8782     const Symbol_value<32>* psymval,
8783     unsigned char* view,
8784     Arm_address address,
8785     section_size_type view_size)
8786 {
8787   typedef Arm_relocate_functions<big_endian> Arm_relocate_functions;
8788
8789   r_type = get_real_reloc_type(r_type);
8790   const Arm_reloc_property* reloc_property =
8791     arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
8792   if (reloc_property == NULL)
8793     {
8794       std::string reloc_name =
8795         arm_reloc_property_table->reloc_name_in_error_message(r_type);
8796       gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
8797                              _("cannot relocate %s in object file"),
8798                              reloc_name.c_str());
8799       return true;
8800     }
8801
8802   const Arm_relobj<big_endian>* object =
8803     Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
8804
8805   // If the final branch target of a relocation is THUMB instruction, this
8806   // is 1.  Otherwise it is 0.
8807   Arm_address thumb_bit = 0;
8808   Symbol_value<32> symval;
8809   bool is_weakly_undefined_without_plt = false;
8810   bool have_got_offset = false;
8811   unsigned int got_offset = 0;
8812
8813   // If the relocation uses the GOT entry of a symbol instead of the symbol
8814   // itself, we don't care about whether the symbol is defined or what kind
8815   // of symbol it is.
8816   if (reloc_property->uses_got_entry())
8817     {
8818       // Get the GOT offset.
8819       // The GOT pointer points to the end of the GOT section.
8820       // We need to subtract the size of the GOT section to get
8821       // the actual offset to use in the relocation.
8822       // TODO: We should move GOT offset computing code in TLS relocations
8823       // to here.
8824       switch (r_type)
8825         {
8826         case elfcpp::R_ARM_GOT_BREL:
8827         case elfcpp::R_ARM_GOT_PREL:
8828           if (gsym != NULL)
8829             {
8830               gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD));
8831               got_offset = (gsym->got_offset(GOT_TYPE_STANDARD)
8832                             - target->got_size());
8833             }
8834           else
8835             {
8836               unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
8837               gold_assert(object->local_has_got_offset(r_sym,
8838                                                        GOT_TYPE_STANDARD));
8839               got_offset = (object->local_got_offset(r_sym, GOT_TYPE_STANDARD)
8840                             - target->got_size());
8841             }
8842           have_got_offset = true;
8843           break;
8844
8845         default:
8846           break;
8847         }
8848     }
8849   else if (relnum != Target_arm<big_endian>::fake_relnum_for_stubs)
8850     {
8851       if (gsym != NULL)
8852         {
8853           // This is a global symbol.  Determine if we use PLT and if the
8854           // final target is THUMB.
8855           if (gsym->use_plt_offset(Scan::get_reference_flags(r_type)))
8856             {
8857               // This uses a PLT, change the symbol value.
8858               symval.set_output_value(target->plt_section()->address()
8859                                       + gsym->plt_offset());
8860               psymval = &symval;
8861             }
8862           else if (gsym->is_weak_undefined())
8863             {
8864               // This is a weakly undefined symbol and we do not use PLT
8865               // for this relocation.  A branch targeting this symbol will
8866               // be converted into an NOP.
8867               is_weakly_undefined_without_plt = true;
8868             }
8869           else if (gsym->is_undefined() && reloc_property->uses_symbol())
8870             {
8871               // This relocation uses the symbol value but the symbol is
8872               // undefined.  Exit early and have the caller reporting an
8873               // error.
8874               return true;
8875             }
8876           else
8877             {
8878               // Set thumb bit if symbol:
8879               // -Has type STT_ARM_TFUNC or
8880               // -Has type STT_FUNC, is defined and with LSB in value set.
8881               thumb_bit =
8882                 (((gsym->type() == elfcpp::STT_ARM_TFUNC)
8883                  || (gsym->type() == elfcpp::STT_FUNC
8884                      && !gsym->is_undefined()
8885                      && ((psymval->value(object, 0) & 1) != 0)))
8886                 ? 1
8887                 : 0);
8888             }
8889         }
8890       else
8891         {
8892           // This is a local symbol.  Determine if the final target is THUMB.
8893           // We saved this information when all the local symbols were read.
8894           elfcpp::Elf_types<32>::Elf_WXword r_info = rel.get_r_info();
8895           unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
8896           thumb_bit = object->local_symbol_is_thumb_function(r_sym) ? 1 : 0;
8897         }
8898     }
8899   else
8900     {
8901       // This is a fake relocation synthesized for a stub.  It does not have
8902       // a real symbol.  We just look at the LSB of the symbol value to
8903       // determine if the target is THUMB or not.
8904       thumb_bit = ((psymval->value(object, 0) & 1) != 0);
8905     }
8906
8907   // Strip LSB if this points to a THUMB target.
8908   if (thumb_bit != 0
8909       && reloc_property->uses_thumb_bit() 
8910       && ((psymval->value(object, 0) & 1) != 0))
8911     {
8912       Arm_address stripped_value =
8913         psymval->value(object, 0) & ~static_cast<Arm_address>(1);
8914       symval.set_output_value(stripped_value);
8915       psymval = &symval;
8916     } 
8917
8918   // To look up relocation stubs, we need to pass the symbol table index of
8919   // a local symbol.
8920   unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
8921
8922   // Get the addressing origin of the output segment defining the
8923   // symbol gsym if needed (AAELF 4.6.1.2 Relocation types).
8924   Arm_address sym_origin = 0;
8925   if (reloc_property->uses_symbol_base())
8926     {
8927       if (r_type == elfcpp::R_ARM_BASE_ABS && gsym == NULL)
8928         // R_ARM_BASE_ABS with the NULL symbol will give the
8929         // absolute address of the GOT origin (GOT_ORG) (see ARM IHI
8930         // 0044C (AAELF): 4.6.1.8 Proxy generating relocations).
8931         sym_origin = target->got_plt_section()->address();
8932       else if (gsym == NULL)
8933         sym_origin = 0;
8934       else if (gsym->source() == Symbol::IN_OUTPUT_SEGMENT)
8935         sym_origin = gsym->output_segment()->vaddr();
8936       else if (gsym->source() == Symbol::IN_OUTPUT_DATA)
8937         sym_origin = gsym->output_data()->address();
8938
8939       // TODO: Assumes the segment base to be zero for the global symbols
8940       // till the proper support for the segment-base-relative addressing
8941       // will be implemented.  This is consistent with GNU ld.
8942     }
8943
8944   // For relative addressing relocation, find out the relative address base.
8945   Arm_address relative_address_base = 0;
8946   switch(reloc_property->relative_address_base())
8947     {
8948     case Arm_reloc_property::RAB_NONE:
8949     // Relocations with relative address bases RAB_TLS and RAB_tp are
8950     // handled by relocate_tls.  So we do not need to do anything here.
8951     case Arm_reloc_property::RAB_TLS:
8952     case Arm_reloc_property::RAB_tp:
8953       break;
8954     case Arm_reloc_property::RAB_B_S:
8955       relative_address_base = sym_origin;
8956       break;
8957     case Arm_reloc_property::RAB_GOT_ORG:
8958       relative_address_base = target->got_plt_section()->address();
8959       break;
8960     case Arm_reloc_property::RAB_P:
8961       relative_address_base = address;
8962       break;
8963     case Arm_reloc_property::RAB_Pa:
8964       relative_address_base = address & 0xfffffffcU;
8965       break;
8966     default:
8967       gold_unreachable(); 
8968     }
8969     
8970   typename Arm_relocate_functions::Status reloc_status =
8971         Arm_relocate_functions::STATUS_OKAY;
8972   bool check_overflow = reloc_property->checks_overflow();
8973   switch (r_type)
8974     {
8975     case elfcpp::R_ARM_NONE:
8976       break;
8977
8978     case elfcpp::R_ARM_ABS8:
8979       if (should_apply_static_reloc(gsym, r_type, false, output_section))
8980         reloc_status = Arm_relocate_functions::abs8(view, object, psymval);
8981       break;
8982
8983     case elfcpp::R_ARM_ABS12:
8984       if (should_apply_static_reloc(gsym, r_type, false, output_section))
8985         reloc_status = Arm_relocate_functions::abs12(view, object, psymval);
8986       break;
8987
8988     case elfcpp::R_ARM_ABS16:
8989       if (should_apply_static_reloc(gsym, r_type, false, output_section))
8990         reloc_status = Arm_relocate_functions::abs16(view, object, psymval);
8991       break;
8992
8993     case elfcpp::R_ARM_ABS32:
8994       if (should_apply_static_reloc(gsym, r_type, true, output_section))
8995         reloc_status = Arm_relocate_functions::abs32(view, object, psymval,
8996                                                      thumb_bit);
8997       break;
8998
8999     case elfcpp::R_ARM_ABS32_NOI:
9000       if (should_apply_static_reloc(gsym, r_type, true, output_section))
9001         // No thumb bit for this relocation: (S + A)
9002         reloc_status = Arm_relocate_functions::abs32(view, object, psymval,
9003                                                      0);
9004       break;
9005
9006     case elfcpp::R_ARM_MOVW_ABS_NC:
9007       if (should_apply_static_reloc(gsym, r_type, false, output_section))
9008         reloc_status = Arm_relocate_functions::movw(view, object, psymval,
9009                                                     0, thumb_bit,
9010                                                     check_overflow);
9011       break;
9012
9013     case elfcpp::R_ARM_MOVT_ABS:
9014       if (should_apply_static_reloc(gsym, r_type, false, output_section))
9015         reloc_status = Arm_relocate_functions::movt(view, object, psymval, 0);
9016       break;
9017
9018     case elfcpp::R_ARM_THM_MOVW_ABS_NC:
9019       if (should_apply_static_reloc(gsym, r_type, false, output_section))
9020         reloc_status = Arm_relocate_functions::thm_movw(view, object, psymval,
9021                                                         0, thumb_bit, false);
9022       break;
9023
9024     case elfcpp::R_ARM_THM_MOVT_ABS:
9025       if (should_apply_static_reloc(gsym, r_type, false, output_section))
9026         reloc_status = Arm_relocate_functions::thm_movt(view, object,
9027                                                         psymval, 0);
9028       break;
9029
9030     case elfcpp::R_ARM_MOVW_PREL_NC:
9031     case elfcpp::R_ARM_MOVW_BREL_NC:
9032     case elfcpp::R_ARM_MOVW_BREL:
9033       reloc_status =
9034         Arm_relocate_functions::movw(view, object, psymval,
9035                                      relative_address_base, thumb_bit,
9036                                      check_overflow);
9037       break;
9038
9039     case elfcpp::R_ARM_MOVT_PREL:
9040     case elfcpp::R_ARM_MOVT_BREL:
9041       reloc_status =
9042         Arm_relocate_functions::movt(view, object, psymval,
9043                                      relative_address_base);
9044       break;
9045
9046     case elfcpp::R_ARM_THM_MOVW_PREL_NC:
9047     case elfcpp::R_ARM_THM_MOVW_BREL_NC:
9048     case elfcpp::R_ARM_THM_MOVW_BREL:
9049       reloc_status =
9050         Arm_relocate_functions::thm_movw(view, object, psymval,
9051                                          relative_address_base,
9052                                          thumb_bit, check_overflow);
9053       break;
9054
9055     case elfcpp::R_ARM_THM_MOVT_PREL:
9056     case elfcpp::R_ARM_THM_MOVT_BREL:
9057       reloc_status =
9058         Arm_relocate_functions::thm_movt(view, object, psymval,
9059                                          relative_address_base);
9060       break;
9061         
9062     case elfcpp::R_ARM_REL32:
9063       reloc_status = Arm_relocate_functions::rel32(view, object, psymval,
9064                                                    address, thumb_bit);
9065       break;
9066
9067     case elfcpp::R_ARM_THM_ABS5:
9068       if (should_apply_static_reloc(gsym, r_type, false, output_section))
9069         reloc_status = Arm_relocate_functions::thm_abs5(view, object, psymval);
9070       break;
9071
9072     // Thumb long branches.
9073     case elfcpp::R_ARM_THM_CALL:
9074     case elfcpp::R_ARM_THM_XPC22:
9075     case elfcpp::R_ARM_THM_JUMP24:
9076       reloc_status =
9077         Arm_relocate_functions::thumb_branch_common(
9078             r_type, relinfo, view, gsym, object, r_sym, psymval, address,
9079             thumb_bit, is_weakly_undefined_without_plt);
9080       break;
9081
9082     case elfcpp::R_ARM_GOTOFF32:
9083       {
9084         Arm_address got_origin;
9085         got_origin = target->got_plt_section()->address();
9086         reloc_status = Arm_relocate_functions::rel32(view, object, psymval,
9087                                                      got_origin, thumb_bit);
9088       }
9089       break;
9090
9091     case elfcpp::R_ARM_BASE_PREL:
9092       gold_assert(gsym != NULL);
9093       reloc_status =
9094           Arm_relocate_functions::base_prel(view, sym_origin, address);
9095       break;
9096
9097     case elfcpp::R_ARM_BASE_ABS:
9098       if (should_apply_static_reloc(gsym, r_type, false, output_section))
9099         reloc_status = Arm_relocate_functions::base_abs(view, sym_origin);
9100       break;
9101
9102     case elfcpp::R_ARM_GOT_BREL:
9103       gold_assert(have_got_offset);
9104       reloc_status = Arm_relocate_functions::got_brel(view, got_offset);
9105       break;
9106
9107     case elfcpp::R_ARM_GOT_PREL:
9108       gold_assert(have_got_offset);
9109       // Get the address origin for GOT PLT, which is allocated right
9110       // after the GOT section, to calculate an absolute address of
9111       // the symbol GOT entry (got_origin + got_offset).
9112       Arm_address got_origin;
9113       got_origin = target->got_plt_section()->address();
9114       reloc_status = Arm_relocate_functions::got_prel(view,
9115                                                       got_origin + got_offset,
9116                                                       address);
9117       break;
9118
9119     case elfcpp::R_ARM_PLT32:
9120     case elfcpp::R_ARM_CALL:
9121     case elfcpp::R_ARM_JUMP24:
9122     case elfcpp::R_ARM_XPC25:
9123       gold_assert(gsym == NULL
9124                   || gsym->has_plt_offset()
9125                   || gsym->final_value_is_known()
9126                   || (gsym->is_defined()
9127                       && !gsym->is_from_dynobj()
9128                       && !gsym->is_preemptible()));
9129       reloc_status =
9130         Arm_relocate_functions::arm_branch_common(
9131             r_type, relinfo, view, gsym, object, r_sym, psymval, address,
9132             thumb_bit, is_weakly_undefined_without_plt);
9133       break;
9134
9135     case elfcpp::R_ARM_THM_JUMP19:
9136       reloc_status =
9137         Arm_relocate_functions::thm_jump19(view, object, psymval, address,
9138                                            thumb_bit);
9139       break;
9140
9141     case elfcpp::R_ARM_THM_JUMP6:
9142       reloc_status =
9143         Arm_relocate_functions::thm_jump6(view, object, psymval, address);
9144       break;
9145
9146     case elfcpp::R_ARM_THM_JUMP8:
9147       reloc_status =
9148         Arm_relocate_functions::thm_jump8(view, object, psymval, address);
9149       break;
9150
9151     case elfcpp::R_ARM_THM_JUMP11:
9152       reloc_status =
9153         Arm_relocate_functions::thm_jump11(view, object, psymval, address);
9154       break;
9155
9156     case elfcpp::R_ARM_PREL31:
9157       reloc_status = Arm_relocate_functions::prel31(view, object, psymval,
9158                                                     address, thumb_bit);
9159       break;
9160
9161     case elfcpp::R_ARM_V4BX:
9162       if (target->fix_v4bx() > General_options::FIX_V4BX_NONE)
9163         {
9164           const bool is_v4bx_interworking =
9165               (target->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING);
9166           reloc_status =
9167             Arm_relocate_functions::v4bx(relinfo, view, object, address,
9168                                          is_v4bx_interworking);
9169         }
9170       break;
9171
9172     case elfcpp::R_ARM_THM_PC8:
9173       reloc_status =
9174         Arm_relocate_functions::thm_pc8(view, object, psymval, address);
9175       break;
9176
9177     case elfcpp::R_ARM_THM_PC12:
9178       reloc_status =
9179         Arm_relocate_functions::thm_pc12(view, object, psymval, address);
9180       break;
9181
9182     case elfcpp::R_ARM_THM_ALU_PREL_11_0:
9183       reloc_status =
9184         Arm_relocate_functions::thm_alu11(view, object, psymval, address,
9185                                           thumb_bit);
9186       break;
9187
9188     case elfcpp::R_ARM_ALU_PC_G0_NC:
9189     case elfcpp::R_ARM_ALU_PC_G0:
9190     case elfcpp::R_ARM_ALU_PC_G1_NC:
9191     case elfcpp::R_ARM_ALU_PC_G1:
9192     case elfcpp::R_ARM_ALU_PC_G2:
9193     case elfcpp::R_ARM_ALU_SB_G0_NC:
9194     case elfcpp::R_ARM_ALU_SB_G0:
9195     case elfcpp::R_ARM_ALU_SB_G1_NC:
9196     case elfcpp::R_ARM_ALU_SB_G1:
9197     case elfcpp::R_ARM_ALU_SB_G2:
9198       reloc_status =
9199         Arm_relocate_functions::arm_grp_alu(view, object, psymval,
9200                                             reloc_property->group_index(),
9201                                             relative_address_base,
9202                                             thumb_bit, check_overflow);
9203       break;
9204
9205     case elfcpp::R_ARM_LDR_PC_G0:
9206     case elfcpp::R_ARM_LDR_PC_G1:
9207     case elfcpp::R_ARM_LDR_PC_G2:
9208     case elfcpp::R_ARM_LDR_SB_G0:
9209     case elfcpp::R_ARM_LDR_SB_G1:
9210     case elfcpp::R_ARM_LDR_SB_G2:
9211       reloc_status =
9212           Arm_relocate_functions::arm_grp_ldr(view, object, psymval,
9213                                               reloc_property->group_index(),
9214                                               relative_address_base);
9215       break;
9216
9217     case elfcpp::R_ARM_LDRS_PC_G0:
9218     case elfcpp::R_ARM_LDRS_PC_G1:
9219     case elfcpp::R_ARM_LDRS_PC_G2:
9220     case elfcpp::R_ARM_LDRS_SB_G0:
9221     case elfcpp::R_ARM_LDRS_SB_G1:
9222     case elfcpp::R_ARM_LDRS_SB_G2:
9223       reloc_status =
9224           Arm_relocate_functions::arm_grp_ldrs(view, object, psymval,
9225                                                reloc_property->group_index(),
9226                                                relative_address_base);
9227       break;
9228
9229     case elfcpp::R_ARM_LDC_PC_G0:
9230     case elfcpp::R_ARM_LDC_PC_G1:
9231     case elfcpp::R_ARM_LDC_PC_G2:
9232     case elfcpp::R_ARM_LDC_SB_G0:
9233     case elfcpp::R_ARM_LDC_SB_G1:
9234     case elfcpp::R_ARM_LDC_SB_G2:
9235       reloc_status =
9236           Arm_relocate_functions::arm_grp_ldc(view, object, psymval,
9237                                               reloc_property->group_index(),
9238                                               relative_address_base);
9239       break;
9240
9241       // These are initial tls relocs, which are expected when
9242       // linking.
9243     case elfcpp::R_ARM_TLS_GD32:        // Global-dynamic
9244     case elfcpp::R_ARM_TLS_LDM32:       // Local-dynamic
9245     case elfcpp::R_ARM_TLS_LDO32:       // Alternate local-dynamic
9246     case elfcpp::R_ARM_TLS_IE32:        // Initial-exec
9247     case elfcpp::R_ARM_TLS_LE32:        // Local-exec
9248       reloc_status =
9249         this->relocate_tls(relinfo, target, relnum, rel, r_type, gsym, psymval,
9250                            view, address, view_size);
9251       break;
9252
9253     // The known and unknown unsupported and/or deprecated relocations.
9254     case elfcpp::R_ARM_PC24:
9255     case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
9256     case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
9257     case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
9258     default:
9259       // Just silently leave the method. We should get an appropriate error
9260       // message in the scan methods.
9261       break;
9262     }
9263
9264   // Report any errors.
9265   switch (reloc_status)
9266     {
9267     case Arm_relocate_functions::STATUS_OKAY:
9268       break;
9269     case Arm_relocate_functions::STATUS_OVERFLOW:
9270       gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
9271                              _("relocation overflow in %s"),
9272                              reloc_property->name().c_str());
9273       break;
9274     case Arm_relocate_functions::STATUS_BAD_RELOC:
9275       gold_error_at_location(
9276         relinfo,
9277         relnum,
9278         rel.get_r_offset(),
9279         _("unexpected opcode while processing relocation %s"),
9280         reloc_property->name().c_str());
9281       break;
9282     default:
9283       gold_unreachable();
9284     }
9285
9286   return true;
9287 }
9288
9289 // Perform a TLS relocation.
9290
9291 template<bool big_endian>
9292 inline typename Arm_relocate_functions<big_endian>::Status
9293 Target_arm<big_endian>::Relocate::relocate_tls(
9294     const Relocate_info<32, big_endian>* relinfo,
9295     Target_arm<big_endian>* target,
9296     size_t relnum,
9297     const elfcpp::Rel<32, big_endian>& rel,
9298     unsigned int r_type,
9299     const Sized_symbol<32>* gsym,
9300     const Symbol_value<32>* psymval,
9301     unsigned char* view,
9302     elfcpp::Elf_types<32>::Elf_Addr address,
9303     section_size_type /*view_size*/ )
9304 {
9305   typedef Arm_relocate_functions<big_endian> ArmRelocFuncs;
9306   typedef Relocate_functions<32, big_endian> RelocFuncs;
9307   Output_segment* tls_segment = relinfo->layout->tls_segment();
9308
9309   const Sized_relobj_file<32, big_endian>* object = relinfo->object;
9310
9311   elfcpp::Elf_types<32>::Elf_Addr value = psymval->value(object, 0);
9312
9313   const bool is_final = (gsym == NULL
9314                          ? !parameters->options().shared()
9315                          : gsym->final_value_is_known());
9316   const tls::Tls_optimization optimized_type
9317       = Target_arm<big_endian>::optimize_tls_reloc(is_final, r_type);
9318   switch (r_type)
9319     {
9320     case elfcpp::R_ARM_TLS_GD32:        // Global-dynamic
9321         {
9322           unsigned int got_type = GOT_TYPE_TLS_PAIR;
9323           unsigned int got_offset;
9324           if (gsym != NULL)
9325             {
9326               gold_assert(gsym->has_got_offset(got_type));
9327               got_offset = gsym->got_offset(got_type) - target->got_size();
9328             }
9329           else
9330             {
9331               unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
9332               gold_assert(object->local_has_got_offset(r_sym, got_type));
9333               got_offset = (object->local_got_offset(r_sym, got_type)
9334                             - target->got_size());
9335             }
9336           if (optimized_type == tls::TLSOPT_NONE)
9337             {
9338               Arm_address got_entry =
9339                 target->got_plt_section()->address() + got_offset;
9340               
9341               // Relocate the field with the PC relative offset of the pair of
9342               // GOT entries.
9343               RelocFuncs::pcrel32(view, got_entry, address);
9344               return ArmRelocFuncs::STATUS_OKAY;
9345             }
9346         }
9347       break;
9348
9349     case elfcpp::R_ARM_TLS_LDM32:       // Local-dynamic
9350       if (optimized_type == tls::TLSOPT_NONE)
9351         {
9352           // Relocate the field with the offset of the GOT entry for
9353           // the module index.
9354           unsigned int got_offset;
9355           got_offset = (target->got_mod_index_entry(NULL, NULL, NULL)
9356                         - target->got_size());
9357           Arm_address got_entry =
9358             target->got_plt_section()->address() + got_offset;
9359
9360           // Relocate the field with the PC relative offset of the pair of
9361           // GOT entries.
9362           RelocFuncs::pcrel32(view, got_entry, address);
9363           return ArmRelocFuncs::STATUS_OKAY;
9364         }
9365       break;
9366
9367     case elfcpp::R_ARM_TLS_LDO32:       // Alternate local-dynamic
9368       RelocFuncs::rel32(view, value);
9369       return ArmRelocFuncs::STATUS_OKAY;
9370
9371     case elfcpp::R_ARM_TLS_IE32:        // Initial-exec
9372       if (optimized_type == tls::TLSOPT_NONE)
9373         {
9374           // Relocate the field with the offset of the GOT entry for
9375           // the tp-relative offset of the symbol.
9376           unsigned int got_type = GOT_TYPE_TLS_OFFSET;
9377           unsigned int got_offset;
9378           if (gsym != NULL)
9379             {
9380               gold_assert(gsym->has_got_offset(got_type));
9381               got_offset = gsym->got_offset(got_type);
9382             }
9383           else
9384             {
9385               unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
9386               gold_assert(object->local_has_got_offset(r_sym, got_type));
9387               got_offset = object->local_got_offset(r_sym, got_type);
9388             }
9389
9390           // All GOT offsets are relative to the end of the GOT.
9391           got_offset -= target->got_size();
9392
9393           Arm_address got_entry =
9394             target->got_plt_section()->address() + got_offset;
9395
9396           // Relocate the field with the PC relative offset of the GOT entry.
9397           RelocFuncs::pcrel32(view, got_entry, address);
9398           return ArmRelocFuncs::STATUS_OKAY;
9399         }
9400       break;
9401
9402     case elfcpp::R_ARM_TLS_LE32:        // Local-exec
9403       // If we're creating a shared library, a dynamic relocation will
9404       // have been created for this location, so do not apply it now.
9405       if (!parameters->options().shared())
9406         {
9407           gold_assert(tls_segment != NULL);
9408
9409           // $tp points to the TCB, which is followed by the TLS, so we
9410           // need to add TCB size to the offset.
9411           Arm_address aligned_tcb_size =
9412             align_address(ARM_TCB_SIZE, tls_segment->maximum_alignment());
9413           RelocFuncs::rel32(view, value + aligned_tcb_size);
9414
9415         }
9416       return ArmRelocFuncs::STATUS_OKAY;
9417     
9418     default:
9419       gold_unreachable();
9420     }
9421
9422   gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
9423                          _("unsupported reloc %u"),
9424                          r_type);
9425   return ArmRelocFuncs::STATUS_BAD_RELOC;
9426 }
9427
9428 // Relocate section data.
9429
9430 template<bool big_endian>
9431 void
9432 Target_arm<big_endian>::relocate_section(
9433     const Relocate_info<32, big_endian>* relinfo,
9434     unsigned int sh_type,
9435     const unsigned char* prelocs,
9436     size_t reloc_count,
9437     Output_section* output_section,
9438     bool needs_special_offset_handling,
9439     unsigned char* view,
9440     Arm_address address,
9441     section_size_type view_size,
9442     const Reloc_symbol_changes* reloc_symbol_changes)
9443 {
9444   typedef typename Target_arm<big_endian>::Relocate Arm_relocate;
9445   gold_assert(sh_type == elfcpp::SHT_REL);
9446
9447   // See if we are relocating a relaxed input section.  If so, the view
9448   // covers the whole output section and we need to adjust accordingly.
9449   if (needs_special_offset_handling)
9450     {
9451       const Output_relaxed_input_section* poris =
9452         output_section->find_relaxed_input_section(relinfo->object,
9453                                                    relinfo->data_shndx);
9454       if (poris != NULL)
9455         {
9456           Arm_address section_address = poris->address();
9457           section_size_type section_size = poris->data_size();
9458
9459           gold_assert((section_address >= address)
9460                       && ((section_address + section_size)
9461                           <= (address + view_size)));
9462
9463           off_t offset = section_address - address;
9464           view += offset;
9465           address += offset;
9466           view_size = section_size;
9467         }
9468     }
9469
9470   gold::relocate_section<32, big_endian, Target_arm, elfcpp::SHT_REL,
9471                          Arm_relocate>(
9472     relinfo,
9473     this,
9474     prelocs,
9475     reloc_count,
9476     output_section,
9477     needs_special_offset_handling,
9478     view,
9479     address,
9480     view_size,
9481     reloc_symbol_changes);
9482 }
9483
9484 // Return the size of a relocation while scanning during a relocatable
9485 // link.
9486
9487 template<bool big_endian>
9488 unsigned int
9489 Target_arm<big_endian>::Relocatable_size_for_reloc::get_size_for_reloc(
9490     unsigned int r_type,
9491     Relobj* object)
9492 {
9493   r_type = get_real_reloc_type(r_type);
9494   const Arm_reloc_property* arp =
9495       arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
9496   if (arp != NULL)
9497     return arp->size();
9498   else
9499     {
9500       std::string reloc_name =
9501         arm_reloc_property_table->reloc_name_in_error_message(r_type);
9502       gold_error(_("%s: unexpected %s in object file"),
9503                  object->name().c_str(), reloc_name.c_str());
9504       return 0;
9505     }
9506 }
9507
9508 // Scan the relocs during a relocatable link.
9509
9510 template<bool big_endian>
9511 void
9512 Target_arm<big_endian>::scan_relocatable_relocs(
9513     Symbol_table* symtab,
9514     Layout* layout,
9515     Sized_relobj_file<32, big_endian>* object,
9516     unsigned int data_shndx,
9517     unsigned int sh_type,
9518     const unsigned char* prelocs,
9519     size_t reloc_count,
9520     Output_section* output_section,
9521     bool needs_special_offset_handling,
9522     size_t local_symbol_count,
9523     const unsigned char* plocal_symbols,
9524     Relocatable_relocs* rr)
9525 {
9526   gold_assert(sh_type == elfcpp::SHT_REL);
9527
9528   typedef Arm_scan_relocatable_relocs<big_endian, elfcpp::SHT_REL,
9529     Relocatable_size_for_reloc> Scan_relocatable_relocs;
9530
9531   gold::scan_relocatable_relocs<32, big_endian, elfcpp::SHT_REL,
9532       Scan_relocatable_relocs>(
9533     symtab,
9534     layout,
9535     object,
9536     data_shndx,
9537     prelocs,
9538     reloc_count,
9539     output_section,
9540     needs_special_offset_handling,
9541     local_symbol_count,
9542     plocal_symbols,
9543     rr);
9544 }
9545
9546 // Relocate a section during a relocatable link.
9547
9548 template<bool big_endian>
9549 void
9550 Target_arm<big_endian>::relocate_for_relocatable(
9551     const Relocate_info<32, big_endian>* relinfo,
9552     unsigned int sh_type,
9553     const unsigned char* prelocs,
9554     size_t reloc_count,
9555     Output_section* output_section,
9556     off_t offset_in_output_section,
9557     const Relocatable_relocs* rr,
9558     unsigned char* view,
9559     Arm_address view_address,
9560     section_size_type view_size,
9561     unsigned char* reloc_view,
9562     section_size_type reloc_view_size)
9563 {
9564   gold_assert(sh_type == elfcpp::SHT_REL);
9565
9566   gold::relocate_for_relocatable<32, big_endian, elfcpp::SHT_REL>(
9567     relinfo,
9568     prelocs,
9569     reloc_count,
9570     output_section,
9571     offset_in_output_section,
9572     rr,
9573     view,
9574     view_address,
9575     view_size,
9576     reloc_view,
9577     reloc_view_size);
9578 }
9579
9580 // Perform target-specific processing in a relocatable link.  This is
9581 // only used if we use the relocation strategy RELOC_SPECIAL.
9582
9583 template<bool big_endian>
9584 void
9585 Target_arm<big_endian>::relocate_special_relocatable(
9586     const Relocate_info<32, big_endian>* relinfo,
9587     unsigned int sh_type,
9588     const unsigned char* preloc_in,
9589     size_t relnum,
9590     Output_section* output_section,
9591     off_t offset_in_output_section,
9592     unsigned char* view,
9593     elfcpp::Elf_types<32>::Elf_Addr view_address,
9594     section_size_type,
9595     unsigned char* preloc_out)
9596 {
9597   // We can only handle REL type relocation sections.
9598   gold_assert(sh_type == elfcpp::SHT_REL);
9599
9600   typedef typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc Reltype;
9601   typedef typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc_write
9602     Reltype_write;
9603   const Arm_address invalid_address = static_cast<Arm_address>(0) - 1;
9604
9605   const Arm_relobj<big_endian>* object =
9606     Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
9607   const unsigned int local_count = object->local_symbol_count();
9608
9609   Reltype reloc(preloc_in);
9610   Reltype_write reloc_write(preloc_out);
9611
9612   elfcpp::Elf_types<32>::Elf_WXword r_info = reloc.get_r_info();
9613   const unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
9614   const unsigned int r_type = elfcpp::elf_r_type<32>(r_info);
9615
9616   const Arm_reloc_property* arp =
9617     arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
9618   gold_assert(arp != NULL);
9619
9620   // Get the new symbol index.
9621   // We only use RELOC_SPECIAL strategy in local relocations.
9622   gold_assert(r_sym < local_count);
9623
9624   // We are adjusting a section symbol.  We need to find
9625   // the symbol table index of the section symbol for
9626   // the output section corresponding to input section
9627   // in which this symbol is defined.
9628   bool is_ordinary;
9629   unsigned int shndx = object->local_symbol_input_shndx(r_sym, &is_ordinary);
9630   gold_assert(is_ordinary);
9631   Output_section* os = object->output_section(shndx);
9632   gold_assert(os != NULL);
9633   gold_assert(os->needs_symtab_index());
9634   unsigned int new_symndx = os->symtab_index();
9635
9636   // Get the new offset--the location in the output section where
9637   // this relocation should be applied.
9638
9639   Arm_address offset = reloc.get_r_offset();
9640   Arm_address new_offset;
9641   if (offset_in_output_section != invalid_address)
9642     new_offset = offset + offset_in_output_section;
9643   else
9644     {
9645       section_offset_type sot_offset =
9646           convert_types<section_offset_type, Arm_address>(offset);
9647       section_offset_type new_sot_offset =
9648           output_section->output_offset(object, relinfo->data_shndx,
9649                                         sot_offset);
9650       gold_assert(new_sot_offset != -1);
9651       new_offset = new_sot_offset;
9652     }
9653
9654   // In an object file, r_offset is an offset within the section.
9655   // In an executable or dynamic object, generated by
9656   // --emit-relocs, r_offset is an absolute address.
9657   if (!parameters->options().relocatable())
9658     {
9659       new_offset += view_address;
9660       if (offset_in_output_section != invalid_address)
9661         new_offset -= offset_in_output_section;
9662     }
9663
9664   reloc_write.put_r_offset(new_offset);
9665   reloc_write.put_r_info(elfcpp::elf_r_info<32>(new_symndx, r_type));
9666
9667   // Handle the reloc addend.
9668   // The relocation uses a section symbol in the input file.
9669   // We are adjusting it to use a section symbol in the output
9670   // file.  The input section symbol refers to some address in
9671   // the input section.  We need the relocation in the output
9672   // file to refer to that same address.  This adjustment to
9673   // the addend is the same calculation we use for a simple
9674   // absolute relocation for the input section symbol.
9675
9676   const Symbol_value<32>* psymval = object->local_symbol(r_sym);
9677
9678   // Handle THUMB bit.
9679   Symbol_value<32> symval;
9680   Arm_address thumb_bit =
9681      object->local_symbol_is_thumb_function(r_sym) ? 1 : 0;
9682   if (thumb_bit != 0
9683       && arp->uses_thumb_bit() 
9684       && ((psymval->value(object, 0) & 1) != 0))
9685     {
9686       Arm_address stripped_value =
9687         psymval->value(object, 0) & ~static_cast<Arm_address>(1);
9688       symval.set_output_value(stripped_value);
9689       psymval = &symval;
9690     } 
9691
9692   unsigned char* paddend = view + offset;
9693   typename Arm_relocate_functions<big_endian>::Status reloc_status =
9694         Arm_relocate_functions<big_endian>::STATUS_OKAY;
9695   switch (r_type)
9696     {
9697     case elfcpp::R_ARM_ABS8:
9698       reloc_status = Arm_relocate_functions<big_endian>::abs8(paddend, object,
9699                                                               psymval);
9700       break;
9701
9702     case elfcpp::R_ARM_ABS12:
9703       reloc_status = Arm_relocate_functions<big_endian>::abs12(paddend, object,
9704                                                                psymval);
9705       break;
9706
9707     case elfcpp::R_ARM_ABS16:
9708       reloc_status = Arm_relocate_functions<big_endian>::abs16(paddend, object,
9709                                                                psymval);
9710       break;
9711
9712     case elfcpp::R_ARM_THM_ABS5:
9713       reloc_status = Arm_relocate_functions<big_endian>::thm_abs5(paddend,
9714                                                                   object,
9715                                                                   psymval);
9716       break;
9717
9718     case elfcpp::R_ARM_MOVW_ABS_NC:
9719     case elfcpp::R_ARM_MOVW_PREL_NC:
9720     case elfcpp::R_ARM_MOVW_BREL_NC:
9721     case elfcpp::R_ARM_MOVW_BREL:
9722       reloc_status = Arm_relocate_functions<big_endian>::movw(
9723           paddend, object, psymval, 0, thumb_bit, arp->checks_overflow());
9724       break;
9725
9726     case elfcpp::R_ARM_THM_MOVW_ABS_NC:
9727     case elfcpp::R_ARM_THM_MOVW_PREL_NC:
9728     case elfcpp::R_ARM_THM_MOVW_BREL_NC:
9729     case elfcpp::R_ARM_THM_MOVW_BREL:
9730       reloc_status = Arm_relocate_functions<big_endian>::thm_movw(
9731           paddend, object, psymval, 0, thumb_bit, arp->checks_overflow());
9732       break;
9733
9734     case elfcpp::R_ARM_THM_CALL:
9735     case elfcpp::R_ARM_THM_XPC22:
9736     case elfcpp::R_ARM_THM_JUMP24:
9737       reloc_status =
9738         Arm_relocate_functions<big_endian>::thumb_branch_common(
9739             r_type, relinfo, paddend, NULL, object, 0, psymval, 0, thumb_bit,
9740             false);
9741       break;
9742
9743     case elfcpp::R_ARM_PLT32:
9744     case elfcpp::R_ARM_CALL:
9745     case elfcpp::R_ARM_JUMP24:
9746     case elfcpp::R_ARM_XPC25:
9747       reloc_status =
9748         Arm_relocate_functions<big_endian>::arm_branch_common(
9749             r_type, relinfo, paddend, NULL, object, 0, psymval, 0, thumb_bit,
9750             false);
9751       break;
9752
9753     case elfcpp::R_ARM_THM_JUMP19:
9754       reloc_status =
9755         Arm_relocate_functions<big_endian>::thm_jump19(paddend, object,
9756                                                        psymval, 0, thumb_bit);
9757       break;
9758
9759     case elfcpp::R_ARM_THM_JUMP6:
9760       reloc_status =
9761         Arm_relocate_functions<big_endian>::thm_jump6(paddend, object, psymval,
9762                                                       0);
9763       break;
9764
9765     case elfcpp::R_ARM_THM_JUMP8:
9766       reloc_status =
9767         Arm_relocate_functions<big_endian>::thm_jump8(paddend, object, psymval,
9768                                                       0);
9769       break;
9770
9771     case elfcpp::R_ARM_THM_JUMP11:
9772       reloc_status =
9773         Arm_relocate_functions<big_endian>::thm_jump11(paddend, object, psymval,
9774                                                        0);
9775       break;
9776
9777     case elfcpp::R_ARM_PREL31:
9778       reloc_status =
9779         Arm_relocate_functions<big_endian>::prel31(paddend, object, psymval, 0,
9780                                                    thumb_bit);
9781       break;
9782
9783     case elfcpp::R_ARM_THM_PC8:
9784       reloc_status =
9785         Arm_relocate_functions<big_endian>::thm_pc8(paddend, object, psymval,
9786                                                     0);
9787       break;
9788
9789     case elfcpp::R_ARM_THM_PC12:
9790       reloc_status =
9791         Arm_relocate_functions<big_endian>::thm_pc12(paddend, object, psymval,
9792                                                      0);
9793       break;
9794
9795     case elfcpp::R_ARM_THM_ALU_PREL_11_0:
9796       reloc_status =
9797         Arm_relocate_functions<big_endian>::thm_alu11(paddend, object, psymval,
9798                                                       0, thumb_bit);
9799       break;
9800
9801     // These relocation truncate relocation results so we cannot handle them
9802     // in a relocatable link.
9803     case elfcpp::R_ARM_MOVT_ABS:
9804     case elfcpp::R_ARM_THM_MOVT_ABS:
9805     case elfcpp::R_ARM_MOVT_PREL:
9806     case elfcpp::R_ARM_MOVT_BREL:
9807     case elfcpp::R_ARM_THM_MOVT_PREL:
9808     case elfcpp::R_ARM_THM_MOVT_BREL:
9809     case elfcpp::R_ARM_ALU_PC_G0_NC:
9810     case elfcpp::R_ARM_ALU_PC_G0:
9811     case elfcpp::R_ARM_ALU_PC_G1_NC:
9812     case elfcpp::R_ARM_ALU_PC_G1:
9813     case elfcpp::R_ARM_ALU_PC_G2:
9814     case elfcpp::R_ARM_ALU_SB_G0_NC:
9815     case elfcpp::R_ARM_ALU_SB_G0:
9816     case elfcpp::R_ARM_ALU_SB_G1_NC:
9817     case elfcpp::R_ARM_ALU_SB_G1:
9818     case elfcpp::R_ARM_ALU_SB_G2:
9819     case elfcpp::R_ARM_LDR_PC_G0:
9820     case elfcpp::R_ARM_LDR_PC_G1:
9821     case elfcpp::R_ARM_LDR_PC_G2:
9822     case elfcpp::R_ARM_LDR_SB_G0:
9823     case elfcpp::R_ARM_LDR_SB_G1:
9824     case elfcpp::R_ARM_LDR_SB_G2:
9825     case elfcpp::R_ARM_LDRS_PC_G0:
9826     case elfcpp::R_ARM_LDRS_PC_G1:
9827     case elfcpp::R_ARM_LDRS_PC_G2:
9828     case elfcpp::R_ARM_LDRS_SB_G0:
9829     case elfcpp::R_ARM_LDRS_SB_G1:
9830     case elfcpp::R_ARM_LDRS_SB_G2:
9831     case elfcpp::R_ARM_LDC_PC_G0:
9832     case elfcpp::R_ARM_LDC_PC_G1:
9833     case elfcpp::R_ARM_LDC_PC_G2:
9834     case elfcpp::R_ARM_LDC_SB_G0:
9835     case elfcpp::R_ARM_LDC_SB_G1:
9836     case elfcpp::R_ARM_LDC_SB_G2:
9837       gold_error(_("cannot handle %s in a relocatable link"),
9838                  arp->name().c_str());
9839       break;
9840
9841     default:
9842       gold_unreachable();
9843     }
9844
9845   // Report any errors.
9846   switch (reloc_status)
9847     {
9848     case Arm_relocate_functions<big_endian>::STATUS_OKAY:
9849       break;
9850     case Arm_relocate_functions<big_endian>::STATUS_OVERFLOW:
9851       gold_error_at_location(relinfo, relnum, reloc.get_r_offset(),
9852                              _("relocation overflow in %s"),
9853                              arp->name().c_str());
9854       break;
9855     case Arm_relocate_functions<big_endian>::STATUS_BAD_RELOC:
9856       gold_error_at_location(relinfo, relnum, reloc.get_r_offset(),
9857         _("unexpected opcode while processing relocation %s"),
9858         arp->name().c_str());
9859       break;
9860     default:
9861       gold_unreachable();
9862     }
9863 }
9864
9865 // Return the value to use for a dynamic symbol which requires special
9866 // treatment.  This is how we support equality comparisons of function
9867 // pointers across shared library boundaries, as described in the
9868 // processor specific ABI supplement.
9869
9870 template<bool big_endian>
9871 uint64_t
9872 Target_arm<big_endian>::do_dynsym_value(const Symbol* gsym) const
9873 {
9874   gold_assert(gsym->is_from_dynobj() && gsym->has_plt_offset());
9875   return this->plt_section()->address() + gsym->plt_offset();
9876 }
9877
9878 // Map platform-specific relocs to real relocs
9879 //
9880 template<bool big_endian>
9881 unsigned int
9882 Target_arm<big_endian>::get_real_reloc_type(unsigned int r_type)
9883 {
9884   switch (r_type)
9885     {
9886     case elfcpp::R_ARM_TARGET1:
9887       // This is either R_ARM_ABS32 or R_ARM_REL32;
9888       return elfcpp::R_ARM_ABS32;
9889
9890     case elfcpp::R_ARM_TARGET2:
9891       // This can be any reloc type but usually is R_ARM_GOT_PREL
9892       return elfcpp::R_ARM_GOT_PREL;
9893
9894     default:
9895       return r_type;
9896     }
9897 }
9898
9899 // Whether if two EABI versions V1 and V2 are compatible.
9900
9901 template<bool big_endian>
9902 bool
9903 Target_arm<big_endian>::are_eabi_versions_compatible(
9904     elfcpp::Elf_Word v1,
9905     elfcpp::Elf_Word v2)
9906 {
9907   // v4 and v5 are the same spec before and after it was released,
9908   // so allow mixing them.
9909   if ((v1 == elfcpp::EF_ARM_EABI_UNKNOWN || v2 == elfcpp::EF_ARM_EABI_UNKNOWN)
9910       || (v1 == elfcpp::EF_ARM_EABI_VER4 && v2 == elfcpp::EF_ARM_EABI_VER5)
9911       || (v1 == elfcpp::EF_ARM_EABI_VER5 && v2 == elfcpp::EF_ARM_EABI_VER4))
9912     return true;
9913
9914   return v1 == v2;
9915 }
9916
9917 // Combine FLAGS from an input object called NAME and the processor-specific
9918 // flags in the ELF header of the output.  Much of this is adapted from the
9919 // processor-specific flags merging code in elf32_arm_merge_private_bfd_data
9920 // in bfd/elf32-arm.c.
9921
9922 template<bool big_endian>
9923 void
9924 Target_arm<big_endian>::merge_processor_specific_flags(
9925     const std::string& name,
9926     elfcpp::Elf_Word flags)
9927 {
9928   if (this->are_processor_specific_flags_set())
9929     {
9930       elfcpp::Elf_Word out_flags = this->processor_specific_flags();
9931
9932       // Nothing to merge if flags equal to those in output.
9933       if (flags == out_flags)
9934         return;
9935
9936       // Complain about various flag mismatches.
9937       elfcpp::Elf_Word version1 = elfcpp::arm_eabi_version(flags);
9938       elfcpp::Elf_Word version2 = elfcpp::arm_eabi_version(out_flags);
9939       if (!this->are_eabi_versions_compatible(version1, version2)
9940           && parameters->options().warn_mismatch())
9941         gold_error(_("Source object %s has EABI version %d but output has "
9942                      "EABI version %d."),
9943                    name.c_str(),
9944                    (flags & elfcpp::EF_ARM_EABIMASK) >> 24,
9945                    (out_flags & elfcpp::EF_ARM_EABIMASK) >> 24);
9946     }
9947   else
9948     {
9949       // If the input is the default architecture and had the default
9950       // flags then do not bother setting the flags for the output
9951       // architecture, instead allow future merges to do this.  If no
9952       // future merges ever set these flags then they will retain their
9953       // uninitialised values, which surprise surprise, correspond
9954       // to the default values.
9955       if (flags == 0)
9956         return;
9957
9958       // This is the first time, just copy the flags.
9959       // We only copy the EABI version for now.
9960       this->set_processor_specific_flags(flags & elfcpp::EF_ARM_EABIMASK);
9961     }
9962 }
9963
9964 // Adjust ELF file header.
9965 template<bool big_endian>
9966 void
9967 Target_arm<big_endian>::do_adjust_elf_header(
9968     unsigned char* view,
9969     int len) const
9970 {
9971   gold_assert(len == elfcpp::Elf_sizes<32>::ehdr_size);
9972
9973   elfcpp::Ehdr<32, big_endian> ehdr(view);
9974   unsigned char e_ident[elfcpp::EI_NIDENT];
9975   memcpy(e_ident, ehdr.get_e_ident(), elfcpp::EI_NIDENT);
9976
9977   if (elfcpp::arm_eabi_version(this->processor_specific_flags())
9978       == elfcpp::EF_ARM_EABI_UNKNOWN)
9979     e_ident[elfcpp::EI_OSABI] = elfcpp::ELFOSABI_ARM;
9980   else
9981     e_ident[elfcpp::EI_OSABI] = 0;
9982   e_ident[elfcpp::EI_ABIVERSION] = 0;
9983
9984   // FIXME: Do EF_ARM_BE8 adjustment.
9985
9986   elfcpp::Ehdr_write<32, big_endian> oehdr(view);
9987   oehdr.put_e_ident(e_ident);
9988 }
9989
9990 // do_make_elf_object to override the same function in the base class.
9991 // We need to use a target-specific sub-class of
9992 // Sized_relobj_file<32, big_endian> to store ARM specific information.
9993 // Hence we need to have our own ELF object creation.
9994
9995 template<bool big_endian>
9996 Object*
9997 Target_arm<big_endian>::do_make_elf_object(
9998     const std::string& name,
9999     Input_file* input_file,
10000     off_t offset, const elfcpp::Ehdr<32, big_endian>& ehdr)
10001 {
10002   int et = ehdr.get_e_type();
10003   if (et == elfcpp::ET_REL)
10004     {
10005       Arm_relobj<big_endian>* obj =
10006         new Arm_relobj<big_endian>(name, input_file, offset, ehdr);
10007       obj->setup();
10008       return obj;
10009     }
10010   else if (et == elfcpp::ET_DYN)
10011     {
10012       Sized_dynobj<32, big_endian>* obj =
10013         new Arm_dynobj<big_endian>(name, input_file, offset, ehdr);
10014       obj->setup();
10015       return obj;
10016     }
10017   else
10018     {
10019       gold_error(_("%s: unsupported ELF file type %d"),
10020                  name.c_str(), et);
10021       return NULL;
10022     }
10023 }
10024
10025 // Read the architecture from the Tag_also_compatible_with attribute, if any.
10026 // Returns -1 if no architecture could be read.
10027 // This is adapted from get_secondary_compatible_arch() in bfd/elf32-arm.c.
10028
10029 template<bool big_endian>
10030 int
10031 Target_arm<big_endian>::get_secondary_compatible_arch(
10032     const Attributes_section_data* pasd)
10033 {
10034   const Object_attribute* known_attributes =
10035     pasd->known_attributes(Object_attribute::OBJ_ATTR_PROC);
10036
10037   // Note: the tag and its argument below are uleb128 values, though
10038   // currently-defined values fit in one byte for each.
10039   const std::string& sv =
10040     known_attributes[elfcpp::Tag_also_compatible_with].string_value();
10041   if (sv.size() == 2
10042       && sv.data()[0] == elfcpp::Tag_CPU_arch
10043       && (sv.data()[1] & 128) != 128)
10044    return sv.data()[1];
10045
10046   // This tag is "safely ignorable", so don't complain if it looks funny.
10047   return -1;
10048 }
10049
10050 // Set, or unset, the architecture of the Tag_also_compatible_with attribute.
10051 // The tag is removed if ARCH is -1.
10052 // This is adapted from set_secondary_compatible_arch() in bfd/elf32-arm.c.
10053
10054 template<bool big_endian>
10055 void
10056 Target_arm<big_endian>::set_secondary_compatible_arch(
10057     Attributes_section_data* pasd,
10058     int arch)
10059 {
10060   Object_attribute* known_attributes =
10061     pasd->known_attributes(Object_attribute::OBJ_ATTR_PROC);
10062
10063   if (arch == -1)
10064     {
10065       known_attributes[elfcpp::Tag_also_compatible_with].set_string_value("");
10066       return;
10067     }
10068
10069   // Note: the tag and its argument below are uleb128 values, though
10070   // currently-defined values fit in one byte for each.
10071   char sv[3];
10072   sv[0] = elfcpp::Tag_CPU_arch;
10073   gold_assert(arch != 0);
10074   sv[1] = arch;
10075   sv[2] = '\0';
10076
10077   known_attributes[elfcpp::Tag_also_compatible_with].set_string_value(sv);
10078 }
10079
10080 // Combine two values for Tag_CPU_arch, taking secondary compatibility tags
10081 // into account.
10082 // This is adapted from tag_cpu_arch_combine() in bfd/elf32-arm.c.
10083
10084 template<bool big_endian>
10085 int
10086 Target_arm<big_endian>::tag_cpu_arch_combine(
10087     const char* name,
10088     int oldtag,
10089     int* secondary_compat_out,
10090     int newtag,
10091     int secondary_compat)
10092 {
10093 #define T(X) elfcpp::TAG_CPU_ARCH_##X
10094   static const int v6t2[] =
10095     {
10096       T(V6T2),   // PRE_V4.
10097       T(V6T2),   // V4.
10098       T(V6T2),   // V4T.
10099       T(V6T2),   // V5T.
10100       T(V6T2),   // V5TE.
10101       T(V6T2),   // V5TEJ.
10102       T(V6T2),   // V6.
10103       T(V7),     // V6KZ.
10104       T(V6T2)    // V6T2.
10105     };
10106   static const int v6k[] =
10107     {
10108       T(V6K),    // PRE_V4.
10109       T(V6K),    // V4.
10110       T(V6K),    // V4T.
10111       T(V6K),    // V5T.
10112       T(V6K),    // V5TE.
10113       T(V6K),    // V5TEJ.
10114       T(V6K),    // V6.
10115       T(V6KZ),   // V6KZ.
10116       T(V7),     // V6T2.
10117       T(V6K)     // V6K.
10118     };
10119   static const int v7[] =
10120     {
10121       T(V7),     // PRE_V4.
10122       T(V7),     // V4.
10123       T(V7),     // V4T.
10124       T(V7),     // V5T.
10125       T(V7),     // V5TE.
10126       T(V7),     // V5TEJ.
10127       T(V7),     // V6.
10128       T(V7),     // V6KZ.
10129       T(V7),     // V6T2.
10130       T(V7),     // V6K.
10131       T(V7)      // V7.
10132     };
10133   static const int v6_m[] =
10134     {
10135       -1,        // PRE_V4.
10136       -1,        // V4.
10137       T(V6K),    // V4T.
10138       T(V6K),    // V5T.
10139       T(V6K),    // V5TE.
10140       T(V6K),    // V5TEJ.
10141       T(V6K),    // V6.
10142       T(V6KZ),   // V6KZ.
10143       T(V7),     // V6T2.
10144       T(V6K),    // V6K.
10145       T(V7),     // V7.
10146       T(V6_M)    // V6_M.
10147     };
10148   static const int v6s_m[] =
10149     {
10150       -1,        // PRE_V4.
10151       -1,        // V4.
10152       T(V6K),    // V4T.
10153       T(V6K),    // V5T.
10154       T(V6K),    // V5TE.
10155       T(V6K),    // V5TEJ.
10156       T(V6K),    // V6.
10157       T(V6KZ),   // V6KZ.
10158       T(V7),     // V6T2.
10159       T(V6K),    // V6K.
10160       T(V7),     // V7.
10161       T(V6S_M),  // V6_M.
10162       T(V6S_M)   // V6S_M.
10163     };
10164   static const int v7e_m[] =
10165     {
10166       -1,       // PRE_V4.
10167       -1,       // V4.
10168       T(V7E_M), // V4T.
10169       T(V7E_M), // V5T.
10170       T(V7E_M), // V5TE.
10171       T(V7E_M), // V5TEJ.
10172       T(V7E_M), // V6.
10173       T(V7E_M), // V6KZ.
10174       T(V7E_M), // V6T2.
10175       T(V7E_M), // V6K.
10176       T(V7E_M), // V7.
10177       T(V7E_M), // V6_M.
10178       T(V7E_M), // V6S_M.
10179       T(V7E_M)  // V7E_M.
10180     };
10181   static const int v4t_plus_v6_m[] =
10182     {
10183       -1,               // PRE_V4.
10184       -1,               // V4.
10185       T(V4T),           // V4T.
10186       T(V5T),           // V5T.
10187       T(V5TE),          // V5TE.
10188       T(V5TEJ),         // V5TEJ.
10189       T(V6),            // V6.
10190       T(V6KZ),          // V6KZ.
10191       T(V6T2),          // V6T2.
10192       T(V6K),           // V6K.
10193       T(V7),            // V7.
10194       T(V6_M),          // V6_M.
10195       T(V6S_M),         // V6S_M.
10196       T(V7E_M),         // V7E_M.
10197       T(V4T_PLUS_V6_M)  // V4T plus V6_M.
10198     };
10199   static const int* comb[] =
10200     {
10201       v6t2,
10202       v6k,
10203       v7,
10204       v6_m,
10205       v6s_m,
10206       v7e_m,
10207       // Pseudo-architecture.
10208       v4t_plus_v6_m
10209     };
10210
10211   // Check we've not got a higher architecture than we know about.
10212
10213   if (oldtag > elfcpp::MAX_TAG_CPU_ARCH || newtag > elfcpp::MAX_TAG_CPU_ARCH)
10214     {
10215       gold_error(_("%s: unknown CPU architecture"), name);
10216       return -1;
10217     }
10218
10219   // Override old tag if we have a Tag_also_compatible_with on the output.
10220
10221   if ((oldtag == T(V6_M) && *secondary_compat_out == T(V4T))
10222       || (oldtag == T(V4T) && *secondary_compat_out == T(V6_M)))
10223     oldtag = T(V4T_PLUS_V6_M);
10224
10225   // And override the new tag if we have a Tag_also_compatible_with on the
10226   // input.
10227
10228   if ((newtag == T(V6_M) && secondary_compat == T(V4T))
10229       || (newtag == T(V4T) && secondary_compat == T(V6_M)))
10230     newtag = T(V4T_PLUS_V6_M);
10231
10232   // Architectures before V6KZ add features monotonically.
10233   int tagh = std::max(oldtag, newtag);
10234   if (tagh <= elfcpp::TAG_CPU_ARCH_V6KZ)
10235     return tagh;
10236
10237   int tagl = std::min(oldtag, newtag);
10238   int result = comb[tagh - T(V6T2)][tagl];
10239
10240   // Use Tag_CPU_arch == V4T and Tag_also_compatible_with (Tag_CPU_arch V6_M)
10241   // as the canonical version.
10242   if (result == T(V4T_PLUS_V6_M))
10243     {
10244       result = T(V4T);
10245       *secondary_compat_out = T(V6_M);
10246     }
10247   else
10248     *secondary_compat_out = -1;
10249
10250   if (result == -1)
10251     {
10252       gold_error(_("%s: conflicting CPU architectures %d/%d"),
10253                  name, oldtag, newtag);
10254       return -1;
10255     }
10256
10257   return result;
10258 #undef T
10259 }
10260
10261 // Helper to print AEABI enum tag value.
10262
10263 template<bool big_endian>
10264 std::string
10265 Target_arm<big_endian>::aeabi_enum_name(unsigned int value)
10266 {
10267   static const char* aeabi_enum_names[] =
10268     { "", "variable-size", "32-bit", "" };
10269   const size_t aeabi_enum_names_size =
10270     sizeof(aeabi_enum_names) / sizeof(aeabi_enum_names[0]);
10271
10272   if (value < aeabi_enum_names_size)
10273     return std::string(aeabi_enum_names[value]);
10274   else
10275     {
10276       char buffer[100];
10277       sprintf(buffer, "<unknown value %u>", value);
10278       return std::string(buffer);
10279     }
10280 }
10281
10282 // Return the string value to store in TAG_CPU_name.
10283
10284 template<bool big_endian>
10285 std::string
10286 Target_arm<big_endian>::tag_cpu_name_value(unsigned int value)
10287 {
10288   static const char* name_table[] = {
10289     // These aren't real CPU names, but we can't guess
10290     // that from the architecture version alone.
10291    "Pre v4",
10292    "ARM v4",
10293    "ARM v4T",
10294    "ARM v5T",
10295    "ARM v5TE",
10296    "ARM v5TEJ",
10297    "ARM v6",
10298    "ARM v6KZ",
10299    "ARM v6T2",
10300    "ARM v6K",
10301    "ARM v7",
10302    "ARM v6-M",
10303    "ARM v6S-M",
10304    "ARM v7E-M"
10305  };
10306  const size_t name_table_size = sizeof(name_table) / sizeof(name_table[0]);
10307
10308   if (value < name_table_size)
10309     return std::string(name_table[value]);
10310   else
10311     {
10312       char buffer[100];
10313       sprintf(buffer, "<unknown CPU value %u>", value);
10314       return std::string(buffer);
10315     } 
10316 }
10317
10318 // Merge object attributes from input file called NAME with those of the
10319 // output.  The input object attributes are in the object pointed by PASD.
10320
10321 template<bool big_endian>
10322 void
10323 Target_arm<big_endian>::merge_object_attributes(
10324     const char* name,
10325     const Attributes_section_data* pasd)
10326 {
10327   // Return if there is no attributes section data.
10328   if (pasd == NULL)
10329     return;
10330
10331   // If output has no object attributes, just copy.
10332   const int vendor = Object_attribute::OBJ_ATTR_PROC;
10333   if (this->attributes_section_data_ == NULL)
10334     {
10335       this->attributes_section_data_ = new Attributes_section_data(*pasd);
10336       Object_attribute* out_attr =
10337         this->attributes_section_data_->known_attributes(vendor);
10338
10339       // We do not output objects with Tag_MPextension_use_legacy - we move
10340       //  the attribute's value to Tag_MPextension_use.  */
10341       if (out_attr[elfcpp::Tag_MPextension_use_legacy].int_value() != 0)
10342         {
10343           if (out_attr[elfcpp::Tag_MPextension_use].int_value() != 0
10344               && out_attr[elfcpp::Tag_MPextension_use_legacy].int_value()
10345                 != out_attr[elfcpp::Tag_MPextension_use].int_value())
10346             {
10347               gold_error(_("%s has both the current and legacy "
10348                            "Tag_MPextension_use attributes"),
10349                          name);
10350             }
10351
10352           out_attr[elfcpp::Tag_MPextension_use] =
10353             out_attr[elfcpp::Tag_MPextension_use_legacy];
10354           out_attr[elfcpp::Tag_MPextension_use_legacy].set_type(0);
10355           out_attr[elfcpp::Tag_MPextension_use_legacy].set_int_value(0);
10356         }
10357
10358       return;
10359     }
10360
10361   const Object_attribute* in_attr = pasd->known_attributes(vendor);
10362   Object_attribute* out_attr =
10363     this->attributes_section_data_->known_attributes(vendor);
10364
10365   // This needs to happen before Tag_ABI_FP_number_model is merged.  */
10366   if (in_attr[elfcpp::Tag_ABI_VFP_args].int_value()
10367       != out_attr[elfcpp::Tag_ABI_VFP_args].int_value())
10368     {
10369       // Ignore mismatches if the object doesn't use floating point.  */
10370       if (out_attr[elfcpp::Tag_ABI_FP_number_model].int_value() == 0)
10371         out_attr[elfcpp::Tag_ABI_VFP_args].set_int_value(
10372             in_attr[elfcpp::Tag_ABI_VFP_args].int_value());
10373       else if (in_attr[elfcpp::Tag_ABI_FP_number_model].int_value() != 0
10374                && parameters->options().warn_mismatch())
10375         gold_error(_("%s uses VFP register arguments, output does not"),
10376                    name);
10377     }
10378
10379   for (int i = 4; i < Vendor_object_attributes::NUM_KNOWN_ATTRIBUTES; ++i)
10380     {
10381       // Merge this attribute with existing attributes.
10382       switch (i)
10383         {
10384         case elfcpp::Tag_CPU_raw_name:
10385         case elfcpp::Tag_CPU_name:
10386           // These are merged after Tag_CPU_arch.
10387           break;
10388
10389         case elfcpp::Tag_ABI_optimization_goals:
10390         case elfcpp::Tag_ABI_FP_optimization_goals:
10391           // Use the first value seen.
10392           break;
10393
10394         case elfcpp::Tag_CPU_arch:
10395           {
10396             unsigned int saved_out_attr = out_attr->int_value();
10397             // Merge Tag_CPU_arch and Tag_also_compatible_with.
10398             int secondary_compat =
10399               this->get_secondary_compatible_arch(pasd);
10400             int secondary_compat_out =
10401               this->get_secondary_compatible_arch(
10402                   this->attributes_section_data_);
10403             out_attr[i].set_int_value(
10404                 tag_cpu_arch_combine(name, out_attr[i].int_value(),
10405                                      &secondary_compat_out,
10406                                      in_attr[i].int_value(),
10407                                      secondary_compat));
10408             this->set_secondary_compatible_arch(this->attributes_section_data_,
10409                                                 secondary_compat_out);
10410
10411             // Merge Tag_CPU_name and Tag_CPU_raw_name.
10412             if (out_attr[i].int_value() == saved_out_attr)
10413               ; // Leave the names alone.
10414             else if (out_attr[i].int_value() == in_attr[i].int_value())
10415               {
10416                 // The output architecture has been changed to match the
10417                 // input architecture.  Use the input names.
10418                 out_attr[elfcpp::Tag_CPU_name].set_string_value(
10419                     in_attr[elfcpp::Tag_CPU_name].string_value());
10420                 out_attr[elfcpp::Tag_CPU_raw_name].set_string_value(
10421                     in_attr[elfcpp::Tag_CPU_raw_name].string_value());
10422               }
10423             else
10424               {
10425                 out_attr[elfcpp::Tag_CPU_name].set_string_value("");
10426                 out_attr[elfcpp::Tag_CPU_raw_name].set_string_value("");
10427               }
10428
10429             // If we still don't have a value for Tag_CPU_name,
10430             // make one up now.  Tag_CPU_raw_name remains blank.
10431             if (out_attr[elfcpp::Tag_CPU_name].string_value() == "")
10432               {
10433                 const std::string cpu_name =
10434                   this->tag_cpu_name_value(out_attr[i].int_value());
10435                 // FIXME:  If we see an unknown CPU, this will be set
10436                 // to "<unknown CPU n>", where n is the attribute value.
10437                 // This is different from BFD, which leaves the name alone.
10438                 out_attr[elfcpp::Tag_CPU_name].set_string_value(cpu_name);
10439               }
10440           }
10441           break;
10442
10443         case elfcpp::Tag_ARM_ISA_use:
10444         case elfcpp::Tag_THUMB_ISA_use:
10445         case elfcpp::Tag_WMMX_arch:
10446         case elfcpp::Tag_Advanced_SIMD_arch:
10447           // ??? Do Advanced_SIMD (NEON) and WMMX conflict?
10448         case elfcpp::Tag_ABI_FP_rounding:
10449         case elfcpp::Tag_ABI_FP_exceptions:
10450         case elfcpp::Tag_ABI_FP_user_exceptions:
10451         case elfcpp::Tag_ABI_FP_number_model:
10452         case elfcpp::Tag_VFP_HP_extension:
10453         case elfcpp::Tag_CPU_unaligned_access:
10454         case elfcpp::Tag_T2EE_use:
10455         case elfcpp::Tag_Virtualization_use:
10456         case elfcpp::Tag_MPextension_use:
10457           // Use the largest value specified.
10458           if (in_attr[i].int_value() > out_attr[i].int_value())
10459             out_attr[i].set_int_value(in_attr[i].int_value());
10460           break;
10461
10462         case elfcpp::Tag_ABI_align8_preserved:
10463         case elfcpp::Tag_ABI_PCS_RO_data:
10464           // Use the smallest value specified.
10465           if (in_attr[i].int_value() < out_attr[i].int_value())
10466             out_attr[i].set_int_value(in_attr[i].int_value());
10467           break;
10468
10469         case elfcpp::Tag_ABI_align8_needed:
10470           if ((in_attr[i].int_value() > 0 || out_attr[i].int_value() > 0)
10471               && (in_attr[elfcpp::Tag_ABI_align8_preserved].int_value() == 0
10472                   || (out_attr[elfcpp::Tag_ABI_align8_preserved].int_value()
10473                       == 0)))
10474             {
10475               // This error message should be enabled once all non-conforming
10476               // binaries in the toolchain have had the attributes set
10477               // properly.
10478               // gold_error(_("output 8-byte data alignment conflicts with %s"),
10479               //            name);
10480             }
10481           // Fall through.
10482         case elfcpp::Tag_ABI_FP_denormal:
10483         case elfcpp::Tag_ABI_PCS_GOT_use:
10484           {
10485             // These tags have 0 = don't care, 1 = strong requirement,
10486             // 2 = weak requirement.
10487             static const int order_021[3] = {0, 2, 1};
10488
10489             // Use the "greatest" from the sequence 0, 2, 1, or the largest
10490             // value if greater than 2 (for future-proofing).
10491             if ((in_attr[i].int_value() > 2
10492                  && in_attr[i].int_value() > out_attr[i].int_value())
10493                 || (in_attr[i].int_value() <= 2
10494                     && out_attr[i].int_value() <= 2
10495                     && (order_021[in_attr[i].int_value()]
10496                         > order_021[out_attr[i].int_value()])))
10497               out_attr[i].set_int_value(in_attr[i].int_value());
10498           }
10499           break;
10500
10501         case elfcpp::Tag_CPU_arch_profile:
10502           if (out_attr[i].int_value() != in_attr[i].int_value())
10503             {
10504               // 0 will merge with anything.
10505               // 'A' and 'S' merge to 'A'.
10506               // 'R' and 'S' merge to 'R'.
10507               // 'M' and 'A|R|S' is an error.
10508               if (out_attr[i].int_value() == 0
10509                   || (out_attr[i].int_value() == 'S'
10510                       && (in_attr[i].int_value() == 'A'
10511                           || in_attr[i].int_value() == 'R')))
10512                 out_attr[i].set_int_value(in_attr[i].int_value());
10513               else if (in_attr[i].int_value() == 0
10514                        || (in_attr[i].int_value() == 'S'
10515                            && (out_attr[i].int_value() == 'A'
10516                                || out_attr[i].int_value() == 'R')))
10517                 ; // Do nothing.
10518               else if (parameters->options().warn_mismatch())
10519                 {
10520                   gold_error
10521                     (_("conflicting architecture profiles %c/%c"),
10522                      in_attr[i].int_value() ? in_attr[i].int_value() : '0',
10523                      out_attr[i].int_value() ? out_attr[i].int_value() : '0');
10524                 }
10525             }
10526           break;
10527         case elfcpp::Tag_VFP_arch:
10528             {
10529               static const struct
10530               {
10531                   int ver;
10532                   int regs;
10533               } vfp_versions[7] =
10534                 {
10535                   {0, 0},
10536                   {1, 16},
10537                   {2, 16},
10538                   {3, 32},
10539                   {3, 16},
10540                   {4, 32},
10541                   {4, 16}
10542                 };
10543
10544               // Values greater than 6 aren't defined, so just pick the
10545               // biggest.
10546               if (in_attr[i].int_value() > 6
10547                   && in_attr[i].int_value() > out_attr[i].int_value())
10548                 {
10549                   *out_attr = *in_attr;
10550                   break;
10551                 }
10552               // The output uses the superset of input features
10553               // (ISA version) and registers.
10554               int ver = std::max(vfp_versions[in_attr[i].int_value()].ver,
10555                                  vfp_versions[out_attr[i].int_value()].ver);
10556               int regs = std::max(vfp_versions[in_attr[i].int_value()].regs,
10557                                   vfp_versions[out_attr[i].int_value()].regs);
10558               // This assumes all possible supersets are also a valid
10559               // options.
10560               int newval;
10561               for (newval = 6; newval > 0; newval--)
10562                 {
10563                   if (regs == vfp_versions[newval].regs
10564                       && ver == vfp_versions[newval].ver)
10565                     break;
10566                 }
10567               out_attr[i].set_int_value(newval);
10568             }
10569           break;
10570         case elfcpp::Tag_PCS_config:
10571           if (out_attr[i].int_value() == 0)
10572             out_attr[i].set_int_value(in_attr[i].int_value());
10573           else if (in_attr[i].int_value() != 0
10574                    && out_attr[i].int_value() != 0
10575                    && parameters->options().warn_mismatch())
10576             {
10577               // It's sometimes ok to mix different configs, so this is only
10578               // a warning.
10579               gold_warning(_("%s: conflicting platform configuration"), name);
10580             }
10581           break;
10582         case elfcpp::Tag_ABI_PCS_R9_use:
10583           if (in_attr[i].int_value() != out_attr[i].int_value()
10584               && out_attr[i].int_value() != elfcpp::AEABI_R9_unused
10585               && in_attr[i].int_value() != elfcpp::AEABI_R9_unused
10586               && parameters->options().warn_mismatch())
10587             {
10588               gold_error(_("%s: conflicting use of R9"), name);
10589             }
10590           if (out_attr[i].int_value() == elfcpp::AEABI_R9_unused)
10591             out_attr[i].set_int_value(in_attr[i].int_value());
10592           break;
10593         case elfcpp::Tag_ABI_PCS_RW_data:
10594           if (in_attr[i].int_value() == elfcpp::AEABI_PCS_RW_data_SBrel
10595               && (in_attr[elfcpp::Tag_ABI_PCS_R9_use].int_value()
10596                   != elfcpp::AEABI_R9_SB)
10597               && (out_attr[elfcpp::Tag_ABI_PCS_R9_use].int_value()
10598                   != elfcpp::AEABI_R9_unused)
10599               && parameters->options().warn_mismatch())
10600             {
10601               gold_error(_("%s: SB relative addressing conflicts with use "
10602                            "of R9"),
10603                            name);
10604             }
10605           // Use the smallest value specified.
10606           if (in_attr[i].int_value() < out_attr[i].int_value())
10607             out_attr[i].set_int_value(in_attr[i].int_value());
10608           break;
10609         case elfcpp::Tag_ABI_PCS_wchar_t:
10610           if (out_attr[i].int_value()
10611               && in_attr[i].int_value()
10612               && out_attr[i].int_value() != in_attr[i].int_value()
10613               && parameters->options().warn_mismatch()
10614               && parameters->options().wchar_size_warning())
10615             {
10616               gold_warning(_("%s uses %u-byte wchar_t yet the output is to "
10617                              "use %u-byte wchar_t; use of wchar_t values "
10618                              "across objects may fail"),
10619                            name, in_attr[i].int_value(),
10620                            out_attr[i].int_value());
10621             }
10622           else if (in_attr[i].int_value() && !out_attr[i].int_value())
10623             out_attr[i].set_int_value(in_attr[i].int_value());
10624           break;
10625         case elfcpp::Tag_ABI_enum_size:
10626           if (in_attr[i].int_value() != elfcpp::AEABI_enum_unused)
10627             {
10628               if (out_attr[i].int_value() == elfcpp::AEABI_enum_unused
10629                   || out_attr[i].int_value() == elfcpp::AEABI_enum_forced_wide)
10630                 {
10631                   // The existing object is compatible with anything.
10632                   // Use whatever requirements the new object has.
10633                   out_attr[i].set_int_value(in_attr[i].int_value());
10634                 }
10635               else if (in_attr[i].int_value() != elfcpp::AEABI_enum_forced_wide
10636                        && out_attr[i].int_value() != in_attr[i].int_value()
10637                        && parameters->options().warn_mismatch()
10638                        && parameters->options().enum_size_warning())
10639                 {
10640                   unsigned int in_value = in_attr[i].int_value();
10641                   unsigned int out_value = out_attr[i].int_value();
10642                   gold_warning(_("%s uses %s enums yet the output is to use "
10643                                  "%s enums; use of enum values across objects "
10644                                  "may fail"),
10645                                name,
10646                                this->aeabi_enum_name(in_value).c_str(),
10647                                this->aeabi_enum_name(out_value).c_str());
10648                 }
10649             }
10650           break;
10651         case elfcpp::Tag_ABI_VFP_args:
10652           // Already done.
10653           break;
10654         case elfcpp::Tag_ABI_WMMX_args:
10655           if (in_attr[i].int_value() != out_attr[i].int_value()
10656               && parameters->options().warn_mismatch())
10657             {
10658               gold_error(_("%s uses iWMMXt register arguments, output does "
10659                            "not"),
10660                          name);
10661             }
10662           break;
10663         case Object_attribute::Tag_compatibility:
10664           // Merged in target-independent code.
10665           break;
10666         case elfcpp::Tag_ABI_HardFP_use:
10667           // 1 (SP) and 2 (DP) conflict, so combine to 3 (SP & DP).
10668           if ((in_attr[i].int_value() == 1 && out_attr[i].int_value() == 2)
10669               || (in_attr[i].int_value() == 2 && out_attr[i].int_value() == 1))
10670             out_attr[i].set_int_value(3);
10671           else if (in_attr[i].int_value() > out_attr[i].int_value())
10672             out_attr[i].set_int_value(in_attr[i].int_value());
10673           break;
10674         case elfcpp::Tag_ABI_FP_16bit_format:
10675           if (in_attr[i].int_value() != 0 && out_attr[i].int_value() != 0)
10676             {
10677               if (in_attr[i].int_value() != out_attr[i].int_value()
10678                   && parameters->options().warn_mismatch())
10679                 gold_error(_("fp16 format mismatch between %s and output"),
10680                            name);
10681             }
10682           if (in_attr[i].int_value() != 0)
10683             out_attr[i].set_int_value(in_attr[i].int_value());
10684           break;
10685
10686         case elfcpp::Tag_DIV_use:
10687           // This tag is set to zero if we can use UDIV and SDIV in Thumb
10688           // mode on a v7-M or v7-R CPU; to one if we can not use UDIV or
10689           // SDIV at all; and to two if we can use UDIV or SDIV on a v7-A
10690           // CPU.  We will merge as follows: If the input attribute's value
10691           // is one then the output attribute's value remains unchanged.  If
10692           // the input attribute's value is zero or two then if the output
10693           // attribute's value is one the output value is set to the input
10694           // value, otherwise the output value must be the same as the
10695           // inputs.  */ 
10696           if (in_attr[i].int_value() != 1 && out_attr[i].int_value() != 1) 
10697             { 
10698               if (in_attr[i].int_value() != out_attr[i].int_value())
10699                 {
10700                   gold_error(_("DIV usage mismatch between %s and output"),
10701                              name);
10702                 }
10703             } 
10704
10705           if (in_attr[i].int_value() != 1)
10706             out_attr[i].set_int_value(in_attr[i].int_value()); 
10707           
10708           break;
10709
10710         case elfcpp::Tag_MPextension_use_legacy:
10711           // We don't output objects with Tag_MPextension_use_legacy - we
10712           // move the value to Tag_MPextension_use.
10713           if (in_attr[i].int_value() != 0
10714               && in_attr[elfcpp::Tag_MPextension_use].int_value() != 0)
10715             {
10716               if (in_attr[elfcpp::Tag_MPextension_use].int_value()
10717                   != in_attr[i].int_value())
10718                 {
10719                   gold_error(_("%s has has both the current and legacy "
10720                                "Tag_MPextension_use attributes"), 
10721                              name);
10722                 }
10723             }
10724
10725           if (in_attr[i].int_value()
10726               > out_attr[elfcpp::Tag_MPextension_use].int_value())
10727             out_attr[elfcpp::Tag_MPextension_use] = in_attr[i];
10728
10729           break;
10730
10731         case elfcpp::Tag_nodefaults:
10732           // This tag is set if it exists, but the value is unused (and is
10733           // typically zero).  We don't actually need to do anything here -
10734           // the merge happens automatically when the type flags are merged
10735           // below.
10736           break;
10737         case elfcpp::Tag_also_compatible_with:
10738           // Already done in Tag_CPU_arch.
10739           break;
10740         case elfcpp::Tag_conformance:
10741           // Keep the attribute if it matches.  Throw it away otherwise.
10742           // No attribute means no claim to conform.
10743           if (in_attr[i].string_value() != out_attr[i].string_value())
10744             out_attr[i].set_string_value("");
10745           break;
10746
10747         default:
10748           {
10749             const char* err_object = NULL;
10750
10751             // The "known_obj_attributes" table does contain some undefined
10752             // attributes.  Ensure that there are unused.
10753             if (out_attr[i].int_value() != 0
10754                 || out_attr[i].string_value() != "")
10755               err_object = "output";
10756             else if (in_attr[i].int_value() != 0
10757                      || in_attr[i].string_value() != "")
10758               err_object = name;
10759
10760             if (err_object != NULL
10761                 && parameters->options().warn_mismatch())
10762               {
10763                 // Attribute numbers >=64 (mod 128) can be safely ignored.
10764                 if ((i & 127) < 64)
10765                   gold_error(_("%s: unknown mandatory EABI object attribute "
10766                                "%d"),
10767                              err_object, i);
10768                 else
10769                   gold_warning(_("%s: unknown EABI object attribute %d"),
10770                                err_object, i);
10771               }
10772
10773             // Only pass on attributes that match in both inputs.
10774             if (!in_attr[i].matches(out_attr[i]))
10775               {
10776                 out_attr[i].set_int_value(0);
10777                 out_attr[i].set_string_value("");
10778               }
10779           }
10780         }
10781
10782       // If out_attr was copied from in_attr then it won't have a type yet.
10783       if (in_attr[i].type() && !out_attr[i].type())
10784         out_attr[i].set_type(in_attr[i].type());
10785     }
10786
10787   // Merge Tag_compatibility attributes and any common GNU ones.
10788   this->attributes_section_data_->merge(name, pasd);
10789
10790   // Check for any attributes not known on ARM.
10791   typedef Vendor_object_attributes::Other_attributes Other_attributes;
10792   const Other_attributes* in_other_attributes = pasd->other_attributes(vendor);
10793   Other_attributes::const_iterator in_iter = in_other_attributes->begin();
10794   Other_attributes* out_other_attributes =
10795     this->attributes_section_data_->other_attributes(vendor);
10796   Other_attributes::iterator out_iter = out_other_attributes->begin();
10797
10798   while (in_iter != in_other_attributes->end()
10799          || out_iter != out_other_attributes->end())
10800     {
10801       const char* err_object = NULL;
10802       int err_tag = 0;
10803
10804       // The tags for each list are in numerical order.
10805       // If the tags are equal, then merge.
10806       if (out_iter != out_other_attributes->end()
10807           && (in_iter == in_other_attributes->end()
10808               || in_iter->first > out_iter->first))
10809         {
10810           // This attribute only exists in output.  We can't merge, and we
10811           // don't know what the tag means, so delete it.
10812           err_object = "output";
10813           err_tag = out_iter->first;
10814           int saved_tag = out_iter->first;
10815           delete out_iter->second;
10816           out_other_attributes->erase(out_iter); 
10817           out_iter = out_other_attributes->upper_bound(saved_tag);
10818         }
10819       else if (in_iter != in_other_attributes->end()
10820                && (out_iter != out_other_attributes->end()
10821                    || in_iter->first < out_iter->first))
10822         {
10823           // This attribute only exists in input. We can't merge, and we
10824           // don't know what the tag means, so ignore it.
10825           err_object = name;
10826           err_tag = in_iter->first;
10827           ++in_iter;
10828         }
10829       else // The tags are equal.
10830         {
10831           // As present, all attributes in the list are unknown, and
10832           // therefore can't be merged meaningfully.
10833           err_object = "output";
10834           err_tag = out_iter->first;
10835
10836           //  Only pass on attributes that match in both inputs.
10837           if (!in_iter->second->matches(*(out_iter->second)))
10838             {
10839               // No match.  Delete the attribute.
10840               int saved_tag = out_iter->first;
10841               delete out_iter->second;
10842               out_other_attributes->erase(out_iter);
10843               out_iter = out_other_attributes->upper_bound(saved_tag);
10844             }
10845           else
10846             {
10847               // Matched.  Keep the attribute and move to the next.
10848               ++out_iter;
10849               ++in_iter;
10850             }
10851         }
10852
10853       if (err_object && parameters->options().warn_mismatch())
10854         {
10855           // Attribute numbers >=64 (mod 128) can be safely ignored.  */
10856           if ((err_tag & 127) < 64)
10857             {
10858               gold_error(_("%s: unknown mandatory EABI object attribute %d"),
10859                          err_object, err_tag);
10860             }
10861           else
10862             {
10863               gold_warning(_("%s: unknown EABI object attribute %d"),
10864                            err_object, err_tag);
10865             }
10866         }
10867     }
10868 }
10869
10870 // Stub-generation methods for Target_arm.
10871
10872 // Make a new Arm_input_section object.
10873
10874 template<bool big_endian>
10875 Arm_input_section<big_endian>*
10876 Target_arm<big_endian>::new_arm_input_section(
10877     Relobj* relobj,
10878     unsigned int shndx)
10879 {
10880   Section_id sid(relobj, shndx);
10881
10882   Arm_input_section<big_endian>* arm_input_section =
10883     new Arm_input_section<big_endian>(relobj, shndx);
10884   arm_input_section->init();
10885
10886   // Register new Arm_input_section in map for look-up.
10887   std::pair<typename Arm_input_section_map::iterator, bool> ins =
10888     this->arm_input_section_map_.insert(std::make_pair(sid, arm_input_section));
10889
10890   // Make sure that it we have not created another Arm_input_section
10891   // for this input section already.
10892   gold_assert(ins.second);
10893
10894   return arm_input_section; 
10895 }
10896
10897 // Find the Arm_input_section object corresponding to the SHNDX-th input
10898 // section of RELOBJ.
10899
10900 template<bool big_endian>
10901 Arm_input_section<big_endian>*
10902 Target_arm<big_endian>::find_arm_input_section(
10903     Relobj* relobj,
10904     unsigned int shndx) const
10905 {
10906   Section_id sid(relobj, shndx);
10907   typename Arm_input_section_map::const_iterator p =
10908     this->arm_input_section_map_.find(sid);
10909   return (p != this->arm_input_section_map_.end()) ? p->second : NULL;
10910 }
10911
10912 // Make a new stub table.
10913
10914 template<bool big_endian>
10915 Stub_table<big_endian>*
10916 Target_arm<big_endian>::new_stub_table(Arm_input_section<big_endian>* owner)
10917 {
10918   Stub_table<big_endian>* stub_table =
10919     new Stub_table<big_endian>(owner);
10920   this->stub_tables_.push_back(stub_table);
10921
10922   stub_table->set_address(owner->address() + owner->data_size());
10923   stub_table->set_file_offset(owner->offset() + owner->data_size());
10924   stub_table->finalize_data_size();
10925
10926   return stub_table;
10927 }
10928
10929 // Scan a relocation for stub generation.
10930
10931 template<bool big_endian>
10932 void
10933 Target_arm<big_endian>::scan_reloc_for_stub(
10934     const Relocate_info<32, big_endian>* relinfo,
10935     unsigned int r_type,
10936     const Sized_symbol<32>* gsym,
10937     unsigned int r_sym,
10938     const Symbol_value<32>* psymval,
10939     elfcpp::Elf_types<32>::Elf_Swxword addend,
10940     Arm_address address)
10941 {
10942   typedef typename Target_arm<big_endian>::Relocate Relocate;
10943
10944   const Arm_relobj<big_endian>* arm_relobj =
10945     Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
10946
10947   bool target_is_thumb;
10948   Symbol_value<32> symval;
10949   if (gsym != NULL)
10950     {
10951       // This is a global symbol.  Determine if we use PLT and if the
10952       // final target is THUMB.
10953       if (gsym->use_plt_offset(Scan::get_reference_flags(r_type)))
10954         {
10955           // This uses a PLT, change the symbol value.
10956           symval.set_output_value(this->plt_section()->address()
10957                                   + gsym->plt_offset());
10958           psymval = &symval;
10959           target_is_thumb = false;
10960         }
10961       else if (gsym->is_undefined())
10962         // There is no need to generate a stub symbol is undefined.
10963         return;
10964       else
10965         {
10966           target_is_thumb =
10967             ((gsym->type() == elfcpp::STT_ARM_TFUNC)
10968              || (gsym->type() == elfcpp::STT_FUNC
10969                  && !gsym->is_undefined()
10970                  && ((psymval->value(arm_relobj, 0) & 1) != 0)));
10971         }
10972     }
10973   else
10974     {
10975       // This is a local symbol.  Determine if the final target is THUMB.
10976       target_is_thumb = arm_relobj->local_symbol_is_thumb_function(r_sym);
10977     }
10978
10979   // Strip LSB if this points to a THUMB target.
10980   const Arm_reloc_property* reloc_property =
10981     arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
10982   gold_assert(reloc_property != NULL);
10983   if (target_is_thumb
10984       && reloc_property->uses_thumb_bit()
10985       && ((psymval->value(arm_relobj, 0) & 1) != 0))
10986     {
10987       Arm_address stripped_value =
10988         psymval->value(arm_relobj, 0) & ~static_cast<Arm_address>(1);
10989       symval.set_output_value(stripped_value);
10990       psymval = &symval;
10991     } 
10992
10993   // Get the symbol value.
10994   Symbol_value<32>::Value value = psymval->value(arm_relobj, 0);
10995
10996   // Owing to pipelining, the PC relative branches below actually skip
10997   // two instructions when the branch offset is 0.
10998   Arm_address destination;
10999   switch (r_type)
11000     {
11001     case elfcpp::R_ARM_CALL:
11002     case elfcpp::R_ARM_JUMP24:
11003     case elfcpp::R_ARM_PLT32:
11004       // ARM branches.
11005       destination = value + addend + 8;
11006       break;
11007     case elfcpp::R_ARM_THM_CALL:
11008     case elfcpp::R_ARM_THM_XPC22:
11009     case elfcpp::R_ARM_THM_JUMP24:
11010     case elfcpp::R_ARM_THM_JUMP19:
11011       // THUMB branches.
11012       destination = value + addend + 4;
11013       break;
11014     default:
11015       gold_unreachable();
11016     }
11017
11018   Reloc_stub* stub = NULL;
11019   Stub_type stub_type =
11020     Reloc_stub::stub_type_for_reloc(r_type, address, destination,
11021                                     target_is_thumb);
11022   if (stub_type != arm_stub_none)
11023     {
11024       // Try looking up an existing stub from a stub table.
11025       Stub_table<big_endian>* stub_table = 
11026         arm_relobj->stub_table(relinfo->data_shndx);
11027       gold_assert(stub_table != NULL);
11028    
11029       // Locate stub by destination.
11030       Reloc_stub::Key stub_key(stub_type, gsym, arm_relobj, r_sym, addend);
11031
11032       // Create a stub if there is not one already
11033       stub = stub_table->find_reloc_stub(stub_key);
11034       if (stub == NULL)
11035         {
11036           // create a new stub and add it to stub table.
11037           stub = this->stub_factory().make_reloc_stub(stub_type);
11038           stub_table->add_reloc_stub(stub, stub_key);
11039         }
11040
11041       // Record the destination address.
11042       stub->set_destination_address(destination
11043                                     | (target_is_thumb ? 1 : 0));
11044     }
11045
11046   // For Cortex-A8, we need to record a relocation at 4K page boundary.
11047   if (this->fix_cortex_a8_
11048       && (r_type == elfcpp::R_ARM_THM_JUMP24
11049           || r_type == elfcpp::R_ARM_THM_JUMP19
11050           || r_type == elfcpp::R_ARM_THM_CALL
11051           || r_type == elfcpp::R_ARM_THM_XPC22)
11052       && (address & 0xfffU) == 0xffeU)
11053     {
11054       // Found a candidate.  Note we haven't checked the destination is
11055       // within 4K here: if we do so (and don't create a record) we can't
11056       // tell that a branch should have been relocated when scanning later.
11057       this->cortex_a8_relocs_info_[address] =
11058         new Cortex_a8_reloc(stub, r_type,
11059                             destination | (target_is_thumb ? 1 : 0));
11060     }
11061 }
11062
11063 // This function scans a relocation sections for stub generation.
11064 // The template parameter Relocate must be a class type which provides
11065 // a single function, relocate(), which implements the machine
11066 // specific part of a relocation.
11067
11068 // BIG_ENDIAN is the endianness of the data.  SH_TYPE is the section type:
11069 // SHT_REL or SHT_RELA.
11070
11071 // PRELOCS points to the relocation data.  RELOC_COUNT is the number
11072 // of relocs.  OUTPUT_SECTION is the output section.
11073 // NEEDS_SPECIAL_OFFSET_HANDLING is true if input offsets need to be
11074 // mapped to output offsets.
11075
11076 // VIEW is the section data, VIEW_ADDRESS is its memory address, and
11077 // VIEW_SIZE is the size.  These refer to the input section, unless
11078 // NEEDS_SPECIAL_OFFSET_HANDLING is true, in which case they refer to
11079 // the output section.
11080
11081 template<bool big_endian>
11082 template<int sh_type>
11083 void inline
11084 Target_arm<big_endian>::scan_reloc_section_for_stubs(
11085     const Relocate_info<32, big_endian>* relinfo,
11086     const unsigned char* prelocs,
11087     size_t reloc_count,
11088     Output_section* output_section,
11089     bool needs_special_offset_handling,
11090     const unsigned char* view,
11091     elfcpp::Elf_types<32>::Elf_Addr view_address,
11092     section_size_type)
11093 {
11094   typedef typename Reloc_types<sh_type, 32, big_endian>::Reloc Reltype;
11095   const int reloc_size =
11096     Reloc_types<sh_type, 32, big_endian>::reloc_size;
11097
11098   Arm_relobj<big_endian>* arm_object =
11099     Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
11100   unsigned int local_count = arm_object->local_symbol_count();
11101
11102   Comdat_behavior comdat_behavior = CB_UNDETERMINED;
11103
11104   for (size_t i = 0; i < reloc_count; ++i, prelocs += reloc_size)
11105     {
11106       Reltype reloc(prelocs);
11107
11108       typename elfcpp::Elf_types<32>::Elf_WXword r_info = reloc.get_r_info();
11109       unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
11110       unsigned int r_type = elfcpp::elf_r_type<32>(r_info);
11111
11112       r_type = this->get_real_reloc_type(r_type);
11113
11114       // Only a few relocation types need stubs.
11115       if ((r_type != elfcpp::R_ARM_CALL)
11116          && (r_type != elfcpp::R_ARM_JUMP24)
11117          && (r_type != elfcpp::R_ARM_PLT32)
11118          && (r_type != elfcpp::R_ARM_THM_CALL)
11119          && (r_type != elfcpp::R_ARM_THM_XPC22)
11120          && (r_type != elfcpp::R_ARM_THM_JUMP24)
11121          && (r_type != elfcpp::R_ARM_THM_JUMP19)
11122          && (r_type != elfcpp::R_ARM_V4BX))
11123         continue;
11124
11125       section_offset_type offset =
11126         convert_to_section_size_type(reloc.get_r_offset());
11127
11128       if (needs_special_offset_handling)
11129         {
11130           offset = output_section->output_offset(relinfo->object,
11131                                                  relinfo->data_shndx,
11132                                                  offset);
11133           if (offset == -1)
11134             continue;
11135         }
11136
11137       // Create a v4bx stub if --fix-v4bx-interworking is used.
11138       if (r_type == elfcpp::R_ARM_V4BX)
11139         {
11140           if (this->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING)
11141             {
11142               // Get the BX instruction.
11143               typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
11144               const Valtype* wv =
11145                 reinterpret_cast<const Valtype*>(view + offset);
11146               elfcpp::Elf_types<32>::Elf_Swxword insn =
11147                 elfcpp::Swap<32, big_endian>::readval(wv);
11148               const uint32_t reg = (insn & 0xf);
11149
11150               if (reg < 0xf)
11151                 {
11152                   // Try looking up an existing stub from a stub table.
11153                   Stub_table<big_endian>* stub_table =
11154                     arm_object->stub_table(relinfo->data_shndx);
11155                   gold_assert(stub_table != NULL);
11156
11157                   if (stub_table->find_arm_v4bx_stub(reg) == NULL)
11158                     {
11159                       // create a new stub and add it to stub table.
11160                       Arm_v4bx_stub* stub =
11161                         this->stub_factory().make_arm_v4bx_stub(reg);
11162                       gold_assert(stub != NULL);
11163                       stub_table->add_arm_v4bx_stub(stub);
11164                     }
11165                 }
11166             }
11167           continue;
11168         }
11169
11170       // Get the addend.
11171       Stub_addend_reader<sh_type, big_endian> stub_addend_reader;
11172       elfcpp::Elf_types<32>::Elf_Swxword addend =
11173         stub_addend_reader(r_type, view + offset, reloc);
11174
11175       const Sized_symbol<32>* sym;
11176
11177       Symbol_value<32> symval;
11178       const Symbol_value<32> *psymval;
11179       bool is_defined_in_discarded_section;
11180       unsigned int shndx;
11181       if (r_sym < local_count)
11182         {
11183           sym = NULL;
11184           psymval = arm_object->local_symbol(r_sym);
11185
11186           // If the local symbol belongs to a section we are discarding,
11187           // and that section is a debug section, try to find the
11188           // corresponding kept section and map this symbol to its
11189           // counterpart in the kept section.  The symbol must not 
11190           // correspond to a section we are folding.
11191           bool is_ordinary;
11192           shndx = psymval->input_shndx(&is_ordinary);
11193           is_defined_in_discarded_section =
11194             (is_ordinary
11195              && shndx != elfcpp::SHN_UNDEF
11196              && !arm_object->is_section_included(shndx)
11197              && !relinfo->symtab->is_section_folded(arm_object, shndx));
11198
11199           // We need to compute the would-be final value of this local
11200           // symbol.
11201           if (!is_defined_in_discarded_section)
11202             {
11203               typedef Sized_relobj_file<32, big_endian> ObjType;
11204               typename ObjType::Compute_final_local_value_status status =
11205                 arm_object->compute_final_local_value(r_sym, psymval, &symval,
11206                                                       relinfo->symtab); 
11207               if (status == ObjType::CFLV_OK)
11208                 {
11209                   // Currently we cannot handle a branch to a target in
11210                   // a merged section.  If this is the case, issue an error
11211                   // and also free the merge symbol value.
11212                   if (!symval.has_output_value())
11213                     {
11214                       const std::string& section_name =
11215                         arm_object->section_name(shndx);
11216                       arm_object->error(_("cannot handle branch to local %u "
11217                                           "in a merged section %s"),
11218                                         r_sym, section_name.c_str());
11219                     }
11220                   psymval = &symval;
11221                 }
11222               else
11223                 {
11224                   // We cannot determine the final value.
11225                   continue;  
11226                 }
11227             }
11228         }
11229       else
11230         {
11231           const Symbol* gsym;
11232           gsym = arm_object->global_symbol(r_sym);
11233           gold_assert(gsym != NULL);
11234           if (gsym->is_forwarder())
11235             gsym = relinfo->symtab->resolve_forwards(gsym);
11236
11237           sym = static_cast<const Sized_symbol<32>*>(gsym);
11238           if (sym->has_symtab_index() && sym->symtab_index() != -1U)
11239             symval.set_output_symtab_index(sym->symtab_index());
11240           else
11241             symval.set_no_output_symtab_entry();
11242
11243           // We need to compute the would-be final value of this global
11244           // symbol.
11245           const Symbol_table* symtab = relinfo->symtab;
11246           const Sized_symbol<32>* sized_symbol =
11247             symtab->get_sized_symbol<32>(gsym);
11248           Symbol_table::Compute_final_value_status status;
11249           Arm_address value =
11250             symtab->compute_final_value<32>(sized_symbol, &status);
11251
11252           // Skip this if the symbol has not output section.
11253           if (status == Symbol_table::CFVS_NO_OUTPUT_SECTION)
11254             continue;
11255           symval.set_output_value(value);
11256
11257           if (gsym->type() == elfcpp::STT_TLS)
11258             symval.set_is_tls_symbol();
11259           else if (gsym->type() == elfcpp::STT_GNU_IFUNC)
11260             symval.set_is_ifunc_symbol();
11261           psymval = &symval;
11262
11263           is_defined_in_discarded_section =
11264             (gsym->is_defined_in_discarded_section()
11265              && gsym->is_undefined());
11266           shndx = 0;
11267         }
11268
11269       Symbol_value<32> symval2;
11270       if (is_defined_in_discarded_section)
11271         {
11272           if (comdat_behavior == CB_UNDETERMINED)
11273             {
11274               std::string name = arm_object->section_name(relinfo->data_shndx);
11275               comdat_behavior = get_comdat_behavior(name.c_str());
11276             }
11277           if (comdat_behavior == CB_PRETEND)
11278             {
11279               // FIXME: This case does not work for global symbols.
11280               // We have no place to store the original section index.
11281               // Fortunately this does not matter for comdat sections,
11282               // only for sections explicitly discarded by a linker
11283               // script.
11284               bool found;
11285               typename elfcpp::Elf_types<32>::Elf_Addr value =
11286                 arm_object->map_to_kept_section(shndx, &found);
11287               if (found)
11288                 symval2.set_output_value(value + psymval->input_value());
11289               else
11290                 symval2.set_output_value(0);
11291             }
11292           else
11293             {
11294               if (comdat_behavior == CB_WARNING)
11295                 gold_warning_at_location(relinfo, i, offset,
11296                                          _("relocation refers to discarded "
11297                                            "section"));
11298               symval2.set_output_value(0);
11299             }
11300           symval2.set_no_output_symtab_entry();
11301           psymval = &symval2;
11302         }
11303
11304       // If symbol is a section symbol, we don't know the actual type of
11305       // destination.  Give up.
11306       if (psymval->is_section_symbol())
11307         continue;
11308
11309       this->scan_reloc_for_stub(relinfo, r_type, sym, r_sym, psymval,
11310                                 addend, view_address + offset);
11311     }
11312 }
11313
11314 // Scan an input section for stub generation.
11315
11316 template<bool big_endian>
11317 void
11318 Target_arm<big_endian>::scan_section_for_stubs(
11319     const Relocate_info<32, big_endian>* relinfo,
11320     unsigned int sh_type,
11321     const unsigned char* prelocs,
11322     size_t reloc_count,
11323     Output_section* output_section,
11324     bool needs_special_offset_handling,
11325     const unsigned char* view,
11326     Arm_address view_address,
11327     section_size_type view_size)
11328 {
11329   if (sh_type == elfcpp::SHT_REL)
11330     this->scan_reloc_section_for_stubs<elfcpp::SHT_REL>(
11331         relinfo,
11332         prelocs,
11333         reloc_count,
11334         output_section,
11335         needs_special_offset_handling,
11336         view,
11337         view_address,
11338         view_size);
11339   else if (sh_type == elfcpp::SHT_RELA)
11340     // We do not support RELA type relocations yet.  This is provided for
11341     // completeness.
11342     this->scan_reloc_section_for_stubs<elfcpp::SHT_RELA>(
11343         relinfo,
11344         prelocs,
11345         reloc_count,
11346         output_section,
11347         needs_special_offset_handling,
11348         view,
11349         view_address,
11350         view_size);
11351   else
11352     gold_unreachable();
11353 }
11354
11355 // Group input sections for stub generation.
11356 //
11357 // We group input sections in an output section so that the total size,
11358 // including any padding space due to alignment is smaller than GROUP_SIZE
11359 // unless the only input section in group is bigger than GROUP_SIZE already.
11360 // Then an ARM stub table is created to follow the last input section
11361 // in group.  For each group an ARM stub table is created an is placed
11362 // after the last group.  If STUB_ALWAYS_AFTER_BRANCH is false, we further
11363 // extend the group after the stub table.
11364
11365 template<bool big_endian>
11366 void
11367 Target_arm<big_endian>::group_sections(
11368     Layout* layout,
11369     section_size_type group_size,
11370     bool stubs_always_after_branch,
11371     const Task* task)
11372 {
11373   // Group input sections and insert stub table
11374   Layout::Section_list section_list;
11375   layout->get_allocated_sections(&section_list);
11376   for (Layout::Section_list::const_iterator p = section_list.begin();
11377        p != section_list.end();
11378        ++p)
11379     {
11380       Arm_output_section<big_endian>* output_section =
11381         Arm_output_section<big_endian>::as_arm_output_section(*p);
11382       output_section->group_sections(group_size, stubs_always_after_branch,
11383                                      this, task);
11384     }
11385 }
11386
11387 // Relaxation hook.  This is where we do stub generation.
11388
11389 template<bool big_endian>
11390 bool
11391 Target_arm<big_endian>::do_relax(
11392     int pass,
11393     const Input_objects* input_objects,
11394     Symbol_table* symtab,
11395     Layout* layout,
11396     const Task* task)
11397 {
11398   // No need to generate stubs if this is a relocatable link.
11399   gold_assert(!parameters->options().relocatable());
11400
11401   // If this is the first pass, we need to group input sections into
11402   // stub groups.
11403   bool done_exidx_fixup = false;
11404   typedef typename Stub_table_list::iterator Stub_table_iterator;
11405   if (pass == 1)
11406     {
11407       // Determine the stub group size.  The group size is the absolute
11408       // value of the parameter --stub-group-size.  If --stub-group-size
11409       // is passed a negative value, we restrict stubs to be always after
11410       // the stubbed branches.
11411       int32_t stub_group_size_param =
11412         parameters->options().stub_group_size();
11413       bool stubs_always_after_branch = stub_group_size_param < 0;
11414       section_size_type stub_group_size = abs(stub_group_size_param);
11415
11416       if (stub_group_size == 1)
11417         {
11418           // Default value.
11419           // Thumb branch range is +-4MB has to be used as the default
11420           // maximum size (a given section can contain both ARM and Thumb
11421           // code, so the worst case has to be taken into account).  If we are
11422           // fixing cortex-a8 errata, the branch range has to be even smaller,
11423           // since wide conditional branch has a range of +-1MB only.
11424           //
11425           // This value is 48K less than that, which allows for 4096
11426           // 12-byte stubs.  If we exceed that, then we will fail to link.
11427           // The user will have to relink with an explicit group size
11428           // option.
11429             stub_group_size = 4145152;
11430         }
11431
11432       // The Cortex-A8 erratum fix depends on stubs not being in the same 4K
11433       // page as the first half of a 32-bit branch straddling two 4K pages.
11434       // This is a crude way of enforcing that.  In addition, long conditional
11435       // branches of THUMB-2 have a range of +-1M.  If we are fixing cortex-A8
11436       // erratum, limit the group size to  (1M - 12k) to avoid unreachable
11437       // cortex-A8 stubs from long conditional branches.
11438       if (this->fix_cortex_a8_)
11439         {
11440           stubs_always_after_branch = true;
11441           const section_size_type cortex_a8_group_size = 1024 * (1024 - 12);
11442           stub_group_size = std::max(stub_group_size, cortex_a8_group_size);
11443         }
11444
11445       group_sections(layout, stub_group_size, stubs_always_after_branch, task);
11446      
11447       // Also fix .ARM.exidx section coverage.
11448       Arm_output_section<big_endian>* exidx_output_section = NULL;
11449       for (Layout::Section_list::const_iterator p =
11450              layout->section_list().begin();
11451            p != layout->section_list().end();
11452            ++p)
11453         if ((*p)->type() == elfcpp::SHT_ARM_EXIDX)
11454           {
11455             if (exidx_output_section == NULL)
11456               exidx_output_section =
11457                 Arm_output_section<big_endian>::as_arm_output_section(*p);
11458             else
11459               // We cannot handle this now.
11460               gold_error(_("multiple SHT_ARM_EXIDX sections %s and %s in a "
11461                            "non-relocatable link"),
11462                           exidx_output_section->name(),
11463                           (*p)->name());
11464           }
11465
11466       if (exidx_output_section != NULL)
11467         {
11468           this->fix_exidx_coverage(layout, input_objects, exidx_output_section,
11469                                    symtab, task);
11470           done_exidx_fixup = true;
11471         }
11472     }
11473   else
11474     {
11475       // If this is not the first pass, addresses and file offsets have
11476       // been reset at this point, set them here.
11477       for (Stub_table_iterator sp = this->stub_tables_.begin();
11478            sp != this->stub_tables_.end();
11479            ++sp)
11480         {
11481           Arm_input_section<big_endian>* owner = (*sp)->owner();
11482           off_t off = align_address(owner->original_size(),
11483                                     (*sp)->addralign());
11484           (*sp)->set_address_and_file_offset(owner->address() + off,
11485                                              owner->offset() + off);
11486         }
11487     }
11488
11489   // The Cortex-A8 stubs are sensitive to layout of code sections.  At the
11490   // beginning of each relaxation pass, just blow away all the stubs.
11491   // Alternatively, we could selectively remove only the stubs and reloc
11492   // information for code sections that have moved since the last pass.
11493   // That would require more book-keeping.
11494   if (this->fix_cortex_a8_)
11495     {
11496       // Clear all Cortex-A8 reloc information.
11497       for (typename Cortex_a8_relocs_info::const_iterator p =
11498              this->cortex_a8_relocs_info_.begin();
11499            p != this->cortex_a8_relocs_info_.end();
11500            ++p)
11501         delete p->second;
11502       this->cortex_a8_relocs_info_.clear();
11503
11504       // Remove all Cortex-A8 stubs.
11505       for (Stub_table_iterator sp = this->stub_tables_.begin();
11506            sp != this->stub_tables_.end();
11507            ++sp)
11508         (*sp)->remove_all_cortex_a8_stubs();
11509     }
11510   
11511   // Scan relocs for relocation stubs
11512   for (Input_objects::Relobj_iterator op = input_objects->relobj_begin();
11513        op != input_objects->relobj_end();
11514        ++op)
11515     {
11516       Arm_relobj<big_endian>* arm_relobj =
11517         Arm_relobj<big_endian>::as_arm_relobj(*op);
11518       // Lock the object so we can read from it.  This is only called
11519       // single-threaded from Layout::finalize, so it is OK to lock.
11520       Task_lock_obj<Object> tl(task, arm_relobj);
11521       arm_relobj->scan_sections_for_stubs(this, symtab, layout);
11522     }
11523
11524   // Check all stub tables to see if any of them have their data sizes
11525   // or addresses alignments changed.  These are the only things that
11526   // matter.
11527   bool any_stub_table_changed = false;
11528   Unordered_set<const Output_section*> sections_needing_adjustment;
11529   for (Stub_table_iterator sp = this->stub_tables_.begin();
11530        (sp != this->stub_tables_.end()) && !any_stub_table_changed;
11531        ++sp)
11532     {
11533       if ((*sp)->update_data_size_and_addralign())
11534         {
11535           // Update data size of stub table owner.
11536           Arm_input_section<big_endian>* owner = (*sp)->owner();
11537           uint64_t address = owner->address();
11538           off_t offset = owner->offset();
11539           owner->reset_address_and_file_offset();
11540           owner->set_address_and_file_offset(address, offset);
11541
11542           sections_needing_adjustment.insert(owner->output_section());
11543           any_stub_table_changed = true;
11544         }
11545     }
11546
11547   // Output_section_data::output_section() returns a const pointer but we
11548   // need to update output sections, so we record all output sections needing
11549   // update above and scan the sections here to find out what sections need
11550   // to be updated.
11551   for (Layout::Section_list::const_iterator p = layout->section_list().begin();
11552       p != layout->section_list().end();
11553       ++p)
11554     {
11555       if (sections_needing_adjustment.find(*p)
11556           != sections_needing_adjustment.end())
11557         (*p)->set_section_offsets_need_adjustment();
11558     }
11559
11560   // Stop relaxation if no EXIDX fix-up and no stub table change.
11561   bool continue_relaxation = done_exidx_fixup || any_stub_table_changed;
11562
11563   // Finalize the stubs in the last relaxation pass.
11564   if (!continue_relaxation)
11565     {
11566       for (Stub_table_iterator sp = this->stub_tables_.begin();
11567            (sp != this->stub_tables_.end()) && !any_stub_table_changed;
11568             ++sp)
11569         (*sp)->finalize_stubs();
11570
11571       // Update output local symbol counts of objects if necessary.
11572       for (Input_objects::Relobj_iterator op = input_objects->relobj_begin();
11573            op != input_objects->relobj_end();
11574            ++op)
11575         {
11576           Arm_relobj<big_endian>* arm_relobj =
11577             Arm_relobj<big_endian>::as_arm_relobj(*op);
11578
11579           // Update output local symbol counts.  We need to discard local
11580           // symbols defined in parts of input sections that are discarded by
11581           // relaxation.
11582           if (arm_relobj->output_local_symbol_count_needs_update())
11583             {
11584               // We need to lock the object's file to update it.
11585               Task_lock_obj<Object> tl(task, arm_relobj);
11586               arm_relobj->update_output_local_symbol_count();
11587             }
11588         }
11589     }
11590
11591   return continue_relaxation;
11592 }
11593
11594 // Relocate a stub.
11595
11596 template<bool big_endian>
11597 void
11598 Target_arm<big_endian>::relocate_stub(
11599     Stub* stub,
11600     const Relocate_info<32, big_endian>* relinfo,
11601     Output_section* output_section,
11602     unsigned char* view,
11603     Arm_address address,
11604     section_size_type view_size)
11605 {
11606   Relocate relocate;
11607   const Stub_template* stub_template = stub->stub_template();
11608   for (size_t i = 0; i < stub_template->reloc_count(); i++)
11609     {
11610       size_t reloc_insn_index = stub_template->reloc_insn_index(i);
11611       const Insn_template* insn = &stub_template->insns()[reloc_insn_index];
11612
11613       unsigned int r_type = insn->r_type();
11614       section_size_type reloc_offset = stub_template->reloc_offset(i);
11615       section_size_type reloc_size = insn->size();
11616       gold_assert(reloc_offset + reloc_size <= view_size);
11617
11618       // This is the address of the stub destination.
11619       Arm_address target = stub->reloc_target(i) + insn->reloc_addend();
11620       Symbol_value<32> symval;
11621       symval.set_output_value(target);
11622
11623       // Synthesize a fake reloc just in case.  We don't have a symbol so
11624       // we use 0.
11625       unsigned char reloc_buffer[elfcpp::Elf_sizes<32>::rel_size];
11626       memset(reloc_buffer, 0, sizeof(reloc_buffer));
11627       elfcpp::Rel_write<32, big_endian> reloc_write(reloc_buffer);
11628       reloc_write.put_r_offset(reloc_offset);
11629       reloc_write.put_r_info(elfcpp::elf_r_info<32>(0, r_type));
11630       elfcpp::Rel<32, big_endian> rel(reloc_buffer);
11631
11632       relocate.relocate(relinfo, this, output_section,
11633                         this->fake_relnum_for_stubs, rel, r_type,
11634                         NULL, &symval, view + reloc_offset,
11635                         address + reloc_offset, reloc_size);
11636     }
11637 }
11638
11639 // Determine whether an object attribute tag takes an integer, a
11640 // string or both.
11641
11642 template<bool big_endian>
11643 int
11644 Target_arm<big_endian>::do_attribute_arg_type(int tag) const
11645 {
11646   if (tag == Object_attribute::Tag_compatibility)
11647     return (Object_attribute::ATTR_TYPE_FLAG_INT_VAL
11648             | Object_attribute::ATTR_TYPE_FLAG_STR_VAL);
11649   else if (tag == elfcpp::Tag_nodefaults)
11650     return (Object_attribute::ATTR_TYPE_FLAG_INT_VAL
11651             | Object_attribute::ATTR_TYPE_FLAG_NO_DEFAULT);
11652   else if (tag == elfcpp::Tag_CPU_raw_name || tag == elfcpp::Tag_CPU_name)
11653     return Object_attribute::ATTR_TYPE_FLAG_STR_VAL;
11654   else if (tag < 32)
11655     return Object_attribute::ATTR_TYPE_FLAG_INT_VAL;
11656   else
11657     return ((tag & 1) != 0
11658             ? Object_attribute::ATTR_TYPE_FLAG_STR_VAL
11659             : Object_attribute::ATTR_TYPE_FLAG_INT_VAL);
11660 }
11661
11662 // Reorder attributes.
11663 //
11664 // The ABI defines that Tag_conformance should be emitted first, and that
11665 // Tag_nodefaults should be second (if either is defined).  This sets those
11666 // two positions, and bumps up the position of all the remaining tags to
11667 // compensate.
11668
11669 template<bool big_endian>
11670 int
11671 Target_arm<big_endian>::do_attributes_order(int num) const
11672 {
11673   // Reorder the known object attributes in output.  We want to move
11674   // Tag_conformance to position 4 and Tag_conformance to position 5
11675   // and shift everything between 4 .. Tag_conformance - 1 to make room.
11676   if (num == 4)
11677     return elfcpp::Tag_conformance;
11678   if (num == 5)
11679     return elfcpp::Tag_nodefaults;
11680   if ((num - 2) < elfcpp::Tag_nodefaults)
11681     return num - 2;
11682   if ((num - 1) < elfcpp::Tag_conformance)
11683     return num - 1;
11684   return num;
11685 }
11686
11687 // Scan a span of THUMB code for Cortex-A8 erratum.
11688
11689 template<bool big_endian>
11690 void
11691 Target_arm<big_endian>::scan_span_for_cortex_a8_erratum(
11692     Arm_relobj<big_endian>* arm_relobj,
11693     unsigned int shndx,
11694     section_size_type span_start,
11695     section_size_type span_end,
11696     const unsigned char* view,
11697     Arm_address address)
11698 {
11699   // Scan for 32-bit Thumb-2 branches which span two 4K regions, where:
11700   //
11701   // The opcode is BLX.W, BL.W, B.W, Bcc.W
11702   // The branch target is in the same 4KB region as the
11703   // first half of the branch.
11704   // The instruction before the branch is a 32-bit
11705   // length non-branch instruction.
11706   section_size_type i = span_start;
11707   bool last_was_32bit = false;
11708   bool last_was_branch = false;
11709   while (i < span_end)
11710     {
11711       typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
11712       const Valtype* wv = reinterpret_cast<const Valtype*>(view + i);
11713       uint32_t insn = elfcpp::Swap<16, big_endian>::readval(wv);
11714       bool is_blx = false, is_b = false;
11715       bool is_bl = false, is_bcc = false;
11716
11717       bool insn_32bit = (insn & 0xe000) == 0xe000 && (insn & 0x1800) != 0x0000;
11718       if (insn_32bit)
11719         {
11720           // Load the rest of the insn (in manual-friendly order).
11721           insn = (insn << 16) | elfcpp::Swap<16, big_endian>::readval(wv + 1);
11722
11723           // Encoding T4: B<c>.W.
11724           is_b = (insn & 0xf800d000U) == 0xf0009000U;
11725           // Encoding T1: BL<c>.W.
11726           is_bl = (insn & 0xf800d000U) == 0xf000d000U;
11727           // Encoding T2: BLX<c>.W.
11728           is_blx = (insn & 0xf800d000U) == 0xf000c000U;
11729           // Encoding T3: B<c>.W (not permitted in IT block).
11730           is_bcc = ((insn & 0xf800d000U) == 0xf0008000U
11731                     && (insn & 0x07f00000U) != 0x03800000U);
11732         }
11733
11734       bool is_32bit_branch = is_b || is_bl || is_blx || is_bcc;
11735                            
11736       // If this instruction is a 32-bit THUMB branch that crosses a 4K
11737       // page boundary and it follows 32-bit non-branch instruction,
11738       // we need to work around.
11739       if (is_32bit_branch
11740           && ((address + i) & 0xfffU) == 0xffeU
11741           && last_was_32bit
11742           && !last_was_branch)
11743         {
11744           // Check to see if there is a relocation stub for this branch.
11745           bool force_target_arm = false;
11746           bool force_target_thumb = false;
11747           const Cortex_a8_reloc* cortex_a8_reloc = NULL;
11748           Cortex_a8_relocs_info::const_iterator p =
11749             this->cortex_a8_relocs_info_.find(address + i);
11750
11751           if (p != this->cortex_a8_relocs_info_.end())
11752             {
11753               cortex_a8_reloc = p->second;
11754               bool target_is_thumb = (cortex_a8_reloc->destination() & 1) != 0;
11755
11756               if (cortex_a8_reloc->r_type() == elfcpp::R_ARM_THM_CALL
11757                   && !target_is_thumb)
11758                 force_target_arm = true;
11759               else if (cortex_a8_reloc->r_type() == elfcpp::R_ARM_THM_CALL
11760                        && target_is_thumb)
11761                 force_target_thumb = true;
11762             }
11763
11764           off_t offset;
11765           Stub_type stub_type = arm_stub_none;
11766
11767           // Check if we have an offending branch instruction.
11768           uint16_t upper_insn = (insn >> 16) & 0xffffU;
11769           uint16_t lower_insn = insn & 0xffffU;
11770           typedef struct Arm_relocate_functions<big_endian> RelocFuncs;
11771
11772           if (cortex_a8_reloc != NULL
11773               && cortex_a8_reloc->reloc_stub() != NULL)
11774             // We've already made a stub for this instruction, e.g.
11775             // it's a long branch or a Thumb->ARM stub.  Assume that
11776             // stub will suffice to work around the A8 erratum (see
11777             // setting of always_after_branch above).
11778             ;
11779           else if (is_bcc)
11780             {
11781               offset = RelocFuncs::thumb32_cond_branch_offset(upper_insn,
11782                                                               lower_insn);
11783               stub_type = arm_stub_a8_veneer_b_cond;
11784             }
11785           else if (is_b || is_bl || is_blx)
11786             {
11787               offset = RelocFuncs::thumb32_branch_offset(upper_insn,
11788                                                          lower_insn);
11789               if (is_blx)
11790                 offset &= ~3;
11791
11792               stub_type = (is_blx
11793                            ? arm_stub_a8_veneer_blx
11794                            : (is_bl
11795                               ? arm_stub_a8_veneer_bl
11796                               : arm_stub_a8_veneer_b));
11797             }
11798
11799           if (stub_type != arm_stub_none)
11800             {
11801               Arm_address pc_for_insn = address + i + 4;
11802
11803               // The original instruction is a BL, but the target is
11804               // an ARM instruction.  If we were not making a stub,
11805               // the BL would have been converted to a BLX.  Use the
11806               // BLX stub instead in that case.
11807               if (this->may_use_v5t_interworking() && force_target_arm
11808                   && stub_type == arm_stub_a8_veneer_bl)
11809                 {
11810                   stub_type = arm_stub_a8_veneer_blx;
11811                   is_blx = true;
11812                   is_bl = false;
11813                 }
11814               // Conversely, if the original instruction was
11815               // BLX but the target is Thumb mode, use the BL stub.
11816               else if (force_target_thumb
11817                        && stub_type == arm_stub_a8_veneer_blx)
11818                 {
11819                   stub_type = arm_stub_a8_veneer_bl;
11820                   is_blx = false;
11821                   is_bl = true;
11822                 }
11823
11824               if (is_blx)
11825                 pc_for_insn &= ~3;
11826
11827               // If we found a relocation, use the proper destination,
11828               // not the offset in the (unrelocated) instruction.
11829               // Note this is always done if we switched the stub type above.
11830               if (cortex_a8_reloc != NULL)
11831                 offset = (off_t) (cortex_a8_reloc->destination() - pc_for_insn);
11832
11833               Arm_address target = (pc_for_insn + offset) | (is_blx ? 0 : 1);
11834
11835               // Add a new stub if destination address in in the same page.
11836               if (((address + i) & ~0xfffU) == (target & ~0xfffU))
11837                 {
11838                   Cortex_a8_stub* stub =
11839                     this->stub_factory_.make_cortex_a8_stub(stub_type,
11840                                                             arm_relobj, shndx,
11841                                                             address + i,
11842                                                             target, insn);
11843                   Stub_table<big_endian>* stub_table =
11844                     arm_relobj->stub_table(shndx);
11845                   gold_assert(stub_table != NULL);
11846                   stub_table->add_cortex_a8_stub(address + i, stub);
11847                 }
11848             }
11849         }
11850
11851       i += insn_32bit ? 4 : 2;
11852       last_was_32bit = insn_32bit;
11853       last_was_branch = is_32bit_branch;
11854     }
11855 }
11856
11857 // Apply the Cortex-A8 workaround.
11858
11859 template<bool big_endian>
11860 void
11861 Target_arm<big_endian>::apply_cortex_a8_workaround(
11862     const Cortex_a8_stub* stub,
11863     Arm_address stub_address,
11864     unsigned char* insn_view,
11865     Arm_address insn_address)
11866 {
11867   typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
11868   Valtype* wv = reinterpret_cast<Valtype*>(insn_view);
11869   Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
11870   Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
11871   off_t branch_offset = stub_address - (insn_address + 4);
11872
11873   typedef struct Arm_relocate_functions<big_endian> RelocFuncs;
11874   switch (stub->stub_template()->type())
11875     {
11876     case arm_stub_a8_veneer_b_cond:
11877       // For a conditional branch, we re-write it to be an unconditional
11878       // branch to the stub.  We use the THUMB-2 encoding here.
11879       upper_insn = 0xf000U;
11880       lower_insn = 0xb800U;
11881       // Fall through
11882     case arm_stub_a8_veneer_b:
11883     case arm_stub_a8_veneer_bl:
11884     case arm_stub_a8_veneer_blx:
11885       if ((lower_insn & 0x5000U) == 0x4000U)
11886         // For a BLX instruction, make sure that the relocation is
11887         // rounded up to a word boundary.  This follows the semantics of
11888         // the instruction which specifies that bit 1 of the target
11889         // address will come from bit 1 of the base address.
11890         branch_offset = (branch_offset + 2) & ~3;
11891
11892       // Put BRANCH_OFFSET back into the insn.
11893       gold_assert(!utils::has_overflow<25>(branch_offset));
11894       upper_insn = RelocFuncs::thumb32_branch_upper(upper_insn, branch_offset);
11895       lower_insn = RelocFuncs::thumb32_branch_lower(lower_insn, branch_offset);
11896       break;
11897
11898     default:
11899       gold_unreachable();
11900     }
11901
11902   // Put the relocated value back in the object file:
11903   elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
11904   elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
11905 }
11906
11907 template<bool big_endian>
11908 class Target_selector_arm : public Target_selector
11909 {
11910  public:
11911   Target_selector_arm()
11912     : Target_selector(elfcpp::EM_ARM, 32, big_endian,
11913                       (big_endian ? "elf32-bigarm" : "elf32-littlearm"),
11914                       (big_endian ? "armelfb" : "armelf"))
11915   { }
11916
11917   Target*
11918   do_instantiate_target()
11919   { return new Target_arm<big_endian>(); }
11920 };
11921
11922 // Fix .ARM.exidx section coverage.
11923
11924 template<bool big_endian>
11925 void
11926 Target_arm<big_endian>::fix_exidx_coverage(
11927     Layout* layout,
11928     const Input_objects* input_objects,
11929     Arm_output_section<big_endian>* exidx_section,
11930     Symbol_table* symtab,
11931     const Task* task)
11932 {
11933   // We need to look at all the input sections in output in ascending
11934   // order of of output address.  We do that by building a sorted list
11935   // of output sections by addresses.  Then we looks at the output sections
11936   // in order.  The input sections in an output section are already sorted
11937   // by addresses within the output section.
11938
11939   typedef std::set<Output_section*, output_section_address_less_than>
11940       Sorted_output_section_list;
11941   Sorted_output_section_list sorted_output_sections;
11942
11943   // Find out all the output sections of input sections pointed by
11944   // EXIDX input sections.
11945   for (Input_objects::Relobj_iterator p = input_objects->relobj_begin();
11946        p != input_objects->relobj_end();
11947        ++p)
11948     {
11949       Arm_relobj<big_endian>* arm_relobj =
11950         Arm_relobj<big_endian>::as_arm_relobj(*p);
11951       std::vector<unsigned int> shndx_list;
11952       arm_relobj->get_exidx_shndx_list(&shndx_list);
11953       for (size_t i = 0; i < shndx_list.size(); ++i)
11954         {
11955           const Arm_exidx_input_section* exidx_input_section =
11956             arm_relobj->exidx_input_section_by_shndx(shndx_list[i]);
11957           gold_assert(exidx_input_section != NULL);
11958           if (!exidx_input_section->has_errors())
11959             {
11960               unsigned int text_shndx = exidx_input_section->link();
11961               Output_section* os = arm_relobj->output_section(text_shndx);
11962               if (os != NULL && (os->flags() & elfcpp::SHF_ALLOC) != 0)
11963                 sorted_output_sections.insert(os);
11964             }
11965         }
11966     }
11967
11968   // Go over the output sections in ascending order of output addresses.
11969   typedef typename Arm_output_section<big_endian>::Text_section_list
11970       Text_section_list;
11971   Text_section_list sorted_text_sections;
11972   for (typename Sorted_output_section_list::iterator p =
11973         sorted_output_sections.begin();
11974       p != sorted_output_sections.end();
11975       ++p)
11976     {
11977       Arm_output_section<big_endian>* arm_output_section =
11978         Arm_output_section<big_endian>::as_arm_output_section(*p);
11979       arm_output_section->append_text_sections_to_list(&sorted_text_sections);
11980     } 
11981
11982   exidx_section->fix_exidx_coverage(layout, sorted_text_sections, symtab,
11983                                     merge_exidx_entries(), task);
11984 }
11985
11986 Target_selector_arm<false> target_selector_arm;
11987 Target_selector_arm<true> target_selector_armbe;
11988
11989 } // End anonymous namespace.