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