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