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