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