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