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