[GOLD] R_PPC64_REL16_HIGH relocs
[platform/upstream/binutils.git] / gold / arm.cc
1 // arm.cc -- arm target support for gold.
2
3 // Copyright (C) 2009-2019 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_short;
66
67 template<bool big_endian>
68 class Output_data_plt_arm_long;
69
70 template<bool big_endian>
71 class Stub_table;
72
73 template<bool big_endian>
74 class Arm_input_section;
75
76 class Arm_exidx_cantunwind;
77
78 class Arm_exidx_merged_section;
79
80 class Arm_exidx_fixup;
81
82 template<bool big_endian>
83 class Arm_output_section;
84
85 class Arm_exidx_input_section;
86
87 template<bool big_endian>
88 class Arm_relobj;
89
90 template<bool big_endian>
91 class Arm_relocate_functions;
92
93 template<bool big_endian>
94 class Arm_output_data_got;
95
96 template<bool big_endian>
97 class Target_arm;
98
99 // For convenience.
100 typedef elfcpp::Elf_types<32>::Elf_Addr Arm_address;
101
102 // Maximum branch offsets for ARM, THUMB and THUMB2.
103 const int32_t ARM_MAX_FWD_BRANCH_OFFSET = ((((1 << 23) - 1) << 2) + 8);
104 const int32_t ARM_MAX_BWD_BRANCH_OFFSET = ((-((1 << 23) << 2)) + 8);
105 const int32_t THM_MAX_FWD_BRANCH_OFFSET = ((1 << 22) -2 + 4);
106 const int32_t THM_MAX_BWD_BRANCH_OFFSET = (-(1 << 22) + 4);
107 const int32_t THM2_MAX_FWD_BRANCH_OFFSET = (((1 << 24) - 2) + 4);
108 const int32_t THM2_MAX_BWD_BRANCH_OFFSET = (-(1 << 24) + 4);
109
110 // Thread Control Block size.
111 const size_t ARM_TCB_SIZE = 8;
112
113 // The arm target class.
114 //
115 // This is a very simple port of gold for ARM-EABI.  It is intended for
116 // supporting Android only for the time being.
117 //
118 // TODOs:
119 // - Implement all static relocation types documented in arm-reloc.def.
120 // - Make PLTs more flexible for different architecture features like
121 //   Thumb-2 and BE8.
122 // There are probably a lot more.
123
124 // Ideally we would like to avoid using global variables but this is used
125 // very in many places and sometimes in loops.  If we use a function
126 // returning a static instance of Arm_reloc_property_table, it will be very
127 // slow in an threaded environment since the static instance needs to be
128 // locked.  The pointer is below initialized in the
129 // Target::do_select_as_default_target() hook so that we do not spend time
130 // building the table if we are not linking ARM objects.
131 //
132 // An alternative is to process the information in arm-reloc.def in
133 // compilation time and generate a representation of it in PODs only.  That
134 // way we can avoid initialization when the linker starts.
135
136 Arm_reloc_property_table* arm_reloc_property_table = NULL;
137
138 // Instruction template class.  This class is similar to the insn_sequence
139 // struct in bfd/elf32-arm.c.
140
141 class Insn_template
142 {
143  public:
144   // Types of instruction templates.
145   enum Type
146     {
147       THUMB16_TYPE = 1,
148       // THUMB16_SPECIAL_TYPE is used by sub-classes of Stub for instruction
149       // templates with class-specific semantics.  Currently this is used
150       // only by the Cortex_a8_stub class for handling condition codes in
151       // conditional branches.
152       THUMB16_SPECIAL_TYPE,
153       THUMB32_TYPE,
154       ARM_TYPE,
155       DATA_TYPE
156     };
157
158   // Factory methods to create instruction templates in different formats.
159
160   static const Insn_template
161   thumb16_insn(uint32_t data)
162   { return Insn_template(data, THUMB16_TYPE, elfcpp::R_ARM_NONE, 0); }
163
164   // A Thumb conditional branch, in which the proper condition is inserted
165   // when we build the stub.
166   static const Insn_template
167   thumb16_bcond_insn(uint32_t data)
168   { return Insn_template(data, THUMB16_SPECIAL_TYPE, elfcpp::R_ARM_NONE, 1); }
169
170   static const Insn_template
171   thumb32_insn(uint32_t data)
172   { return Insn_template(data, THUMB32_TYPE, elfcpp::R_ARM_NONE, 0); }
173
174   static const Insn_template
175   thumb32_b_insn(uint32_t data, int reloc_addend)
176   {
177     return Insn_template(data, THUMB32_TYPE, elfcpp::R_ARM_THM_JUMP24,
178                          reloc_addend);
179   }
180
181   static const Insn_template
182   arm_insn(uint32_t data)
183   { return Insn_template(data, ARM_TYPE, elfcpp::R_ARM_NONE, 0); }
184
185   static const Insn_template
186   arm_rel_insn(unsigned data, int reloc_addend)
187   { return Insn_template(data, ARM_TYPE, elfcpp::R_ARM_JUMP24, reloc_addend); }
188
189   static const Insn_template
190   data_word(unsigned data, unsigned int r_type, int reloc_addend)
191   { return Insn_template(data, DATA_TYPE, r_type, reloc_addend); }
192
193   // Accessors.  This class is used for read-only objects so no modifiers
194   // are provided.
195
196   uint32_t
197   data() const
198   { return this->data_; }
199
200   // Return the instruction sequence type of this.
201   Type
202   type() const
203   { return this->type_; }
204
205   // Return the ARM relocation type of this.
206   unsigned int
207   r_type() const
208   { return this->r_type_; }
209
210   int32_t
211   reloc_addend() const
212   { return this->reloc_addend_; }
213
214   // Return size of instruction template in bytes.
215   size_t
216   size() const;
217
218   // Return byte-alignment of instruction template.
219   unsigned
220   alignment() const;
221
222  private:
223   // We make the constructor private to ensure that only the factory
224   // methods are used.
225   inline
226   Insn_template(unsigned data, Type type, unsigned int r_type, int reloc_addend)
227     : data_(data), type_(type), r_type_(r_type), reloc_addend_(reloc_addend)
228   { }
229
230   // Instruction specific data.  This is used to store information like
231   // some of the instruction bits.
232   uint32_t data_;
233   // Instruction template type.
234   Type type_;
235   // Relocation type if there is a relocation or R_ARM_NONE otherwise.
236   unsigned int r_type_;
237   // Relocation addend.
238   int32_t reloc_addend_;
239 };
240
241 // Macro for generating code to stub types. One entry per long/short
242 // branch stub
243
244 #define DEF_STUBS \
245   DEF_STUB(long_branch_any_any) \
246   DEF_STUB(long_branch_v4t_arm_thumb) \
247   DEF_STUB(long_branch_thumb_only) \
248   DEF_STUB(long_branch_v4t_thumb_thumb) \
249   DEF_STUB(long_branch_v4t_thumb_arm) \
250   DEF_STUB(short_branch_v4t_thumb_arm) \
251   DEF_STUB(long_branch_any_arm_pic) \
252   DEF_STUB(long_branch_any_thumb_pic) \
253   DEF_STUB(long_branch_v4t_thumb_thumb_pic) \
254   DEF_STUB(long_branch_v4t_arm_thumb_pic) \
255   DEF_STUB(long_branch_v4t_thumb_arm_pic) \
256   DEF_STUB(long_branch_thumb_only_pic) \
257   DEF_STUB(a8_veneer_b_cond) \
258   DEF_STUB(a8_veneer_b) \
259   DEF_STUB(a8_veneer_bl) \
260   DEF_STUB(a8_veneer_blx) \
261   DEF_STUB(v4_veneer_bx)
262
263 // Stub types.
264
265 #define DEF_STUB(x) arm_stub_##x,
266 typedef enum
267   {
268     arm_stub_none,
269     DEF_STUBS
270
271     // First reloc stub type.
272     arm_stub_reloc_first = arm_stub_long_branch_any_any,
273     // Last  reloc stub type.
274     arm_stub_reloc_last = arm_stub_long_branch_thumb_only_pic,
275
276     // First Cortex-A8 stub type.
277     arm_stub_cortex_a8_first = arm_stub_a8_veneer_b_cond,
278     // Last Cortex-A8 stub type.
279     arm_stub_cortex_a8_last = arm_stub_a8_veneer_blx,
280
281     // Last stub type.
282     arm_stub_type_last = arm_stub_v4_veneer_bx
283   } Stub_type;
284 #undef DEF_STUB
285
286 // Stub template class.  Templates are meant to be read-only objects.
287 // A stub template for a stub type contains all read-only attributes
288 // common to all stubs of the same type.
289
290 class Stub_template
291 {
292  public:
293   Stub_template(Stub_type, const Insn_template*, size_t);
294
295   ~Stub_template()
296   { }
297
298   // Return stub type.
299   Stub_type
300   type() const
301   { return this->type_; }
302
303   // Return an array of instruction templates.
304   const Insn_template*
305   insns() const
306   { return this->insns_; }
307
308   // Return size of template in number of instructions.
309   size_t
310   insn_count() const
311   { return this->insn_count_; }
312
313   // Return size of template in bytes.
314   size_t
315   size() const
316   { return this->size_; }
317
318   // Return alignment of the stub template.
319   unsigned
320   alignment() const
321   { return this->alignment_; }
322
323   // Return whether entry point is in thumb mode.
324   bool
325   entry_in_thumb_mode() const
326   { return this->entry_in_thumb_mode_; }
327
328   // Return number of relocations in this template.
329   size_t
330   reloc_count() const
331   { return this->relocs_.size(); }
332
333   // Return index of the I-th instruction with relocation.
334   size_t
335   reloc_insn_index(size_t i) const
336   {
337     gold_assert(i < this->relocs_.size());
338     return this->relocs_[i].first;
339   }
340
341   // Return the offset of the I-th instruction with relocation from the
342   // beginning of the stub.
343   section_size_type
344   reloc_offset(size_t i) const
345   {
346     gold_assert(i < this->relocs_.size());
347     return this->relocs_[i].second;
348   }
349
350  private:
351   // This contains information about an instruction template with a relocation
352   // and its offset from start of stub.
353   typedef std::pair<size_t, section_size_type> Reloc;
354
355   // A Stub_template may not be copied.  We want to share templates as much
356   // as possible.
357   Stub_template(const Stub_template&);
358   Stub_template& operator=(const Stub_template&);
359
360   // Stub type.
361   Stub_type type_;
362   // Points to an array of Insn_templates.
363   const Insn_template* insns_;
364   // Number of Insn_templates in insns_[].
365   size_t insn_count_;
366   // Size of templated instructions in bytes.
367   size_t size_;
368   // Alignment of templated instructions.
369   unsigned alignment_;
370   // Flag to indicate if entry is in thumb mode.
371   bool entry_in_thumb_mode_;
372   // A table of reloc instruction indices and offsets.  We can find these by
373   // looking at the instruction templates but we pre-compute and then stash
374   // them here for speed.
375   std::vector<Reloc> relocs_;
376 };
377
378 //
379 // A class for code stubs.  This is a base class for different type of
380 // stubs used in the ARM target.
381 //
382
383 class Stub
384 {
385  private:
386   static const section_offset_type invalid_offset =
387     static_cast<section_offset_type>(-1);
388
389  public:
390   Stub(const Stub_template* stub_template)
391     : stub_template_(stub_template), offset_(invalid_offset)
392   { }
393
394   virtual
395    ~Stub()
396   { }
397
398   // Return the stub template.
399   const Stub_template*
400   stub_template() const
401   { return this->stub_template_; }
402
403   // Return offset of code stub from beginning of its containing stub table.
404   section_offset_type
405   offset() const
406   {
407     gold_assert(this->offset_ != invalid_offset);
408     return this->offset_;
409   }
410
411   // Set offset of code stub from beginning of its containing stub table.
412   void
413   set_offset(section_offset_type offset)
414   { this->offset_ = offset; }
415
416   // Return the relocation target address of the i-th relocation in the
417   // stub.  This must be defined in a child class.
418   Arm_address
419   reloc_target(size_t i)
420   { return this->do_reloc_target(i); }
421
422   // Write a stub at output VIEW.  BIG_ENDIAN select how a stub is written.
423   void
424   write(unsigned char* view, section_size_type view_size, bool big_endian)
425   { this->do_write(view, view_size, big_endian); }
426
427   // Return the instruction for THUMB16_SPECIAL_TYPE instruction template
428   // for the i-th instruction.
429   uint16_t
430   thumb16_special(size_t i)
431   { return this->do_thumb16_special(i); }
432
433  protected:
434   // This must be defined in the child class.
435   virtual Arm_address
436   do_reloc_target(size_t) = 0;
437
438   // This may be overridden in the child class.
439   virtual void
440   do_write(unsigned char* view, section_size_type view_size, bool big_endian)
441   {
442     if (big_endian)
443       this->do_fixed_endian_write<true>(view, view_size);
444     else
445       this->do_fixed_endian_write<false>(view, view_size);
446   }
447
448   // This must be overridden if a child class uses the THUMB16_SPECIAL_TYPE
449   // instruction template.
450   virtual uint16_t
451   do_thumb16_special(size_t)
452   { gold_unreachable(); }
453
454  private:
455   // A template to implement do_write.
456   template<bool big_endian>
457   void inline
458   do_fixed_endian_write(unsigned char*, section_size_type);
459
460   // Its template.
461   const Stub_template* stub_template_;
462   // Offset within the section of containing this stub.
463   section_offset_type offset_;
464 };
465
466 // Reloc stub class.  These are stubs we use to fix up relocation because
467 // of limited branch ranges.
468
469 class Reloc_stub : public Stub
470 {
471  public:
472   static const unsigned int invalid_index = static_cast<unsigned int>(-1);
473   // We assume we never jump to this address.
474   static const Arm_address invalid_address = static_cast<Arm_address>(-1);
475
476   // Return destination address.
477   Arm_address
478   destination_address() const
479   {
480     gold_assert(this->destination_address_ != this->invalid_address);
481     return this->destination_address_;
482   }
483
484   // Set destination address.
485   void
486   set_destination_address(Arm_address address)
487   {
488     gold_assert(address != this->invalid_address);
489     this->destination_address_ = address;
490   }
491
492   // Reset destination address.
493   void
494   reset_destination_address()
495   { this->destination_address_ = this->invalid_address; }
496
497   // Determine stub type for a branch of a relocation of R_TYPE going
498   // from BRANCH_ADDRESS to BRANCH_TARGET.  If TARGET_IS_THUMB is set,
499   // the branch target is a thumb instruction.  TARGET is used for look
500   // up ARM-specific linker settings.
501   static Stub_type
502   stub_type_for_reloc(unsigned int r_type, Arm_address branch_address,
503                       Arm_address branch_target, bool target_is_thumb);
504
505   // Reloc_stub key.  A key is logically a triplet of a stub type, a symbol
506   // and an addend.  Since we treat global and local symbol differently, we
507   // use a Symbol object for a global symbol and a object-index pair for
508   // a local symbol.
509   class Key
510   {
511    public:
512     // If SYMBOL is not null, this is a global symbol, we ignore RELOBJ and
513     // R_SYM.  Otherwise, this is a local symbol and RELOBJ must non-NULL
514     // and R_SYM must not be invalid_index.
515     Key(Stub_type stub_type, const Symbol* symbol, const Relobj* relobj,
516         unsigned int r_sym, int32_t addend)
517       : stub_type_(stub_type), addend_(addend)
518     {
519       if (symbol != NULL)
520         {
521           this->r_sym_ = Reloc_stub::invalid_index;
522           this->u_.symbol = symbol;
523         }
524       else
525         {
526           gold_assert(relobj != NULL && r_sym != invalid_index);
527           this->r_sym_ = r_sym;
528           this->u_.relobj = relobj;
529         }
530     }
531
532     ~Key()
533     { }
534
535     // Accessors: Keys are meant to be read-only object so no modifiers are
536     // provided.
537
538     // Return stub type.
539     Stub_type
540     stub_type() const
541     { return this->stub_type_; }
542
543     // Return the local symbol index or invalid_index.
544     unsigned int
545     r_sym() const
546     { return this->r_sym_; }
547
548     // Return the symbol if there is one.
549     const Symbol*
550     symbol() const
551     { return this->r_sym_ == invalid_index ? this->u_.symbol : NULL; }
552
553     // Return the relobj if there is one.
554     const Relobj*
555     relobj() const
556     { return this->r_sym_ != invalid_index ? this->u_.relobj : NULL; }
557
558     // Whether this equals to another key k.
559     bool
560     eq(const Key& k) const
561     {
562       return ((this->stub_type_ == k.stub_type_)
563               && (this->r_sym_ == k.r_sym_)
564               && ((this->r_sym_ != Reloc_stub::invalid_index)
565                   ? (this->u_.relobj == k.u_.relobj)
566                   : (this->u_.symbol == k.u_.symbol))
567               && (this->addend_ == k.addend_));
568     }
569
570     // Return a hash value.
571     size_t
572     hash_value() const
573     {
574       return (this->stub_type_
575               ^ this->r_sym_
576               ^ gold::string_hash<char>(
577                     (this->r_sym_ != Reloc_stub::invalid_index)
578                     ? this->u_.relobj->name().c_str()
579                     : this->u_.symbol->name())
580               ^ this->addend_);
581     }
582
583     // Functors for STL associative containers.
584     struct hash
585     {
586       size_t
587       operator()(const Key& k) const
588       { return k.hash_value(); }
589     };
590
591     struct equal_to
592     {
593       bool
594       operator()(const Key& k1, const Key& k2) const
595       { return k1.eq(k2); }
596     };
597
598     // Name of key.  This is mainly for debugging.
599     std::string
600     name() const ATTRIBUTE_UNUSED;
601
602    private:
603     // Stub type.
604     Stub_type stub_type_;
605     // If this is a local symbol, this is the index in the defining object.
606     // Otherwise, it is invalid_index for a global symbol.
607     unsigned int r_sym_;
608     // If r_sym_ is an invalid index, this points to a global symbol.
609     // Otherwise, it points to a relobj.  We used the unsized and target
610     // independent Symbol and Relobj classes instead of Sized_symbol<32> and
611     // Arm_relobj, in order to avoid making the stub class a template
612     // as most of the stub machinery is endianness-neutral.  However, it
613     // may require a bit of casting done by users of this class.
614     union
615     {
616       const Symbol* symbol;
617       const Relobj* relobj;
618     } u_;
619     // Addend associated with a reloc.
620     int32_t addend_;
621   };
622
623  protected:
624   // Reloc_stubs are created via a stub factory.  So these are protected.
625   Reloc_stub(const Stub_template* stub_template)
626     : Stub(stub_template), destination_address_(invalid_address)
627   { }
628
629   ~Reloc_stub()
630   { }
631
632   friend class Stub_factory;
633
634   // Return the relocation target address of the i-th relocation in the
635   // stub.
636   Arm_address
637   do_reloc_target(size_t i)
638   {
639     // All reloc stub have only one relocation.
640     gold_assert(i == 0);
641     return this->destination_address_;
642   }
643
644  private:
645   // Address of destination.
646   Arm_address destination_address_;
647 };
648
649 // Cortex-A8 stub class.  We need a Cortex-A8 stub to redirect any 32-bit
650 // THUMB branch that meets the following conditions:
651 //
652 // 1. The branch straddles across a page boundary. i.e. lower 12-bit of
653 //    branch address is 0xffe.
654 // 2. The branch target address is in the same page as the first word of the
655 //    branch.
656 // 3. The branch follows a 32-bit instruction which is not a branch.
657 //
658 // To do the fix up, we need to store the address of the branch instruction
659 // and its target at least.  We also need to store the original branch
660 // instruction bits for the condition code in a conditional branch.  The
661 // condition code is used in a special instruction template.  We also want
662 // to identify input sections needing Cortex-A8 workaround quickly.  We store
663 // extra information about object and section index of the code section
664 // containing a branch being fixed up.  The information is used to mark
665 // the code section when we finalize the Cortex-A8 stubs.
666 //
667
668 class Cortex_a8_stub : public Stub
669 {
670  public:
671   ~Cortex_a8_stub()
672   { }
673
674   // Return the object of the code section containing the branch being fixed
675   // up.
676   Relobj*
677   relobj() const
678   { return this->relobj_; }
679
680   // Return the section index of the code section containing the branch being
681   // fixed up.
682   unsigned int
683   shndx() const
684   { return this->shndx_; }
685
686   // Return the source address of stub.  This is the address of the original
687   // branch instruction.  LSB is 1 always set to indicate that it is a THUMB
688   // instruction.
689   Arm_address
690   source_address() const
691   { return this->source_address_; }
692
693   // Return the destination address of the stub.  This is the branch taken
694   // address of the original branch instruction.  LSB is 1 if it is a THUMB
695   // instruction address.
696   Arm_address
697   destination_address() const
698   { return this->destination_address_; }
699
700   // Return the instruction being fixed up.
701   uint32_t
702   original_insn() const
703   { return this->original_insn_; }
704
705  protected:
706   // Cortex_a8_stubs are created via a stub factory.  So these are protected.
707   Cortex_a8_stub(const Stub_template* stub_template, Relobj* relobj,
708                  unsigned int shndx, Arm_address source_address,
709                  Arm_address destination_address, uint32_t original_insn)
710     : Stub(stub_template), relobj_(relobj), shndx_(shndx),
711       source_address_(source_address | 1U),
712       destination_address_(destination_address),
713       original_insn_(original_insn)
714   { }
715
716   friend class Stub_factory;
717
718   // Return the relocation target address of the i-th relocation in the
719   // stub.
720   Arm_address
721   do_reloc_target(size_t i)
722   {
723     if (this->stub_template()->type() == arm_stub_a8_veneer_b_cond)
724       {
725         // The conditional branch veneer has two relocations.
726         gold_assert(i < 2);
727         return i == 0 ? this->source_address_ + 4 : this->destination_address_;
728       }
729     else
730       {
731         // All other Cortex-A8 stubs have only one relocation.
732         gold_assert(i == 0);
733         return this->destination_address_;
734       }
735   }
736
737   // Return an instruction for the THUMB16_SPECIAL_TYPE instruction template.
738   uint16_t
739   do_thumb16_special(size_t);
740
741  private:
742   // Object of the code section containing the branch being fixed up.
743   Relobj* relobj_;
744   // Section index of the code section containing the branch begin fixed up.
745   unsigned int shndx_;
746   // Source address of original branch.
747   Arm_address source_address_;
748   // Destination address of the original branch.
749   Arm_address destination_address_;
750   // Original branch instruction.  This is needed for copying the condition
751   // code from a condition branch to its stub.
752   uint32_t original_insn_;
753 };
754
755 // ARMv4 BX Rx branch relocation stub class.
756 class Arm_v4bx_stub : public Stub
757 {
758  public:
759   ~Arm_v4bx_stub()
760   { }
761
762   // Return the associated register.
763   uint32_t
764   reg() const
765   { return this->reg_; }
766
767  protected:
768   // Arm V4BX stubs are created via a stub factory.  So these are protected.
769   Arm_v4bx_stub(const Stub_template* stub_template, const uint32_t reg)
770     : Stub(stub_template), reg_(reg)
771   { }
772
773   friend class Stub_factory;
774
775   // Return the relocation target address of the i-th relocation in the
776   // stub.
777   Arm_address
778   do_reloc_target(size_t)
779   { gold_unreachable(); }
780
781   // This may be overridden in the child class.
782   virtual void
783   do_write(unsigned char* view, section_size_type view_size, bool big_endian)
784   {
785     if (big_endian)
786       this->do_fixed_endian_v4bx_write<true>(view, view_size);
787     else
788       this->do_fixed_endian_v4bx_write<false>(view, view_size);
789   }
790
791  private:
792   // A template to implement do_write.
793   template<bool big_endian>
794   void inline
795   do_fixed_endian_v4bx_write(unsigned char* view, section_size_type)
796   {
797     const Insn_template* insns = this->stub_template()->insns();
798     elfcpp::Swap<32, big_endian>::writeval(view,
799                                            (insns[0].data()
800                                            + (this->reg_ << 16)));
801     view += insns[0].size();
802     elfcpp::Swap<32, big_endian>::writeval(view,
803                                            (insns[1].data() + this->reg_));
804     view += insns[1].size();
805     elfcpp::Swap<32, big_endian>::writeval(view,
806                                            (insns[2].data() + this->reg_));
807   }
808
809   // A register index (r0-r14), which is associated with the stub.
810   uint32_t reg_;
811 };
812
813 // Stub factory class.
814
815 class Stub_factory
816 {
817  public:
818   // Return the unique instance of this class.
819   static const Stub_factory&
820   get_instance()
821   {
822     static Stub_factory singleton;
823     return singleton;
824   }
825
826   // Make a relocation stub.
827   Reloc_stub*
828   make_reloc_stub(Stub_type stub_type) const
829   {
830     gold_assert(stub_type >= arm_stub_reloc_first
831                 && stub_type <= arm_stub_reloc_last);
832     return new Reloc_stub(this->stub_templates_[stub_type]);
833   }
834
835   // Make a Cortex-A8 stub.
836   Cortex_a8_stub*
837   make_cortex_a8_stub(Stub_type stub_type, Relobj* relobj, unsigned int shndx,
838                       Arm_address source, Arm_address destination,
839                       uint32_t original_insn) const
840   {
841     gold_assert(stub_type >= arm_stub_cortex_a8_first
842                 && stub_type <= arm_stub_cortex_a8_last);
843     return new Cortex_a8_stub(this->stub_templates_[stub_type], relobj, shndx,
844                               source, destination, original_insn);
845   }
846
847   // Make an ARM V4BX relocation stub.
848   // This method creates a stub from the arm_stub_v4_veneer_bx template only.
849   Arm_v4bx_stub*
850   make_arm_v4bx_stub(uint32_t reg) const
851   {
852     gold_assert(reg < 0xf);
853     return new Arm_v4bx_stub(this->stub_templates_[arm_stub_v4_veneer_bx],
854                              reg);
855   }
856
857  private:
858   // Constructor and destructor are protected since we only return a single
859   // instance created in Stub_factory::get_instance().
860
861   Stub_factory();
862
863   // A Stub_factory may not be copied since it is a singleton.
864   Stub_factory(const Stub_factory&);
865   Stub_factory& operator=(Stub_factory&);
866
867   // Stub templates.  These are initialized in the constructor.
868   const Stub_template* stub_templates_[arm_stub_type_last+1];
869 };
870
871 // A class to hold stubs for the ARM target.
872
873 template<bool big_endian>
874 class Stub_table : public Output_data
875 {
876  public:
877   Stub_table(Arm_input_section<big_endian>* owner)
878     : Output_data(), owner_(owner), reloc_stubs_(), reloc_stubs_size_(0),
879       reloc_stubs_addralign_(1), cortex_a8_stubs_(), arm_v4bx_stubs_(0xf),
880       prev_data_size_(0), prev_addralign_(1)
881   { }
882
883   ~Stub_table()
884   { }
885
886   // Owner of this stub table.
887   Arm_input_section<big_endian>*
888   owner() const
889   { return this->owner_; }
890
891   // Whether this stub table is empty.
892   bool
893   empty() const
894   {
895     return (this->reloc_stubs_.empty()
896             && this->cortex_a8_stubs_.empty()
897             && this->arm_v4bx_stubs_.empty());
898   }
899
900   // Return the current data size.
901   off_t
902   current_data_size() const
903   { return this->current_data_size_for_child(); }
904
905   // Add a STUB using KEY.  The caller is responsible for avoiding addition
906   // if a STUB with the same key has already been added.
907   void
908   add_reloc_stub(Reloc_stub* stub, const Reloc_stub::Key& key)
909   {
910     const Stub_template* stub_template = stub->stub_template();
911     gold_assert(stub_template->type() == key.stub_type());
912     this->reloc_stubs_[key] = stub;
913
914     // Assign stub offset early.  We can do this because we never remove
915     // reloc stubs and they are in the beginning of the stub table.
916     uint64_t align = stub_template->alignment();
917     this->reloc_stubs_size_ = align_address(this->reloc_stubs_size_, align);
918     stub->set_offset(this->reloc_stubs_size_);
919     this->reloc_stubs_size_ += stub_template->size();
920     this->reloc_stubs_addralign_ =
921       std::max(this->reloc_stubs_addralign_, align);
922   }
923
924   // Add a Cortex-A8 STUB that fixes up a THUMB branch at ADDRESS.
925   // The caller is responsible for avoiding addition if a STUB with the same
926   // address has already been added.
927   void
928   add_cortex_a8_stub(Arm_address address, Cortex_a8_stub* stub)
929   {
930     std::pair<Arm_address, Cortex_a8_stub*> value(address, stub);
931     this->cortex_a8_stubs_.insert(value);
932   }
933
934   // Add an ARM V4BX relocation stub. A register index will be retrieved
935   // from the stub.
936   void
937   add_arm_v4bx_stub(Arm_v4bx_stub* stub)
938   {
939     gold_assert(stub != NULL && this->arm_v4bx_stubs_[stub->reg()] == NULL);
940     this->arm_v4bx_stubs_[stub->reg()] = stub;
941   }
942
943   // Remove all Cortex-A8 stubs.
944   void
945   remove_all_cortex_a8_stubs();
946
947   // Look up a relocation stub using KEY.  Return NULL if there is none.
948   Reloc_stub*
949   find_reloc_stub(const Reloc_stub::Key& key) const
950   {
951     typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.find(key);
952     return (p != this->reloc_stubs_.end()) ? p->second : NULL;
953   }
954
955   // Look up an arm v4bx relocation stub using the register index.
956   // Return NULL if there is none.
957   Arm_v4bx_stub*
958   find_arm_v4bx_stub(const uint32_t reg) const
959   {
960     gold_assert(reg < 0xf);
961     return this->arm_v4bx_stubs_[reg];
962   }
963
964   // Relocate stubs in this stub table.
965   void
966   relocate_stubs(const Relocate_info<32, big_endian>*,
967                  Target_arm<big_endian>*, Output_section*,
968                  unsigned char*, Arm_address, section_size_type);
969
970   // Update data size and alignment at the end of a relaxation pass.  Return
971   // true if either data size or alignment is different from that of the
972   // previous relaxation pass.
973   bool
974   update_data_size_and_addralign();
975
976   // Finalize stubs.  Set the offsets of all stubs and mark input sections
977   // needing the Cortex-A8 workaround.
978   void
979   finalize_stubs();
980
981   // Apply Cortex-A8 workaround to an address range.
982   void
983   apply_cortex_a8_workaround_to_address_range(Target_arm<big_endian>*,
984                                               unsigned char*, Arm_address,
985                                               section_size_type);
986
987  protected:
988   // Write out section contents.
989   void
990   do_write(Output_file*);
991
992   // Return the required alignment.
993   uint64_t
994   do_addralign() const
995   { return this->prev_addralign_; }
996
997   // Reset address and file offset.
998   void
999   do_reset_address_and_file_offset()
1000   { this->set_current_data_size_for_child(this->prev_data_size_); }
1001
1002   // Set final data size.
1003   void
1004   set_final_data_size()
1005   { this->set_data_size(this->current_data_size()); }
1006
1007  private:
1008   // Relocate one stub.
1009   void
1010   relocate_stub(Stub*, const Relocate_info<32, big_endian>*,
1011                 Target_arm<big_endian>*, Output_section*,
1012                 unsigned char*, Arm_address, section_size_type);
1013
1014   // Unordered map of relocation stubs.
1015   typedef
1016     Unordered_map<Reloc_stub::Key, Reloc_stub*, Reloc_stub::Key::hash,
1017                   Reloc_stub::Key::equal_to>
1018     Reloc_stub_map;
1019
1020   // List of Cortex-A8 stubs ordered by addresses of branches being
1021   // fixed up in output.
1022   typedef std::map<Arm_address, Cortex_a8_stub*> Cortex_a8_stub_list;
1023   // List of Arm V4BX relocation stubs ordered by associated registers.
1024   typedef std::vector<Arm_v4bx_stub*> Arm_v4bx_stub_list;
1025
1026   // Owner of this stub table.
1027   Arm_input_section<big_endian>* owner_;
1028   // The relocation stubs.
1029   Reloc_stub_map reloc_stubs_;
1030   // Size of reloc stubs.
1031   off_t reloc_stubs_size_;
1032   // Maximum address alignment of reloc stubs.
1033   uint64_t reloc_stubs_addralign_;
1034   // The cortex_a8_stubs.
1035   Cortex_a8_stub_list cortex_a8_stubs_;
1036   // The Arm V4BX relocation stubs.
1037   Arm_v4bx_stub_list arm_v4bx_stubs_;
1038   // data size of this in the previous pass.
1039   off_t prev_data_size_;
1040   // address alignment of this in the previous pass.
1041   uint64_t prev_addralign_;
1042 };
1043
1044 // Arm_exidx_cantunwind class.  This represents an EXIDX_CANTUNWIND entry
1045 // we add to the end of an EXIDX input section that goes into the output.
1046
1047 class Arm_exidx_cantunwind : public Output_section_data
1048 {
1049  public:
1050   Arm_exidx_cantunwind(Relobj* relobj, unsigned int shndx)
1051     : Output_section_data(8, 4, true), relobj_(relobj), shndx_(shndx)
1052   { }
1053
1054   // Return the object containing the section pointed by this.
1055   Relobj*
1056   relobj() const
1057   { return this->relobj_; }
1058
1059   // Return the section index of the section pointed by this.
1060   unsigned int
1061   shndx() const
1062   { return this->shndx_; }
1063
1064  protected:
1065   void
1066   do_write(Output_file* of)
1067   {
1068     if (parameters->target().is_big_endian())
1069       this->do_fixed_endian_write<true>(of);
1070     else
1071       this->do_fixed_endian_write<false>(of);
1072   }
1073
1074   // Write to a map file.
1075   void
1076   do_print_to_mapfile(Mapfile* mapfile) const
1077   { mapfile->print_output_data(this, _("** ARM cantunwind")); }
1078
1079  private:
1080   // Implement do_write for a given endianness.
1081   template<bool big_endian>
1082   void inline
1083   do_fixed_endian_write(Output_file*);
1084
1085   // The object containing the section pointed by this.
1086   Relobj* relobj_;
1087   // The section index of the section pointed by this.
1088   unsigned int shndx_;
1089 };
1090
1091 // During EXIDX coverage fix-up, we compact an EXIDX section.  The
1092 // Offset map is used to map input section offset within the EXIDX section
1093 // to the output offset from the start of this EXIDX section.
1094
1095 typedef std::map<section_offset_type, section_offset_type>
1096         Arm_exidx_section_offset_map;
1097
1098 // Arm_exidx_merged_section class.  This represents an EXIDX input section
1099 // with some of its entries merged.
1100
1101 class Arm_exidx_merged_section : public Output_relaxed_input_section
1102 {
1103  public:
1104   // Constructor for Arm_exidx_merged_section.
1105   // EXIDX_INPUT_SECTION points to the unmodified EXIDX input section.
1106   // SECTION_OFFSET_MAP points to a section offset map describing how
1107   // parts of the input section are mapped to output.  DELETED_BYTES is
1108   // the number of bytes deleted from the EXIDX input section.
1109   Arm_exidx_merged_section(
1110       const Arm_exidx_input_section& exidx_input_section,
1111       const Arm_exidx_section_offset_map& section_offset_map,
1112       uint32_t deleted_bytes);
1113
1114   // Build output contents.
1115   void
1116   build_contents(const unsigned char*, section_size_type);
1117
1118   // Return the original EXIDX input section.
1119   const Arm_exidx_input_section&
1120   exidx_input_section() const
1121   { return this->exidx_input_section_; }
1122
1123   // Return the section offset map.
1124   const Arm_exidx_section_offset_map&
1125   section_offset_map() const
1126   { return this->section_offset_map_; }
1127
1128  protected:
1129   // Write merged section into file OF.
1130   void
1131   do_write(Output_file* of);
1132
1133   bool
1134   do_output_offset(const Relobj*, unsigned int, section_offset_type,
1135                   section_offset_type*) const;
1136
1137  private:
1138   // Original EXIDX input section.
1139   const Arm_exidx_input_section& exidx_input_section_;
1140   // Section offset map.
1141   const Arm_exidx_section_offset_map& section_offset_map_;
1142   // Merged section contents.  We need to keep build the merged section
1143   // and save it here to avoid accessing the original EXIDX section when
1144   // we cannot lock the sections' object.
1145   unsigned char* section_contents_;
1146 };
1147
1148 // A class to wrap an ordinary input section containing executable code.
1149
1150 template<bool big_endian>
1151 class Arm_input_section : public Output_relaxed_input_section
1152 {
1153  public:
1154   Arm_input_section(Relobj* relobj, unsigned int shndx)
1155     : Output_relaxed_input_section(relobj, shndx, 1),
1156       original_addralign_(1), original_size_(0), stub_table_(NULL),
1157       original_contents_(NULL)
1158   { }
1159
1160   ~Arm_input_section()
1161   { delete[] this->original_contents_; }
1162
1163   // Initialize.
1164   void
1165   init();
1166
1167   // Whether this is a stub table owner.
1168   bool
1169   is_stub_table_owner() const
1170   { return this->stub_table_ != NULL && this->stub_table_->owner() == this; }
1171
1172   // Return the stub table.
1173   Stub_table<big_endian>*
1174   stub_table() const
1175   { return this->stub_table_; }
1176
1177   // Set the stub_table.
1178   void
1179   set_stub_table(Stub_table<big_endian>* stub_table)
1180   { this->stub_table_ = stub_table; }
1181
1182   // Downcast a base pointer to an Arm_input_section pointer.  This is
1183   // not type-safe but we only use Arm_input_section not the base class.
1184   static Arm_input_section<big_endian>*
1185   as_arm_input_section(Output_relaxed_input_section* poris)
1186   { return static_cast<Arm_input_section<big_endian>*>(poris); }
1187
1188   // Return the original size of the section.
1189   uint32_t
1190   original_size() const
1191   { return this->original_size_; }
1192
1193  protected:
1194   // Write data to output file.
1195   void
1196   do_write(Output_file*);
1197
1198   // Return required alignment of this.
1199   uint64_t
1200   do_addralign() const
1201   {
1202     if (this->is_stub_table_owner())
1203       return std::max(this->stub_table_->addralign(),
1204                       static_cast<uint64_t>(this->original_addralign_));
1205     else
1206       return this->original_addralign_;
1207   }
1208
1209   // Finalize data size.
1210   void
1211   set_final_data_size();
1212
1213   // Reset address and file offset.
1214   void
1215   do_reset_address_and_file_offset();
1216
1217   // Output offset.
1218   bool
1219   do_output_offset(const Relobj* object, unsigned int shndx,
1220                    section_offset_type offset,
1221                    section_offset_type* poutput) const
1222   {
1223     if ((object == this->relobj())
1224         && (shndx == this->shndx())
1225         && (offset >= 0)
1226         && (offset <=
1227             convert_types<section_offset_type, uint32_t>(this->original_size_)))
1228       {
1229         *poutput = offset;
1230         return true;
1231       }
1232     else
1233       return false;
1234   }
1235
1236  private:
1237   // Copying is not allowed.
1238   Arm_input_section(const Arm_input_section&);
1239   Arm_input_section& operator=(const Arm_input_section&);
1240
1241   // Address alignment of the original input section.
1242   uint32_t original_addralign_;
1243   // Section size of the original input section.
1244   uint32_t original_size_;
1245   // Stub table.
1246   Stub_table<big_endian>* stub_table_;
1247   // Original section contents.  We have to make a copy here since the file
1248   // containing the original section may not be locked when we need to access
1249   // the contents.
1250   unsigned char* original_contents_;
1251 };
1252
1253 // Arm_exidx_fixup class.  This is used to define a number of methods
1254 // and keep states for fixing up EXIDX coverage.
1255
1256 class Arm_exidx_fixup
1257 {
1258  public:
1259   Arm_exidx_fixup(Output_section* exidx_output_section,
1260                   bool merge_exidx_entries = true)
1261     : exidx_output_section_(exidx_output_section), last_unwind_type_(UT_NONE),
1262       last_inlined_entry_(0), last_input_section_(NULL),
1263       section_offset_map_(NULL), first_output_text_section_(NULL),
1264       merge_exidx_entries_(merge_exidx_entries)
1265   { }
1266
1267   ~Arm_exidx_fixup()
1268   { delete this->section_offset_map_; }
1269
1270   // Process an EXIDX section for entry merging.  SECTION_CONTENTS points
1271   // to the EXIDX contents and SECTION_SIZE is the size of the contents. Return
1272   // number of bytes to be deleted in output.  If parts of the input EXIDX
1273   // section are merged a heap allocated Arm_exidx_section_offset_map is store
1274   // in the located PSECTION_OFFSET_MAP.   The caller owns the map and is
1275   // responsible for releasing it.
1276   template<bool big_endian>
1277   uint32_t
1278   process_exidx_section(const Arm_exidx_input_section* exidx_input_section,
1279                         const unsigned char* section_contents,
1280                         section_size_type section_size,
1281                         Arm_exidx_section_offset_map** psection_offset_map);
1282
1283   // Append an EXIDX_CANTUNWIND entry pointing at the end of the last
1284   // input section, if there is not one already.
1285   void
1286   add_exidx_cantunwind_as_needed();
1287
1288   // Return the output section for the text section which is linked to the
1289   // first exidx input in output.
1290   Output_section*
1291   first_output_text_section() const
1292   { return this->first_output_text_section_; }
1293
1294  private:
1295   // Copying is not allowed.
1296   Arm_exidx_fixup(const Arm_exidx_fixup&);
1297   Arm_exidx_fixup& operator=(const Arm_exidx_fixup&);
1298
1299   // Type of EXIDX unwind entry.
1300   enum Unwind_type
1301   {
1302     // No type.
1303     UT_NONE,
1304     // EXIDX_CANTUNWIND.
1305     UT_EXIDX_CANTUNWIND,
1306     // Inlined entry.
1307     UT_INLINED_ENTRY,
1308     // Normal entry.
1309     UT_NORMAL_ENTRY,
1310   };
1311
1312   // Process an EXIDX entry.  We only care about the second word of the
1313   // entry.  Return true if the entry can be deleted.
1314   bool
1315   process_exidx_entry(uint32_t second_word);
1316
1317   // Update the current section offset map during EXIDX section fix-up.
1318   // If there is no map, create one.  INPUT_OFFSET is the offset of a
1319   // reference point, DELETED_BYTES is the number of deleted by in the
1320   // section so far.  If DELETE_ENTRY is true, the reference point and
1321   // all offsets after the previous reference point are discarded.
1322   void
1323   update_offset_map(section_offset_type input_offset,
1324                     section_size_type deleted_bytes, bool delete_entry);
1325
1326   // EXIDX output section.
1327   Output_section* exidx_output_section_;
1328   // Unwind type of the last EXIDX entry processed.
1329   Unwind_type last_unwind_type_;
1330   // Last seen inlined EXIDX entry.
1331   uint32_t last_inlined_entry_;
1332   // Last processed EXIDX input section.
1333   const Arm_exidx_input_section* last_input_section_;
1334   // Section offset map created in process_exidx_section.
1335   Arm_exidx_section_offset_map* section_offset_map_;
1336   // Output section for the text section which is linked to the first exidx
1337   // input in output.
1338   Output_section* first_output_text_section_;
1339
1340   bool merge_exidx_entries_;
1341 };
1342
1343 // Arm output section class.  This is defined mainly to add a number of
1344 // stub generation methods.
1345
1346 template<bool big_endian>
1347 class Arm_output_section : public Output_section
1348 {
1349  public:
1350   typedef std::vector<std::pair<Relobj*, unsigned int> > Text_section_list;
1351
1352   // We need to force SHF_LINK_ORDER in a SHT_ARM_EXIDX section.
1353   Arm_output_section(const char* name, elfcpp::Elf_Word type,
1354                      elfcpp::Elf_Xword flags)
1355     : Output_section(name, type,
1356                      (type == elfcpp::SHT_ARM_EXIDX
1357                       ? flags | elfcpp::SHF_LINK_ORDER
1358                       : flags))
1359   {
1360     if (type == elfcpp::SHT_ARM_EXIDX)
1361       this->set_always_keeps_input_sections();
1362   }
1363
1364   ~Arm_output_section()
1365   { }
1366
1367   // Group input sections for stub generation.
1368   void
1369   group_sections(section_size_type, bool, Target_arm<big_endian>*, const Task*);
1370
1371   // Downcast a base pointer to an Arm_output_section pointer.  This is
1372   // not type-safe but we only use Arm_output_section not the base class.
1373   static Arm_output_section<big_endian>*
1374   as_arm_output_section(Output_section* os)
1375   { return static_cast<Arm_output_section<big_endian>*>(os); }
1376
1377   // Append all input text sections in this into LIST.
1378   void
1379   append_text_sections_to_list(Text_section_list* list);
1380
1381   // Fix EXIDX coverage of this EXIDX output section.  SORTED_TEXT_SECTION
1382   // is a list of text input sections sorted in ascending order of their
1383   // output addresses.
1384   void
1385   fix_exidx_coverage(Layout* layout,
1386                      const Text_section_list& sorted_text_section,
1387                      Symbol_table* symtab,
1388                      bool merge_exidx_entries,
1389                      const Task* task);
1390
1391   // Link an EXIDX section into its corresponding text section.
1392   void
1393   set_exidx_section_link();
1394
1395  private:
1396   // For convenience.
1397   typedef Output_section::Input_section Input_section;
1398   typedef Output_section::Input_section_list Input_section_list;
1399
1400   // Create a stub group.
1401   void create_stub_group(Input_section_list::const_iterator,
1402                          Input_section_list::const_iterator,
1403                          Input_section_list::const_iterator,
1404                          Target_arm<big_endian>*,
1405                          std::vector<Output_relaxed_input_section*>*,
1406                          const Task* task);
1407 };
1408
1409 // Arm_exidx_input_section class.  This represents an EXIDX input section.
1410
1411 class Arm_exidx_input_section
1412 {
1413  public:
1414   static const section_offset_type invalid_offset =
1415     static_cast<section_offset_type>(-1);
1416
1417   Arm_exidx_input_section(Relobj* relobj, unsigned int shndx,
1418                           unsigned int link, uint32_t size,
1419                           uint32_t addralign, uint32_t text_size)
1420     : relobj_(relobj), shndx_(shndx), link_(link), size_(size),
1421       addralign_(addralign), text_size_(text_size), has_errors_(false)
1422   { }
1423
1424   ~Arm_exidx_input_section()
1425   { }
1426
1427   // Accessors:  This is a read-only class.
1428
1429   // Return the object containing this EXIDX input section.
1430   Relobj*
1431   relobj() const
1432   { return this->relobj_; }
1433
1434   // Return the section index of this EXIDX input section.
1435   unsigned int
1436   shndx() const
1437   { return this->shndx_; }
1438
1439   // Return the section index of linked text section in the same object.
1440   unsigned int
1441   link() const
1442   { return this->link_; }
1443
1444   // Return size of the EXIDX input section.
1445   uint32_t
1446   size() const
1447   { return this->size_; }
1448
1449   // Return address alignment of EXIDX input section.
1450   uint32_t
1451   addralign() const
1452   { return this->addralign_; }
1453
1454   // Return size of the associated text input section.
1455   uint32_t
1456   text_size() const
1457   { return this->text_size_; }
1458
1459   // Whether there are any errors in the EXIDX input section.
1460   bool
1461   has_errors() const
1462   { return this->has_errors_; }
1463
1464   // Set has-errors flag.
1465   void
1466   set_has_errors()
1467   { this->has_errors_ = true; }
1468
1469  private:
1470   // Object containing this.
1471   Relobj* relobj_;
1472   // Section index of this.
1473   unsigned int shndx_;
1474   // text section linked to this in the same object.
1475   unsigned int link_;
1476   // Size of this.  For ARM 32-bit is sufficient.
1477   uint32_t size_;
1478   // Address alignment of this.  For ARM 32-bit is sufficient.
1479   uint32_t addralign_;
1480   // Size of associated text section.
1481   uint32_t text_size_;
1482   // Whether this has any errors.
1483   bool has_errors_;
1484 };
1485
1486 // Arm_relobj class.
1487
1488 template<bool big_endian>
1489 class Arm_relobj : public Sized_relobj_file<32, big_endian>
1490 {
1491  public:
1492   static const Arm_address invalid_address = static_cast<Arm_address>(-1);
1493
1494   Arm_relobj(const std::string& name, Input_file* input_file, off_t offset,
1495              const typename elfcpp::Ehdr<32, big_endian>& ehdr)
1496     : Sized_relobj_file<32, big_endian>(name, input_file, offset, ehdr),
1497       stub_tables_(), local_symbol_is_thumb_function_(),
1498       attributes_section_data_(NULL), mapping_symbols_info_(),
1499       section_has_cortex_a8_workaround_(NULL), exidx_section_map_(),
1500       output_local_symbol_count_needs_update_(false),
1501       merge_flags_and_attributes_(true)
1502   { }
1503
1504   ~Arm_relobj()
1505   { delete this->attributes_section_data_; }
1506
1507   // Return the stub table of the SHNDX-th section if there is one.
1508   Stub_table<big_endian>*
1509   stub_table(unsigned int shndx) const
1510   {
1511     gold_assert(shndx < this->stub_tables_.size());
1512     return this->stub_tables_[shndx];
1513   }
1514
1515   // Set STUB_TABLE to be the stub_table of the SHNDX-th section.
1516   void
1517   set_stub_table(unsigned int shndx, Stub_table<big_endian>* stub_table)
1518   {
1519     gold_assert(shndx < this->stub_tables_.size());
1520     this->stub_tables_[shndx] = stub_table;
1521   }
1522
1523   // Whether a local symbol is a THUMB function.  R_SYM is the symbol table
1524   // index.  This is only valid after do_count_local_symbol is called.
1525   bool
1526   local_symbol_is_thumb_function(unsigned int r_sym) const
1527   {
1528     gold_assert(r_sym < this->local_symbol_is_thumb_function_.size());
1529     return this->local_symbol_is_thumb_function_[r_sym];
1530   }
1531
1532   // Scan all relocation sections for stub generation.
1533   void
1534   scan_sections_for_stubs(Target_arm<big_endian>*, const Symbol_table*,
1535                           const Layout*);
1536
1537   // Convert regular input section with index SHNDX to a relaxed section.
1538   void
1539   convert_input_section_to_relaxed_section(unsigned shndx)
1540   {
1541     // The stubs have relocations and we need to process them after writing
1542     // out the stubs.  So relocation now must follow section write.
1543     this->set_section_offset(shndx, -1ULL);
1544     this->set_relocs_must_follow_section_writes();
1545   }
1546
1547   // Downcast a base pointer to an Arm_relobj pointer.  This is
1548   // not type-safe but we only use Arm_relobj not the base class.
1549   static Arm_relobj<big_endian>*
1550   as_arm_relobj(Relobj* relobj)
1551   { return static_cast<Arm_relobj<big_endian>*>(relobj); }
1552
1553   // Processor-specific flags in ELF file header.  This is valid only after
1554   // reading symbols.
1555   elfcpp::Elf_Word
1556   processor_specific_flags() const
1557   { return this->processor_specific_flags_; }
1558
1559   // Attribute section data  This is the contents of the .ARM.attribute section
1560   // if there is one.
1561   const Attributes_section_data*
1562   attributes_section_data() const
1563   { return this->attributes_section_data_; }
1564
1565   // Mapping symbol location.
1566   typedef std::pair<unsigned int, Arm_address> Mapping_symbol_position;
1567
1568   // Functor for STL container.
1569   struct Mapping_symbol_position_less
1570   {
1571     bool
1572     operator()(const Mapping_symbol_position& p1,
1573                const Mapping_symbol_position& p2) const
1574     {
1575       return (p1.first < p2.first
1576               || (p1.first == p2.first && p1.second < p2.second));
1577     }
1578   };
1579
1580   // We only care about the first character of a mapping symbol, so
1581   // we only store that instead of the whole symbol name.
1582   typedef std::map<Mapping_symbol_position, char,
1583                    Mapping_symbol_position_less> Mapping_symbols_info;
1584
1585   // Whether a section contains any Cortex-A8 workaround.
1586   bool
1587   section_has_cortex_a8_workaround(unsigned int shndx) const
1588   {
1589     return (this->section_has_cortex_a8_workaround_ != NULL
1590             && (*this->section_has_cortex_a8_workaround_)[shndx]);
1591   }
1592
1593   // Mark a section that has Cortex-A8 workaround.
1594   void
1595   mark_section_for_cortex_a8_workaround(unsigned int shndx)
1596   {
1597     if (this->section_has_cortex_a8_workaround_ == NULL)
1598       this->section_has_cortex_a8_workaround_ =
1599         new std::vector<bool>(this->shnum(), false);
1600     (*this->section_has_cortex_a8_workaround_)[shndx] = true;
1601   }
1602
1603   // Return the EXIDX section of an text section with index SHNDX or NULL
1604   // if the text section has no associated EXIDX section.
1605   const Arm_exidx_input_section*
1606   exidx_input_section_by_link(unsigned int shndx) const
1607   {
1608     Exidx_section_map::const_iterator p = this->exidx_section_map_.find(shndx);
1609     return ((p != this->exidx_section_map_.end()
1610              && p->second->link() == shndx)
1611             ? p->second
1612             : NULL);
1613   }
1614
1615   // Return the EXIDX section with index SHNDX or NULL if there is none.
1616   const Arm_exidx_input_section*
1617   exidx_input_section_by_shndx(unsigned shndx) const
1618   {
1619     Exidx_section_map::const_iterator p = this->exidx_section_map_.find(shndx);
1620     return ((p != this->exidx_section_map_.end()
1621              && p->second->shndx() == shndx)
1622             ? p->second
1623             : NULL);
1624   }
1625
1626   // Whether output local symbol count needs updating.
1627   bool
1628   output_local_symbol_count_needs_update() const
1629   { return this->output_local_symbol_count_needs_update_; }
1630
1631   // Set output_local_symbol_count_needs_update flag to be true.
1632   void
1633   set_output_local_symbol_count_needs_update()
1634   { this->output_local_symbol_count_needs_update_ = true; }
1635
1636   // Update output local symbol count at the end of relaxation.
1637   void
1638   update_output_local_symbol_count();
1639
1640   // Whether we want to merge processor-specific flags and attributes.
1641   bool
1642   merge_flags_and_attributes() const
1643   { return this->merge_flags_and_attributes_; }
1644
1645   // Export list of EXIDX section indices.
1646   void
1647   get_exidx_shndx_list(std::vector<unsigned int>* list) const
1648   {
1649     list->clear();
1650     for (Exidx_section_map::const_iterator p = this->exidx_section_map_.begin();
1651          p != this->exidx_section_map_.end();
1652          ++p)
1653       {
1654         if (p->second->shndx() == p->first)
1655           list->push_back(p->first);
1656       }
1657     // Sort list to make result independent of implementation of map.
1658     std::sort(list->begin(), list->end());
1659   }
1660
1661  protected:
1662   // Post constructor setup.
1663   void
1664   do_setup()
1665   {
1666     // Call parent's setup method.
1667     Sized_relobj_file<32, big_endian>::do_setup();
1668
1669     // Initialize look-up tables.
1670     Stub_table_list empty_stub_table_list(this->shnum(), NULL);
1671     this->stub_tables_.swap(empty_stub_table_list);
1672   }
1673
1674   // Count the local symbols.
1675   void
1676   do_count_local_symbols(Stringpool_template<char>*,
1677                          Stringpool_template<char>*);
1678
1679   void
1680   do_relocate_sections(
1681       const Symbol_table* symtab, const Layout* layout,
1682       const unsigned char* pshdrs, Output_file* of,
1683       typename Sized_relobj_file<32, big_endian>::Views* pivews);
1684
1685   // Read the symbol information.
1686   void
1687   do_read_symbols(Read_symbols_data* sd);
1688
1689   // Process relocs for garbage collection.
1690   void
1691   do_gc_process_relocs(Symbol_table*, Layout*, Read_relocs_data*);
1692
1693  private:
1694
1695   // Whether a section needs to be scanned for relocation stubs.
1696   bool
1697   section_needs_reloc_stub_scanning(const elfcpp::Shdr<32, big_endian>&,
1698                                     const Relobj::Output_sections&,
1699                                     const Symbol_table*, const unsigned char*);
1700
1701   // Whether a section is a scannable text section.
1702   bool
1703   section_is_scannable(const elfcpp::Shdr<32, big_endian>&, unsigned int,
1704                        const Output_section*, const Symbol_table*);
1705
1706   // Whether a section needs to be scanned for the Cortex-A8 erratum.
1707   bool
1708   section_needs_cortex_a8_stub_scanning(const elfcpp::Shdr<32, big_endian>&,
1709                                         unsigned int, Output_section*,
1710                                         const Symbol_table*);
1711
1712   // Scan a section for the Cortex-A8 erratum.
1713   void
1714   scan_section_for_cortex_a8_erratum(const elfcpp::Shdr<32, big_endian>&,
1715                                      unsigned int, Output_section*,
1716                                      Target_arm<big_endian>*);
1717
1718   // Find the linked text section of an EXIDX section by looking at the
1719   // first relocation of the EXIDX section.  PSHDR points to the section
1720   // headers of a relocation section and PSYMS points to the local symbols.
1721   // PSHNDX points to a location storing the text section index if found.
1722   // Return whether we can find the linked section.
1723   bool
1724   find_linked_text_section(const unsigned char* pshdr,
1725                            const unsigned char* psyms, unsigned int* pshndx);
1726
1727   //
1728   // Make a new Arm_exidx_input_section object for EXIDX section with
1729   // index SHNDX and section header SHDR.  TEXT_SHNDX is the section
1730   // index of the linked text section.
1731   void
1732   make_exidx_input_section(unsigned int shndx,
1733                            const elfcpp::Shdr<32, big_endian>& shdr,
1734                            unsigned int text_shndx,
1735                            const elfcpp::Shdr<32, big_endian>& text_shdr);
1736
1737   // Return the output address of either a plain input section or a
1738   // relaxed input section.  SHNDX is the section index.
1739   Arm_address
1740   simple_input_section_output_address(unsigned int, Output_section*);
1741
1742   typedef std::vector<Stub_table<big_endian>*> Stub_table_list;
1743   typedef Unordered_map<unsigned int, const Arm_exidx_input_section*>
1744     Exidx_section_map;
1745
1746   // List of stub tables.
1747   Stub_table_list stub_tables_;
1748   // Bit vector to tell if a local symbol is a thumb function or not.
1749   // This is only valid after do_count_local_symbol is called.
1750   std::vector<bool> local_symbol_is_thumb_function_;
1751   // processor-specific flags in ELF file header.
1752   elfcpp::Elf_Word processor_specific_flags_;
1753   // Object attributes if there is an .ARM.attributes section or NULL.
1754   Attributes_section_data* attributes_section_data_;
1755   // Mapping symbols information.
1756   Mapping_symbols_info mapping_symbols_info_;
1757   // Bitmap to indicate sections with Cortex-A8 workaround or NULL.
1758   std::vector<bool>* section_has_cortex_a8_workaround_;
1759   // Map a text section to its associated .ARM.exidx section, if there is one.
1760   Exidx_section_map exidx_section_map_;
1761   // Whether output local symbol count needs updating.
1762   bool output_local_symbol_count_needs_update_;
1763   // Whether we merge processor flags and attributes of this object to
1764   // output.
1765   bool merge_flags_and_attributes_;
1766 };
1767
1768 // Arm_dynobj class.
1769
1770 template<bool big_endian>
1771 class Arm_dynobj : public Sized_dynobj<32, big_endian>
1772 {
1773  public:
1774   Arm_dynobj(const std::string& name, Input_file* input_file, off_t offset,
1775              const elfcpp::Ehdr<32, big_endian>& ehdr)
1776     : Sized_dynobj<32, big_endian>(name, input_file, offset, ehdr),
1777       processor_specific_flags_(0), attributes_section_data_(NULL)
1778   { }
1779
1780   ~Arm_dynobj()
1781   { delete this->attributes_section_data_; }
1782
1783   // Downcast a base pointer to an Arm_relobj pointer.  This is
1784   // not type-safe but we only use Arm_relobj not the base class.
1785   static Arm_dynobj<big_endian>*
1786   as_arm_dynobj(Dynobj* dynobj)
1787   { return static_cast<Arm_dynobj<big_endian>*>(dynobj); }
1788
1789   // Processor-specific flags in ELF file header.  This is valid only after
1790   // reading symbols.
1791   elfcpp::Elf_Word
1792   processor_specific_flags() const
1793   { return this->processor_specific_flags_; }
1794
1795   // Attributes section data.
1796   const Attributes_section_data*
1797   attributes_section_data() const
1798   { return this->attributes_section_data_; }
1799
1800  protected:
1801   // Read the symbol information.
1802   void
1803   do_read_symbols(Read_symbols_data* sd);
1804
1805  private:
1806   // processor-specific flags in ELF file header.
1807   elfcpp::Elf_Word processor_specific_flags_;
1808   // Object attributes if there is an .ARM.attributes section or NULL.
1809   Attributes_section_data* attributes_section_data_;
1810 };
1811
1812 // Functor to read reloc addends during stub generation.
1813
1814 template<int sh_type, bool big_endian>
1815 struct Stub_addend_reader
1816 {
1817   // Return the addend for a relocation of a particular type.  Depending
1818   // on whether this is a REL or RELA relocation, read the addend from a
1819   // view or from a Reloc object.
1820   elfcpp::Elf_types<32>::Elf_Swxword
1821   operator()(
1822     unsigned int /* r_type */,
1823     const unsigned char* /* view */,
1824     const typename Reloc_types<sh_type,
1825                                32, big_endian>::Reloc& /* reloc */) const;
1826 };
1827
1828 // Specialized Stub_addend_reader for SHT_REL type relocation sections.
1829
1830 template<bool big_endian>
1831 struct Stub_addend_reader<elfcpp::SHT_REL, big_endian>
1832 {
1833   elfcpp::Elf_types<32>::Elf_Swxword
1834   operator()(
1835     unsigned int,
1836     const unsigned char*,
1837     const typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc&) const;
1838 };
1839
1840 // Specialized Stub_addend_reader for RELA type relocation sections.
1841 // We currently do not handle RELA type relocation sections but it is trivial
1842 // to implement the addend reader.  This is provided for completeness and to
1843 // make it easier to add support for RELA relocation sections in the future.
1844
1845 template<bool big_endian>
1846 struct Stub_addend_reader<elfcpp::SHT_RELA, big_endian>
1847 {
1848   elfcpp::Elf_types<32>::Elf_Swxword
1849   operator()(
1850     unsigned int,
1851     const unsigned char*,
1852     const typename Reloc_types<elfcpp::SHT_RELA, 32,
1853                                big_endian>::Reloc& reloc) const
1854   { return reloc.get_r_addend(); }
1855 };
1856
1857 // Cortex_a8_reloc class.  We keep record of relocation that may need
1858 // the Cortex-A8 erratum workaround.
1859
1860 class Cortex_a8_reloc
1861 {
1862  public:
1863   Cortex_a8_reloc(Reloc_stub* reloc_stub, unsigned r_type,
1864                   Arm_address destination)
1865     : reloc_stub_(reloc_stub), r_type_(r_type), destination_(destination)
1866   { }
1867
1868   ~Cortex_a8_reloc()
1869   { }
1870
1871   // Accessors:  This is a read-only class.
1872
1873   // Return the relocation stub associated with this relocation if there is
1874   // one.
1875   const Reloc_stub*
1876   reloc_stub() const
1877   { return this->reloc_stub_; }
1878
1879   // Return the relocation type.
1880   unsigned int
1881   r_type() const
1882   { return this->r_type_; }
1883
1884   // Return the destination address of the relocation.  LSB stores the THUMB
1885   // bit.
1886   Arm_address
1887   destination() const
1888   { return this->destination_; }
1889
1890  private:
1891   // Associated relocation stub if there is one, or NULL.
1892   const Reloc_stub* reloc_stub_;
1893   // Relocation type.
1894   unsigned int r_type_;
1895   // Destination address of this relocation.  LSB is used to distinguish
1896   // ARM/THUMB mode.
1897   Arm_address destination_;
1898 };
1899
1900 // Arm_output_data_got class.  We derive this from Output_data_got to add
1901 // extra methods to handle TLS relocations in a static link.
1902
1903 template<bool big_endian>
1904 class Arm_output_data_got : public Output_data_got<32, big_endian>
1905 {
1906  public:
1907   Arm_output_data_got(Symbol_table* symtab, Layout* layout)
1908     : Output_data_got<32, big_endian>(), symbol_table_(symtab), layout_(layout)
1909   { }
1910
1911   // Add a static entry for the GOT entry at OFFSET.  GSYM is a global
1912   // symbol and R_TYPE is the code of a dynamic relocation that needs to be
1913   // applied in a static link.
1914   void
1915   add_static_reloc(unsigned int got_offset, unsigned int r_type, Symbol* gsym)
1916   { this->static_relocs_.push_back(Static_reloc(got_offset, r_type, gsym)); }
1917
1918   // Add a static reloc for the GOT entry at OFFSET.  RELOBJ is an object
1919   // defining a local symbol with INDEX.  R_TYPE is the code of a dynamic
1920   // relocation that needs to be applied in a static link.
1921   void
1922   add_static_reloc(unsigned int got_offset, unsigned int r_type,
1923                    Sized_relobj_file<32, big_endian>* relobj,
1924                    unsigned int index)
1925   {
1926     this->static_relocs_.push_back(Static_reloc(got_offset, r_type, relobj,
1927                                                 index));
1928   }
1929
1930   // Add a GOT pair for R_ARM_TLS_GD32.  The creates a pair of GOT entries.
1931   // The first one is initialized to be 1, which is the module index for
1932   // the main executable and the second one 0.  A reloc of the type
1933   // R_ARM_TLS_DTPOFF32 will be created for the second GOT entry and will
1934   // be applied by gold.  GSYM is a global symbol.
1935   void
1936   add_tls_gd32_with_static_reloc(unsigned int got_type, Symbol* gsym);
1937
1938   // Same as the above but for a local symbol in OBJECT with INDEX.
1939   void
1940   add_tls_gd32_with_static_reloc(unsigned int got_type,
1941                                  Sized_relobj_file<32, big_endian>* object,
1942                                  unsigned int index);
1943
1944  protected:
1945   // Write out the GOT table.
1946   void
1947   do_write(Output_file*);
1948
1949  private:
1950   // This class represent dynamic relocations that need to be applied by
1951   // gold because we are using TLS relocations in a static link.
1952   class Static_reloc
1953   {
1954    public:
1955     Static_reloc(unsigned int got_offset, unsigned int r_type, Symbol* gsym)
1956       : got_offset_(got_offset), r_type_(r_type), symbol_is_global_(true)
1957     { this->u_.global.symbol = gsym; }
1958
1959     Static_reloc(unsigned int got_offset, unsigned int r_type,
1960           Sized_relobj_file<32, big_endian>* relobj, unsigned int index)
1961       : got_offset_(got_offset), r_type_(r_type), symbol_is_global_(false)
1962     {
1963       this->u_.local.relobj = relobj;
1964       this->u_.local.index = index;
1965     }
1966
1967     // Return the GOT offset.
1968     unsigned int
1969     got_offset() const
1970     { return this->got_offset_; }
1971
1972     // Relocation type.
1973     unsigned int
1974     r_type() const
1975     { return this->r_type_; }
1976
1977     // Whether the symbol is global or not.
1978     bool
1979     symbol_is_global() const
1980     { return this->symbol_is_global_; }
1981
1982     // For a relocation against a global symbol, the global symbol.
1983     Symbol*
1984     symbol() const
1985     {
1986       gold_assert(this->symbol_is_global_);
1987       return this->u_.global.symbol;
1988     }
1989
1990     // For a relocation against a local symbol, the defining object.
1991     Sized_relobj_file<32, big_endian>*
1992     relobj() const
1993     {
1994       gold_assert(!this->symbol_is_global_);
1995       return this->u_.local.relobj;
1996     }
1997
1998     // For a relocation against a local symbol, the local symbol index.
1999     unsigned int
2000     index() const
2001     {
2002       gold_assert(!this->symbol_is_global_);
2003       return this->u_.local.index;
2004     }
2005
2006    private:
2007     // GOT offset of the entry to which this relocation is applied.
2008     unsigned int got_offset_;
2009     // Type of relocation.
2010     unsigned int r_type_;
2011     // Whether this relocation is against a global symbol.
2012     bool symbol_is_global_;
2013     // A global or local symbol.
2014     union
2015     {
2016       struct
2017       {
2018         // For a global symbol, the symbol itself.
2019         Symbol* symbol;
2020       } global;
2021       struct
2022       {
2023         // For a local symbol, the object defining object.
2024         Sized_relobj_file<32, big_endian>* relobj;
2025         // For a local symbol, the symbol index.
2026         unsigned int index;
2027       } local;
2028     } u_;
2029   };
2030
2031   // Symbol table of the output object.
2032   Symbol_table* symbol_table_;
2033   // Layout of the output object.
2034   Layout* layout_;
2035   // Static relocs to be applied to the GOT.
2036   std::vector<Static_reloc> static_relocs_;
2037 };
2038
2039 // The ARM target has many relocation types with odd-sizes or noncontiguous
2040 // bits.  The default handling of relocatable relocation cannot process these
2041 // relocations.  So we have to extend the default code.
2042
2043 template<bool big_endian, typename Classify_reloc>
2044 class Arm_scan_relocatable_relocs :
2045   public Default_scan_relocatable_relocs<Classify_reloc>
2046 {
2047  public:
2048   // Return the strategy to use for a local symbol which is a section
2049   // symbol, given the relocation type.
2050   inline Relocatable_relocs::Reloc_strategy
2051   local_section_strategy(unsigned int r_type, Relobj*)
2052   {
2053     if (Classify_reloc::sh_type == elfcpp::SHT_RELA)
2054       return Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_RELA;
2055     else
2056       {
2057         if (r_type == elfcpp::R_ARM_TARGET1
2058             || r_type == elfcpp::R_ARM_TARGET2)
2059           {
2060             const Target_arm<big_endian>* arm_target =
2061               Target_arm<big_endian>::default_target();
2062             r_type = arm_target->get_real_reloc_type(r_type);
2063           }
2064
2065         switch(r_type)
2066           {
2067           // Relocations that write nothing.  These exclude R_ARM_TARGET1
2068           // and R_ARM_TARGET2.
2069           case elfcpp::R_ARM_NONE:
2070           case elfcpp::R_ARM_V4BX:
2071           case elfcpp::R_ARM_TLS_GOTDESC:
2072           case elfcpp::R_ARM_TLS_CALL:
2073           case elfcpp::R_ARM_TLS_DESCSEQ:
2074           case elfcpp::R_ARM_THM_TLS_CALL:
2075           case elfcpp::R_ARM_GOTRELAX:
2076           case elfcpp::R_ARM_GNU_VTENTRY:
2077           case elfcpp::R_ARM_GNU_VTINHERIT:
2078           case elfcpp::R_ARM_THM_TLS_DESCSEQ16:
2079           case elfcpp::R_ARM_THM_TLS_DESCSEQ32:
2080             return Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_0;
2081           // These should have been converted to something else above.
2082           case elfcpp::R_ARM_TARGET1:
2083           case elfcpp::R_ARM_TARGET2:
2084             gold_unreachable();
2085           // Relocations that write full 32 bits and
2086           // have alignment of 1.
2087           case elfcpp::R_ARM_ABS32:
2088           case elfcpp::R_ARM_REL32:
2089           case elfcpp::R_ARM_SBREL32:
2090           case elfcpp::R_ARM_GOTOFF32:
2091           case elfcpp::R_ARM_BASE_PREL:
2092           case elfcpp::R_ARM_GOT_BREL:
2093           case elfcpp::R_ARM_BASE_ABS:
2094           case elfcpp::R_ARM_ABS32_NOI:
2095           case elfcpp::R_ARM_REL32_NOI:
2096           case elfcpp::R_ARM_PLT32_ABS:
2097           case elfcpp::R_ARM_GOT_ABS:
2098           case elfcpp::R_ARM_GOT_PREL:
2099           case elfcpp::R_ARM_TLS_GD32:
2100           case elfcpp::R_ARM_TLS_LDM32:
2101           case elfcpp::R_ARM_TLS_LDO32:
2102           case elfcpp::R_ARM_TLS_IE32:
2103           case elfcpp::R_ARM_TLS_LE32:
2104             return Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_4_UNALIGNED;
2105           default:
2106             // For all other static relocations, return RELOC_SPECIAL.
2107             return Relocatable_relocs::RELOC_SPECIAL;
2108           }
2109       }
2110   }
2111 };
2112
2113 template<bool big_endian>
2114 class Target_arm : public Sized_target<32, big_endian>
2115 {
2116  public:
2117   typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, big_endian>
2118     Reloc_section;
2119
2120   // When were are relocating a stub, we pass this as the relocation number.
2121   static const size_t fake_relnum_for_stubs = static_cast<size_t>(-1);
2122
2123   Target_arm(const Target::Target_info* info = &arm_info)
2124     : Sized_target<32, big_endian>(info),
2125       got_(NULL), plt_(NULL), got_plt_(NULL), got_irelative_(NULL),
2126       rel_dyn_(NULL), rel_irelative_(NULL), copy_relocs_(elfcpp::R_ARM_COPY),
2127       got_mod_index_offset_(-1U), tls_base_symbol_defined_(false),
2128       stub_tables_(), stub_factory_(Stub_factory::get_instance()),
2129       should_force_pic_veneer_(false),
2130       arm_input_section_map_(), attributes_section_data_(NULL),
2131       fix_cortex_a8_(false), cortex_a8_relocs_info_(),
2132       target1_reloc_(elfcpp::R_ARM_ABS32),
2133       // This can be any reloc type but usually is R_ARM_GOT_PREL.
2134       target2_reloc_(elfcpp::R_ARM_GOT_PREL)
2135   { }
2136
2137   // Whether we force PCI branch veneers.
2138   bool
2139   should_force_pic_veneer() const
2140   { return this->should_force_pic_veneer_; }
2141
2142   // Set PIC veneer flag.
2143   void
2144   set_should_force_pic_veneer(bool value)
2145   { this->should_force_pic_veneer_ = value; }
2146
2147   // Whether we use THUMB-2 instructions.
2148   bool
2149   using_thumb2() const
2150   {
2151     Object_attribute* attr =
2152       this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2153     int arch = attr->int_value();
2154     return arch == elfcpp::TAG_CPU_ARCH_V6T2 || arch >= elfcpp::TAG_CPU_ARCH_V7;
2155   }
2156
2157   // Whether we use THUMB/THUMB-2 instructions only.
2158   bool
2159   using_thumb_only() const
2160   {
2161     Object_attribute* attr =
2162       this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2163
2164     if (attr->int_value() == elfcpp::TAG_CPU_ARCH_V6_M
2165         || attr->int_value() == elfcpp::TAG_CPU_ARCH_V6S_M)
2166       return true;
2167     if (attr->int_value() != elfcpp::TAG_CPU_ARCH_V7
2168         && attr->int_value() != elfcpp::TAG_CPU_ARCH_V7E_M)
2169       return false;
2170     attr = this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch_profile);
2171     return attr->int_value() == 'M';
2172   }
2173
2174   // Whether we have an NOP instruction.  If not, use mov r0, r0 instead.
2175   bool
2176   may_use_arm_nop() const
2177   {
2178     Object_attribute* attr =
2179       this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2180     int arch = attr->int_value();
2181     return (arch == elfcpp::TAG_CPU_ARCH_V6T2
2182             || arch == elfcpp::TAG_CPU_ARCH_V6K
2183             || arch == elfcpp::TAG_CPU_ARCH_V7
2184             || arch == elfcpp::TAG_CPU_ARCH_V7E_M);
2185   }
2186
2187   // Whether we have THUMB-2 NOP.W instruction.
2188   bool
2189   may_use_thumb2_nop() const
2190   {
2191     Object_attribute* attr =
2192       this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2193     int arch = attr->int_value();
2194     return (arch == elfcpp::TAG_CPU_ARCH_V6T2
2195             || arch == elfcpp::TAG_CPU_ARCH_V7
2196             || arch == elfcpp::TAG_CPU_ARCH_V7E_M);
2197   }
2198
2199   // Whether we have v4T interworking instructions available.
2200   bool
2201   may_use_v4t_interworking() const
2202   {
2203     Object_attribute* attr =
2204       this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2205     int arch = attr->int_value();
2206     return (arch != elfcpp::TAG_CPU_ARCH_PRE_V4
2207             && arch != elfcpp::TAG_CPU_ARCH_V4);
2208   }
2209
2210   // Whether we have v5T interworking instructions available.
2211   bool
2212   may_use_v5t_interworking() const
2213   {
2214     Object_attribute* attr =
2215       this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2216     int arch = attr->int_value();
2217     if (parameters->options().fix_arm1176())
2218       return (arch == elfcpp::TAG_CPU_ARCH_V6T2
2219               || arch == elfcpp::TAG_CPU_ARCH_V7
2220               || arch == elfcpp::TAG_CPU_ARCH_V6_M
2221               || arch == elfcpp::TAG_CPU_ARCH_V6S_M
2222               || arch == elfcpp::TAG_CPU_ARCH_V7E_M);
2223     else
2224       return (arch != elfcpp::TAG_CPU_ARCH_PRE_V4
2225               && arch != elfcpp::TAG_CPU_ARCH_V4
2226               && arch != elfcpp::TAG_CPU_ARCH_V4T);
2227   }
2228
2229   // Process the relocations to determine unreferenced sections for
2230   // garbage collection.
2231   void
2232   gc_process_relocs(Symbol_table* symtab,
2233                     Layout* layout,
2234                     Sized_relobj_file<32, big_endian>* object,
2235                     unsigned int data_shndx,
2236                     unsigned int sh_type,
2237                     const unsigned char* prelocs,
2238                     size_t reloc_count,
2239                     Output_section* output_section,
2240                     bool needs_special_offset_handling,
2241                     size_t local_symbol_count,
2242                     const unsigned char* plocal_symbols);
2243
2244   // Scan the relocations to look for symbol adjustments.
2245   void
2246   scan_relocs(Symbol_table* symtab,
2247               Layout* layout,
2248               Sized_relobj_file<32, big_endian>* object,
2249               unsigned int data_shndx,
2250               unsigned int sh_type,
2251               const unsigned char* prelocs,
2252               size_t reloc_count,
2253               Output_section* output_section,
2254               bool needs_special_offset_handling,
2255               size_t local_symbol_count,
2256               const unsigned char* plocal_symbols);
2257
2258   // Finalize the sections.
2259   void
2260   do_finalize_sections(Layout*, const Input_objects*, Symbol_table*);
2261
2262   // Return the value to use for a dynamic symbol which requires special
2263   // treatment.
2264   uint64_t
2265   do_dynsym_value(const Symbol*) const;
2266
2267   // Return the plt address for globals. Since we have irelative plt entries,
2268   // address calculation is not as straightforward as plt_address + plt_offset.
2269   uint64_t
2270   do_plt_address_for_global(const Symbol* gsym) const
2271   { return this->plt_section()->address_for_global(gsym); }
2272
2273   // Return the plt address for locals. Since we have irelative plt entries,
2274   // address calculation is not as straightforward as plt_address + plt_offset.
2275   uint64_t
2276   do_plt_address_for_local(const Relobj* relobj, unsigned int symndx) const
2277   { return this->plt_section()->address_for_local(relobj, symndx); }
2278
2279   // Relocate a section.
2280   void
2281   relocate_section(const Relocate_info<32, big_endian>*,
2282                    unsigned int sh_type,
2283                    const unsigned char* prelocs,
2284                    size_t reloc_count,
2285                    Output_section* output_section,
2286                    bool needs_special_offset_handling,
2287                    unsigned char* view,
2288                    Arm_address view_address,
2289                    section_size_type view_size,
2290                    const Reloc_symbol_changes*);
2291
2292   // Scan the relocs during a relocatable link.
2293   void
2294   scan_relocatable_relocs(Symbol_table* symtab,
2295                           Layout* layout,
2296                           Sized_relobj_file<32, big_endian>* object,
2297                           unsigned int data_shndx,
2298                           unsigned int sh_type,
2299                           const unsigned char* prelocs,
2300                           size_t reloc_count,
2301                           Output_section* output_section,
2302                           bool needs_special_offset_handling,
2303                           size_t local_symbol_count,
2304                           const unsigned char* plocal_symbols,
2305                           Relocatable_relocs*);
2306
2307   // Scan the relocs for --emit-relocs.
2308   void
2309   emit_relocs_scan(Symbol_table* symtab,
2310                    Layout* layout,
2311                    Sized_relobj_file<32, big_endian>* object,
2312                    unsigned int data_shndx,
2313                    unsigned int sh_type,
2314                    const unsigned char* prelocs,
2315                    size_t reloc_count,
2316                    Output_section* output_section,
2317                    bool needs_special_offset_handling,
2318                    size_t local_symbol_count,
2319                    const unsigned char* plocal_syms,
2320                    Relocatable_relocs* rr);
2321
2322   // Emit relocations for a section.
2323   void
2324   relocate_relocs(const Relocate_info<32, big_endian>*,
2325                   unsigned int sh_type,
2326                   const unsigned char* prelocs,
2327                   size_t reloc_count,
2328                   Output_section* output_section,
2329                   typename elfcpp::Elf_types<32>::Elf_Off
2330                     offset_in_output_section,
2331                   unsigned char* view,
2332                   Arm_address view_address,
2333                   section_size_type view_size,
2334                   unsigned char* reloc_view,
2335                   section_size_type reloc_view_size);
2336
2337   // Perform target-specific processing in a relocatable link.  This is
2338   // only used if we use the relocation strategy RELOC_SPECIAL.
2339   void
2340   relocate_special_relocatable(const Relocate_info<32, big_endian>* relinfo,
2341                                unsigned int sh_type,
2342                                const unsigned char* preloc_in,
2343                                size_t relnum,
2344                                Output_section* output_section,
2345                                typename elfcpp::Elf_types<32>::Elf_Off
2346                                  offset_in_output_section,
2347                                unsigned char* view,
2348                                typename elfcpp::Elf_types<32>::Elf_Addr
2349                                  view_address,
2350                                section_size_type view_size,
2351                                unsigned char* preloc_out);
2352
2353   // Return whether SYM is defined by the ABI.
2354   bool
2355   do_is_defined_by_abi(const Symbol* sym) const
2356   { return strcmp(sym->name(), "__tls_get_addr") == 0; }
2357
2358   // Return whether there is a GOT section.
2359   bool
2360   has_got_section() const
2361   { return this->got_ != NULL; }
2362
2363   // Return the size of the GOT section.
2364   section_size_type
2365   got_size() const
2366   {
2367     gold_assert(this->got_ != NULL);
2368     return this->got_->data_size();
2369   }
2370
2371   // Return the number of entries in the GOT.
2372   unsigned int
2373   got_entry_count() const
2374   {
2375     if (!this->has_got_section())
2376       return 0;
2377     return this->got_size() / 4;
2378   }
2379
2380   // Return the number of entries in the PLT.
2381   unsigned int
2382   plt_entry_count() const;
2383
2384   // Return the offset of the first non-reserved PLT entry.
2385   unsigned int
2386   first_plt_entry_offset() const;
2387
2388   // Return the size of each PLT entry.
2389   unsigned int
2390   plt_entry_size() const;
2391
2392   // Get the section to use for IRELATIVE relocations, create it if necessary.
2393   Reloc_section*
2394   rel_irelative_section(Layout*);
2395
2396   // Map platform-specific reloc types
2397   unsigned int
2398   get_real_reloc_type(unsigned int r_type) const;
2399
2400   //
2401   // Methods to support stub-generations.
2402   //
2403
2404   // Return the stub factory
2405   const Stub_factory&
2406   stub_factory() const
2407   { return this->stub_factory_; }
2408
2409   // Make a new Arm_input_section object.
2410   Arm_input_section<big_endian>*
2411   new_arm_input_section(Relobj*, unsigned int);
2412
2413   // Find the Arm_input_section object corresponding to the SHNDX-th input
2414   // section of RELOBJ.
2415   Arm_input_section<big_endian>*
2416   find_arm_input_section(Relobj* relobj, unsigned int shndx) const;
2417
2418   // Make a new Stub_table
2419   Stub_table<big_endian>*
2420   new_stub_table(Arm_input_section<big_endian>*);
2421
2422   // Scan a section for stub generation.
2423   void
2424   scan_section_for_stubs(const Relocate_info<32, big_endian>*, unsigned int,
2425                          const unsigned char*, size_t, Output_section*,
2426                          bool, const unsigned char*, Arm_address,
2427                          section_size_type);
2428
2429   // Relocate a stub.
2430   void
2431   relocate_stub(Stub*, const Relocate_info<32, big_endian>*,
2432                 Output_section*, unsigned char*, Arm_address,
2433                 section_size_type);
2434
2435   // Get the default ARM target.
2436   static Target_arm<big_endian>*
2437   default_target()
2438   {
2439     gold_assert(parameters->target().machine_code() == elfcpp::EM_ARM
2440                 && parameters->target().is_big_endian() == big_endian);
2441     return static_cast<Target_arm<big_endian>*>(
2442              parameters->sized_target<32, big_endian>());
2443   }
2444
2445   // Whether NAME belongs to a mapping symbol.
2446   static bool
2447   is_mapping_symbol_name(const char* name)
2448   {
2449     return (name
2450             && name[0] == '$'
2451             && (name[1] == 'a' || name[1] == 't' || name[1] == 'd')
2452             && (name[2] == '\0' || name[2] == '.'));
2453   }
2454
2455   // Whether we work around the Cortex-A8 erratum.
2456   bool
2457   fix_cortex_a8() const
2458   { return this->fix_cortex_a8_; }
2459
2460   // Whether we merge exidx entries in debuginfo.
2461   bool
2462   merge_exidx_entries() const
2463   { return parameters->options().merge_exidx_entries(); }
2464
2465   // Whether we fix R_ARM_V4BX relocation.
2466   // 0 - do not fix
2467   // 1 - replace with MOV instruction (armv4 target)
2468   // 2 - make interworking veneer (>= armv4t targets only)
2469   General_options::Fix_v4bx
2470   fix_v4bx() const
2471   { return parameters->options().fix_v4bx(); }
2472
2473   // Scan a span of THUMB code section for Cortex-A8 erratum.
2474   void
2475   scan_span_for_cortex_a8_erratum(Arm_relobj<big_endian>*, unsigned int,
2476                                   section_size_type, section_size_type,
2477                                   const unsigned char*, Arm_address);
2478
2479   // Apply Cortex-A8 workaround to a branch.
2480   void
2481   apply_cortex_a8_workaround(const Cortex_a8_stub*, Arm_address,
2482                              unsigned char*, Arm_address);
2483
2484  protected:
2485   // Make the PLT-generator object.
2486   Output_data_plt_arm<big_endian>*
2487   make_data_plt(Layout* layout,
2488                 Arm_output_data_got<big_endian>* got,
2489                 Output_data_space* got_plt,
2490                 Output_data_space* got_irelative)
2491   { return this->do_make_data_plt(layout, got, got_plt, got_irelative); }
2492
2493   // Make an ELF object.
2494   Object*
2495   do_make_elf_object(const std::string&, Input_file*, off_t,
2496                      const elfcpp::Ehdr<32, big_endian>& ehdr);
2497
2498   Object*
2499   do_make_elf_object(const std::string&, Input_file*, off_t,
2500                      const elfcpp::Ehdr<32, !big_endian>&)
2501   { gold_unreachable(); }
2502
2503   Object*
2504   do_make_elf_object(const std::string&, Input_file*, off_t,
2505                       const elfcpp::Ehdr<64, false>&)
2506   { gold_unreachable(); }
2507
2508   Object*
2509   do_make_elf_object(const std::string&, Input_file*, off_t,
2510                      const elfcpp::Ehdr<64, true>&)
2511   { gold_unreachable(); }
2512
2513   // Make an output section.
2514   Output_section*
2515   do_make_output_section(const char* name, elfcpp::Elf_Word type,
2516                          elfcpp::Elf_Xword flags)
2517   { return new Arm_output_section<big_endian>(name, type, flags); }
2518
2519   void
2520   do_adjust_elf_header(unsigned char* view, int len);
2521
2522   // We only need to generate stubs, and hence perform relaxation if we are
2523   // not doing relocatable linking.
2524   bool
2525   do_may_relax() const
2526   { return !parameters->options().relocatable(); }
2527
2528   bool
2529   do_relax(int, const Input_objects*, Symbol_table*, Layout*, const Task*);
2530
2531   // Determine whether an object attribute tag takes an integer, a
2532   // string or both.
2533   int
2534   do_attribute_arg_type(int tag) const;
2535
2536   // Reorder tags during output.
2537   int
2538   do_attributes_order(int num) const;
2539
2540   // This is called when the target is selected as the default.
2541   void
2542   do_select_as_default_target()
2543   {
2544     // No locking is required since there should only be one default target.
2545     // We cannot have both the big-endian and little-endian ARM targets
2546     // as the default.
2547     gold_assert(arm_reloc_property_table == NULL);
2548     arm_reloc_property_table = new Arm_reloc_property_table();
2549     if (parameters->options().user_set_target1_rel())
2550       {
2551         // FIXME: This is not strictly compatible with ld, which allows both
2552         // --target1-abs and --target-rel to be given.
2553         if (parameters->options().user_set_target1_abs())
2554           gold_error(_("Cannot use both --target1-abs and --target1-rel."));
2555         else
2556           this->target1_reloc_ = elfcpp::R_ARM_REL32;
2557       }
2558     // We don't need to handle --target1-abs because target1_reloc_ is set
2559     // to elfcpp::R_ARM_ABS32 in the member initializer list.
2560
2561     if (parameters->options().user_set_target2())
2562       {
2563         const char* target2 = parameters->options().target2();
2564         if (strcmp(target2, "rel") == 0)
2565           this->target2_reloc_ = elfcpp::R_ARM_REL32;
2566         else if (strcmp(target2, "abs") == 0)
2567           this->target2_reloc_ = elfcpp::R_ARM_ABS32;
2568         else if (strcmp(target2, "got-rel") == 0)
2569           this->target2_reloc_ = elfcpp::R_ARM_GOT_PREL;
2570         else
2571           gold_unreachable();
2572       }
2573   }
2574
2575   // Virtual function which is set to return true by a target if
2576   // it can use relocation types to determine if a function's
2577   // pointer is taken.
2578   virtual bool
2579   do_can_check_for_function_pointers() const
2580   { return true; }
2581
2582   // Whether a section called SECTION_NAME may have function pointers to
2583   // sections not eligible for safe ICF folding.
2584   virtual bool
2585   do_section_may_have_icf_unsafe_pointers(const char* section_name) const
2586   {
2587     return (!is_prefix_of(".ARM.exidx", section_name)
2588             && !is_prefix_of(".ARM.extab", section_name)
2589             && Target::do_section_may_have_icf_unsafe_pointers(section_name));
2590   }
2591
2592   virtual void
2593   do_define_standard_symbols(Symbol_table*, Layout*);
2594
2595   virtual Output_data_plt_arm<big_endian>*
2596   do_make_data_plt(Layout* layout,
2597                    Arm_output_data_got<big_endian>* got,
2598                    Output_data_space* got_plt,
2599                    Output_data_space* got_irelative)
2600   {
2601     gold_assert(got_plt != NULL && got_irelative != NULL);
2602     if (parameters->options().long_plt())
2603       return new Output_data_plt_arm_long<big_endian>(
2604         layout, got, got_plt, got_irelative);
2605     else
2606       return new Output_data_plt_arm_short<big_endian>(
2607         layout, got, got_plt, got_irelative);
2608   }
2609
2610  private:
2611   // The class which scans relocations.
2612   class Scan
2613   {
2614    public:
2615     Scan()
2616       : issued_non_pic_error_(false)
2617     { }
2618
2619     static inline int
2620     get_reference_flags(unsigned int r_type);
2621
2622     inline void
2623     local(Symbol_table* symtab, Layout* layout, Target_arm* target,
2624           Sized_relobj_file<32, big_endian>* object,
2625           unsigned int data_shndx,
2626           Output_section* output_section,
2627           const elfcpp::Rel<32, big_endian>& reloc, unsigned int r_type,
2628           const elfcpp::Sym<32, big_endian>& lsym,
2629           bool is_discarded);
2630
2631     inline void
2632     global(Symbol_table* symtab, Layout* layout, Target_arm* target,
2633            Sized_relobj_file<32, big_endian>* object,
2634            unsigned int data_shndx,
2635            Output_section* output_section,
2636            const elfcpp::Rel<32, big_endian>& reloc, unsigned int r_type,
2637            Symbol* gsym);
2638
2639     inline bool
2640     local_reloc_may_be_function_pointer(Symbol_table* , Layout* , Target_arm* ,
2641                                         Sized_relobj_file<32, big_endian>* ,
2642                                         unsigned int ,
2643                                         Output_section* ,
2644                                         const elfcpp::Rel<32, big_endian>& ,
2645                                         unsigned int ,
2646                                         const elfcpp::Sym<32, big_endian>&);
2647
2648     inline bool
2649     global_reloc_may_be_function_pointer(Symbol_table* , Layout* , Target_arm* ,
2650                                          Sized_relobj_file<32, big_endian>* ,
2651                                          unsigned int ,
2652                                          Output_section* ,
2653                                          const elfcpp::Rel<32, big_endian>& ,
2654                                          unsigned int , Symbol*);
2655
2656    private:
2657     static void
2658     unsupported_reloc_local(Sized_relobj_file<32, big_endian>*,
2659                             unsigned int r_type);
2660
2661     static void
2662     unsupported_reloc_global(Sized_relobj_file<32, big_endian>*,
2663                              unsigned int r_type, Symbol*);
2664
2665     void
2666     check_non_pic(Relobj*, unsigned int r_type);
2667
2668     // Almost identical to Symbol::needs_plt_entry except that it also
2669     // handles STT_ARM_TFUNC.
2670     static bool
2671     symbol_needs_plt_entry(const Symbol* sym)
2672     {
2673       // An undefined symbol from an executable does not need a PLT entry.
2674       if (sym->is_undefined() && !parameters->options().shared())
2675         return false;
2676
2677       if (sym->type() == elfcpp::STT_GNU_IFUNC)
2678         return true;
2679
2680       return (!parameters->doing_static_link()
2681               && (sym->type() == elfcpp::STT_FUNC
2682                   || sym->type() == elfcpp::STT_ARM_TFUNC)
2683               && (sym->is_from_dynobj()
2684                   || sym->is_undefined()
2685                   || sym->is_preemptible()));
2686     }
2687
2688     inline bool
2689     possible_function_pointer_reloc(unsigned int r_type);
2690
2691     // Whether a plt entry is needed for ifunc.
2692     bool
2693     reloc_needs_plt_for_ifunc(Sized_relobj_file<32, big_endian>*,
2694                               unsigned int r_type);
2695
2696     // Whether we have issued an error about a non-PIC compilation.
2697     bool issued_non_pic_error_;
2698   };
2699
2700   // The class which implements relocation.
2701   class Relocate
2702   {
2703    public:
2704     Relocate()
2705     { }
2706
2707     ~Relocate()
2708     { }
2709
2710     // Return whether the static relocation needs to be applied.
2711     inline bool
2712     should_apply_static_reloc(const Sized_symbol<32>* gsym,
2713                               unsigned int r_type,
2714                               bool is_32bit,
2715                               Output_section* output_section);
2716
2717     // Do a relocation.  Return false if the caller should not issue
2718     // any warnings about this relocation.
2719     inline bool
2720     relocate(const Relocate_info<32, big_endian>*, unsigned int,
2721              Target_arm*, Output_section*, size_t, const unsigned char*,
2722              const Sized_symbol<32>*, const Symbol_value<32>*,
2723              unsigned char*, Arm_address, section_size_type);
2724
2725     // Return whether we want to pass flag NON_PIC_REF for this
2726     // reloc.  This means the relocation type accesses a symbol not via
2727     // GOT or PLT.
2728     static inline bool
2729     reloc_is_non_pic(unsigned int r_type)
2730     {
2731       switch (r_type)
2732         {
2733         // These relocation types reference GOT or PLT entries explicitly.
2734         case elfcpp::R_ARM_GOT_BREL:
2735         case elfcpp::R_ARM_GOT_ABS:
2736         case elfcpp::R_ARM_GOT_PREL:
2737         case elfcpp::R_ARM_GOT_BREL12:
2738         case elfcpp::R_ARM_PLT32_ABS:
2739         case elfcpp::R_ARM_TLS_GD32:
2740         case elfcpp::R_ARM_TLS_LDM32:
2741         case elfcpp::R_ARM_TLS_IE32:
2742         case elfcpp::R_ARM_TLS_IE12GP:
2743
2744         // These relocate types may use PLT entries.
2745         case elfcpp::R_ARM_CALL:
2746         case elfcpp::R_ARM_THM_CALL:
2747         case elfcpp::R_ARM_JUMP24:
2748         case elfcpp::R_ARM_THM_JUMP24:
2749         case elfcpp::R_ARM_THM_JUMP19:
2750         case elfcpp::R_ARM_PLT32:
2751         case elfcpp::R_ARM_THM_XPC22:
2752         case elfcpp::R_ARM_PREL31:
2753         case elfcpp::R_ARM_SBREL31:
2754           return false;
2755
2756         default:
2757           return true;
2758         }
2759     }
2760
2761    private:
2762     // Do a TLS relocation.
2763     inline typename Arm_relocate_functions<big_endian>::Status
2764     relocate_tls(const Relocate_info<32, big_endian>*, Target_arm<big_endian>*,
2765                  size_t, const elfcpp::Rel<32, big_endian>&, unsigned int,
2766                  const Sized_symbol<32>*, const Symbol_value<32>*,
2767                  unsigned char*, elfcpp::Elf_types<32>::Elf_Addr,
2768                  section_size_type);
2769
2770   };
2771
2772   // A class for inquiring about properties of a relocation,
2773   // used while scanning relocs during a relocatable link and
2774   // garbage collection.
2775   class Classify_reloc :
2776       public gold::Default_classify_reloc<elfcpp::SHT_REL, 32, big_endian>
2777   {
2778    public:
2779     typedef typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc
2780         Reltype;
2781
2782     // Return the explicit addend of the relocation (return 0 for SHT_REL).
2783     static typename elfcpp::Elf_types<32>::Elf_Swxword
2784     get_r_addend(const Reltype*)
2785     { return 0; }
2786
2787     // Return the size of the addend of the relocation (only used for SHT_REL).
2788     static unsigned int
2789     get_size_for_reloc(unsigned int, Relobj*);
2790   };
2791
2792   // Adjust TLS relocation type based on the options and whether this
2793   // is a local symbol.
2794   static tls::Tls_optimization
2795   optimize_tls_reloc(bool is_final, int r_type);
2796
2797   // Get the GOT section, creating it if necessary.
2798   Arm_output_data_got<big_endian>*
2799   got_section(Symbol_table*, Layout*);
2800
2801   // Get the GOT PLT section.
2802   Output_data_space*
2803   got_plt_section() const
2804   {
2805     gold_assert(this->got_plt_ != NULL);
2806     return this->got_plt_;
2807   }
2808
2809   // Create the PLT section.
2810   void
2811   make_plt_section(Symbol_table* symtab, Layout* layout);
2812
2813   // Create a PLT entry for a global symbol.
2814   void
2815   make_plt_entry(Symbol_table*, Layout*, Symbol*);
2816
2817   // Create a PLT entry for a local STT_GNU_IFUNC symbol.
2818   void
2819   make_local_ifunc_plt_entry(Symbol_table*, Layout*,
2820                              Sized_relobj_file<32, big_endian>* relobj,
2821                              unsigned int local_sym_index);
2822
2823   // Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
2824   void
2825   define_tls_base_symbol(Symbol_table*, Layout*);
2826
2827   // Create a GOT entry for the TLS module index.
2828   unsigned int
2829   got_mod_index_entry(Symbol_table* symtab, Layout* layout,
2830                       Sized_relobj_file<32, big_endian>* object);
2831
2832   // Get the PLT section.
2833   const Output_data_plt_arm<big_endian>*
2834   plt_section() const
2835   {
2836     gold_assert(this->plt_ != NULL);
2837     return this->plt_;
2838   }
2839
2840   // Get the dynamic reloc section, creating it if necessary.
2841   Reloc_section*
2842   rel_dyn_section(Layout*);
2843
2844   // Get the section to use for TLS_DESC relocations.
2845   Reloc_section*
2846   rel_tls_desc_section(Layout*) const;
2847
2848   // Return true if the symbol may need a COPY relocation.
2849   // References from an executable object to non-function symbols
2850   // defined in a dynamic object may need a COPY relocation.
2851   bool
2852   may_need_copy_reloc(Symbol* gsym)
2853   {
2854     return (gsym->type() != elfcpp::STT_ARM_TFUNC
2855             && gsym->may_need_copy_reloc());
2856   }
2857
2858   // Add a potential copy relocation.
2859   void
2860   copy_reloc(Symbol_table* symtab, Layout* layout,
2861              Sized_relobj_file<32, big_endian>* object,
2862              unsigned int shndx, Output_section* output_section,
2863              Symbol* sym, const elfcpp::Rel<32, big_endian>& reloc)
2864   {
2865     unsigned int r_type = elfcpp::elf_r_type<32>(reloc.get_r_info());
2866     this->copy_relocs_.copy_reloc(symtab, layout,
2867                                   symtab->get_sized_symbol<32>(sym),
2868                                   object, shndx, output_section,
2869                                   r_type, reloc.get_r_offset(), 0,
2870                                   this->rel_dyn_section(layout));
2871   }
2872
2873   // Whether two EABI versions are compatible.
2874   static bool
2875   are_eabi_versions_compatible(elfcpp::Elf_Word v1, elfcpp::Elf_Word v2);
2876
2877   // Merge processor-specific flags from input object and those in the ELF
2878   // header of the output.
2879   void
2880   merge_processor_specific_flags(const std::string&, elfcpp::Elf_Word);
2881
2882   // Get the secondary compatible architecture.
2883   static int
2884   get_secondary_compatible_arch(const Attributes_section_data*);
2885
2886   // Set the secondary compatible architecture.
2887   static void
2888   set_secondary_compatible_arch(Attributes_section_data*, int);
2889
2890   static int
2891   tag_cpu_arch_combine(const char*, int, int*, int, int);
2892
2893   // Helper to print AEABI enum tag value.
2894   static std::string
2895   aeabi_enum_name(unsigned int);
2896
2897   // Return string value for TAG_CPU_name.
2898   static std::string
2899   tag_cpu_name_value(unsigned int);
2900
2901   // Query attributes object to see if integer divide instructions may be
2902   // present in an object.
2903   static bool
2904   attributes_accept_div(int arch, int profile,
2905                         const Object_attribute* div_attr);
2906
2907   // Query attributes object to see if integer divide instructions are
2908   // forbidden to be in the object.  This is not the inverse of
2909   // attributes_accept_div.
2910   static bool
2911   attributes_forbid_div(const Object_attribute* div_attr);
2912
2913   // Merge object attributes from input object and those in the output.
2914   void
2915   merge_object_attributes(const char*, const Attributes_section_data*);
2916
2917   // Helper to get an AEABI object attribute
2918   Object_attribute*
2919   get_aeabi_object_attribute(int tag) const
2920   {
2921     Attributes_section_data* pasd = this->attributes_section_data_;
2922     gold_assert(pasd != NULL);
2923     Object_attribute* attr =
2924       pasd->get_attribute(Object_attribute::OBJ_ATTR_PROC, tag);
2925     gold_assert(attr != NULL);
2926     return attr;
2927   }
2928
2929   //
2930   // Methods to support stub-generations.
2931   //
2932
2933   // Group input sections for stub generation.
2934   void
2935   group_sections(Layout*, section_size_type, bool, const Task*);
2936
2937   // Scan a relocation for stub generation.
2938   void
2939   scan_reloc_for_stub(const Relocate_info<32, big_endian>*, unsigned int,
2940                       const Sized_symbol<32>*, unsigned int,
2941                       const Symbol_value<32>*,
2942                       elfcpp::Elf_types<32>::Elf_Swxword, Arm_address);
2943
2944   // Scan a relocation section for stub.
2945   template<int sh_type>
2946   void
2947   scan_reloc_section_for_stubs(
2948       const Relocate_info<32, big_endian>* relinfo,
2949       const unsigned char* prelocs,
2950       size_t reloc_count,
2951       Output_section* output_section,
2952       bool needs_special_offset_handling,
2953       const unsigned char* view,
2954       elfcpp::Elf_types<32>::Elf_Addr view_address,
2955       section_size_type);
2956
2957   // Fix .ARM.exidx section coverage.
2958   void
2959   fix_exidx_coverage(Layout*, const Input_objects*,
2960                      Arm_output_section<big_endian>*, Symbol_table*,
2961                      const Task*);
2962
2963   // Functors for STL set.
2964   struct output_section_address_less_than
2965   {
2966     bool
2967     operator()(const Output_section* s1, const Output_section* s2) const
2968     { return s1->address() < s2->address(); }
2969   };
2970
2971   // Information about this specific target which we pass to the
2972   // general Target structure.
2973   static const Target::Target_info arm_info;
2974
2975   // The types of GOT entries needed for this platform.
2976   // These values are exposed to the ABI in an incremental link.
2977   // Do not renumber existing values without changing the version
2978   // number of the .gnu_incremental_inputs section.
2979   enum Got_type
2980   {
2981     GOT_TYPE_STANDARD = 0,      // GOT entry for a regular symbol
2982     GOT_TYPE_TLS_NOFFSET = 1,   // GOT entry for negative TLS offset
2983     GOT_TYPE_TLS_OFFSET = 2,    // GOT entry for positive TLS offset
2984     GOT_TYPE_TLS_PAIR = 3,      // GOT entry for TLS module/offset pair
2985     GOT_TYPE_TLS_DESC = 4       // GOT entry for TLS_DESC pair
2986   };
2987
2988   typedef typename std::vector<Stub_table<big_endian>*> Stub_table_list;
2989
2990   // Map input section to Arm_input_section.
2991   typedef Unordered_map<Section_id,
2992                         Arm_input_section<big_endian>*,
2993                         Section_id_hash>
2994           Arm_input_section_map;
2995
2996   // Map output addresses to relocs for Cortex-A8 erratum.
2997   typedef Unordered_map<Arm_address, const Cortex_a8_reloc*>
2998           Cortex_a8_relocs_info;
2999
3000   // The GOT section.
3001   Arm_output_data_got<big_endian>* got_;
3002   // The PLT section.
3003   Output_data_plt_arm<big_endian>* plt_;
3004   // The GOT PLT section.
3005   Output_data_space* got_plt_;
3006   // The GOT section for IRELATIVE relocations.
3007   Output_data_space* got_irelative_;
3008   // The dynamic reloc section.
3009   Reloc_section* rel_dyn_;
3010   // The section to use for IRELATIVE relocs.
3011   Reloc_section* rel_irelative_;
3012   // Relocs saved to avoid a COPY reloc.
3013   Copy_relocs<elfcpp::SHT_REL, 32, big_endian> copy_relocs_;
3014   // Offset of the GOT entry for the TLS module index.
3015   unsigned int got_mod_index_offset_;
3016   // True if the _TLS_MODULE_BASE_ symbol has been defined.
3017   bool tls_base_symbol_defined_;
3018   // Vector of Stub_tables created.
3019   Stub_table_list stub_tables_;
3020   // Stub factory.
3021   const Stub_factory &stub_factory_;
3022   // Whether we force PIC branch veneers.
3023   bool should_force_pic_veneer_;
3024   // Map for locating Arm_input_sections.
3025   Arm_input_section_map arm_input_section_map_;
3026   // Attributes section data in output.
3027   Attributes_section_data* attributes_section_data_;
3028   // Whether we want to fix code for Cortex-A8 erratum.
3029   bool fix_cortex_a8_;
3030   // Map addresses to relocs for Cortex-A8 erratum.
3031   Cortex_a8_relocs_info cortex_a8_relocs_info_;
3032   // What R_ARM_TARGET1 maps to. It can be R_ARM_REL32 or R_ARM_ABS32.
3033   unsigned int target1_reloc_;
3034   // What R_ARM_TARGET2 maps to. It should be one of R_ARM_REL32, R_ARM_ABS32
3035   // and R_ARM_GOT_PREL.
3036   unsigned int target2_reloc_;
3037 };
3038
3039 template<bool big_endian>
3040 const Target::Target_info Target_arm<big_endian>::arm_info =
3041 {
3042   32,                   // size
3043   big_endian,           // is_big_endian
3044   elfcpp::EM_ARM,       // machine_code
3045   false,                // has_make_symbol
3046   false,                // has_resolve
3047   false,                // has_code_fill
3048   true,                 // is_default_stack_executable
3049   false,                // can_icf_inline_merge_sections
3050   '\0',                 // wrap_char
3051   "/usr/lib/libc.so.1", // dynamic_linker
3052   0x8000,               // default_text_segment_address
3053   0x1000,               // abi_pagesize (overridable by -z max-page-size)
3054   0x1000,               // common_pagesize (overridable by -z common-page-size)
3055   false,                // isolate_execinstr
3056   0,                    // rosegment_gap
3057   elfcpp::SHN_UNDEF,    // small_common_shndx
3058   elfcpp::SHN_UNDEF,    // large_common_shndx
3059   0,                    // small_common_section_flags
3060   0,                    // large_common_section_flags
3061   ".ARM.attributes",    // attributes_section
3062   "aeabi",              // attributes_vendor
3063   "_start",             // entry_symbol_name
3064   32,                   // hash_entry_size
3065   elfcpp::SHT_PROGBITS, // unwind_section_type
3066 };
3067
3068 // Arm relocate functions class
3069 //
3070
3071 template<bool big_endian>
3072 class Arm_relocate_functions : public Relocate_functions<32, big_endian>
3073 {
3074  public:
3075   typedef enum
3076   {
3077     STATUS_OKAY,        // No error during relocation.
3078     STATUS_OVERFLOW,    // Relocation overflow.
3079     STATUS_BAD_RELOC    // Relocation cannot be applied.
3080   } Status;
3081
3082  private:
3083   typedef Relocate_functions<32, big_endian> Base;
3084   typedef Arm_relocate_functions<big_endian> This;
3085
3086   // Encoding of imm16 argument for movt and movw ARM instructions
3087   // from ARM ARM:
3088   //
3089   //     imm16 := imm4 | imm12
3090   //
3091   //  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
3092   // +-------+---------------+-------+-------+-----------------------+
3093   // |       |               |imm4   |       |imm12                  |
3094   // +-------+---------------+-------+-------+-----------------------+
3095
3096   // Extract the relocation addend from VAL based on the ARM
3097   // instruction encoding described above.
3098   static inline typename elfcpp::Swap<32, big_endian>::Valtype
3099   extract_arm_movw_movt_addend(
3100       typename elfcpp::Swap<32, big_endian>::Valtype val)
3101   {
3102     // According to the Elf ABI for ARM Architecture the immediate
3103     // field is sign-extended to form the addend.
3104     return Bits<16>::sign_extend32(((val >> 4) & 0xf000) | (val & 0xfff));
3105   }
3106
3107   // Insert X into VAL based on the ARM instruction encoding described
3108   // above.
3109   static inline typename elfcpp::Swap<32, big_endian>::Valtype
3110   insert_val_arm_movw_movt(
3111       typename elfcpp::Swap<32, big_endian>::Valtype val,
3112       typename elfcpp::Swap<32, big_endian>::Valtype x)
3113   {
3114     val &= 0xfff0f000;
3115     val |= x & 0x0fff;
3116     val |= (x & 0xf000) << 4;
3117     return val;
3118   }
3119
3120   // Encoding of imm16 argument for movt and movw Thumb2 instructions
3121   // from ARM ARM:
3122   //
3123   //     imm16 := imm4 | i | imm3 | imm8
3124   //
3125   //  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
3126   // +---------+-+-----------+-------++-+-----+-------+---------------+
3127   // |         |i|           |imm4   || |imm3 |       |imm8           |
3128   // +---------+-+-----------+-------++-+-----+-------+---------------+
3129
3130   // Extract the relocation addend from VAL based on the Thumb2
3131   // instruction encoding described above.
3132   static inline typename elfcpp::Swap<32, big_endian>::Valtype
3133   extract_thumb_movw_movt_addend(
3134       typename elfcpp::Swap<32, big_endian>::Valtype val)
3135   {
3136     // According to the Elf ABI for ARM Architecture the immediate
3137     // field is sign-extended to form the addend.
3138     return Bits<16>::sign_extend32(((val >> 4) & 0xf000)
3139                                    | ((val >> 15) & 0x0800)
3140                                    | ((val >> 4) & 0x0700)
3141                                    | (val & 0x00ff));
3142   }
3143
3144   // Insert X into VAL based on the Thumb2 instruction encoding
3145   // described above.
3146   static inline typename elfcpp::Swap<32, big_endian>::Valtype
3147   insert_val_thumb_movw_movt(
3148       typename elfcpp::Swap<32, big_endian>::Valtype val,
3149       typename elfcpp::Swap<32, big_endian>::Valtype x)
3150   {
3151     val &= 0xfbf08f00;
3152     val |= (x & 0xf000) << 4;
3153     val |= (x & 0x0800) << 15;
3154     val |= (x & 0x0700) << 4;
3155     val |= (x & 0x00ff);
3156     return val;
3157   }
3158
3159   // Calculate the smallest constant Kn for the specified residual.
3160   // (see (AAELF 4.6.1.4 Static ARM relocations, Group Relocations, p.32)
3161   static uint32_t
3162   calc_grp_kn(typename elfcpp::Swap<32, big_endian>::Valtype residual)
3163   {
3164     int32_t msb;
3165
3166     if (residual == 0)
3167       return 0;
3168     // Determine the most significant bit in the residual and
3169     // align the resulting value to a 2-bit boundary.
3170     for (msb = 30; (msb >= 0) && !(residual & (3 << msb)); msb -= 2)
3171       ;
3172     // The desired shift is now (msb - 6), or zero, whichever
3173     // is the greater.
3174     return (((msb - 6) < 0) ? 0 : (msb - 6));
3175   }
3176
3177   // Calculate the final residual for the specified group index.
3178   // If the passed group index is less than zero, the method will return
3179   // the value of the specified residual without any change.
3180   // (see (AAELF 4.6.1.4 Static ARM relocations, Group Relocations, p.32)
3181   static typename elfcpp::Swap<32, big_endian>::Valtype
3182   calc_grp_residual(typename elfcpp::Swap<32, big_endian>::Valtype residual,
3183                     const int group)
3184   {
3185     for (int n = 0; n <= group; n++)
3186       {
3187         // Calculate which part of the value to mask.
3188         uint32_t shift = calc_grp_kn(residual);
3189         // Calculate the residual for the next time around.
3190         residual &= ~(residual & (0xff << shift));
3191       }
3192
3193     return residual;
3194   }
3195
3196   // Calculate the value of Gn for the specified group index.
3197   // We return it in the form of an encoded constant-and-rotation.
3198   // (see (AAELF 4.6.1.4 Static ARM relocations, Group Relocations, p.32)
3199   static typename elfcpp::Swap<32, big_endian>::Valtype
3200   calc_grp_gn(typename elfcpp::Swap<32, big_endian>::Valtype residual,
3201               const int group)
3202   {
3203     typename elfcpp::Swap<32, big_endian>::Valtype gn = 0;
3204     uint32_t shift = 0;
3205
3206     for (int n = 0; n <= group; n++)
3207       {
3208         // Calculate which part of the value to mask.
3209         shift = calc_grp_kn(residual);
3210         // Calculate Gn in 32-bit as well as encoded constant-and-rotation form.
3211         gn = residual & (0xff << shift);
3212         // Calculate the residual for the next time around.
3213         residual &= ~gn;
3214       }
3215     // Return Gn in the form of an encoded constant-and-rotation.
3216     return ((gn >> shift) | ((gn <= 0xff ? 0 : (32 - shift) / 2) << 8));
3217   }
3218
3219  public:
3220   // Handle ARM long branches.
3221   static typename This::Status
3222   arm_branch_common(unsigned int, const Relocate_info<32, big_endian>*,
3223                     unsigned char*, const Sized_symbol<32>*,
3224                     const Arm_relobj<big_endian>*, unsigned int,
3225                     const Symbol_value<32>*, Arm_address, Arm_address, bool);
3226
3227   // Handle THUMB long branches.
3228   static typename This::Status
3229   thumb_branch_common(unsigned int, const Relocate_info<32, big_endian>*,
3230                       unsigned char*, const Sized_symbol<32>*,
3231                       const Arm_relobj<big_endian>*, unsigned int,
3232                       const Symbol_value<32>*, Arm_address, Arm_address, bool);
3233
3234
3235   // Return the branch offset of a 32-bit THUMB branch.
3236   static inline int32_t
3237   thumb32_branch_offset(uint16_t upper_insn, uint16_t lower_insn)
3238   {
3239     // We use the Thumb-2 encoding (backwards compatible with Thumb-1)
3240     // involving the J1 and J2 bits.
3241     uint32_t s = (upper_insn & (1U << 10)) >> 10;
3242     uint32_t upper = upper_insn & 0x3ffU;
3243     uint32_t lower = lower_insn & 0x7ffU;
3244     uint32_t j1 = (lower_insn & (1U << 13)) >> 13;
3245     uint32_t j2 = (lower_insn & (1U << 11)) >> 11;
3246     uint32_t i1 = j1 ^ s ? 0 : 1;
3247     uint32_t i2 = j2 ^ s ? 0 : 1;
3248
3249     return Bits<25>::sign_extend32((s << 24) | (i1 << 23) | (i2 << 22)
3250                                    | (upper << 12) | (lower << 1));
3251   }
3252
3253   // Insert OFFSET to a 32-bit THUMB branch and return the upper instruction.
3254   // UPPER_INSN is the original upper instruction of the branch.  Caller is
3255   // responsible for overflow checking and BLX offset adjustment.
3256   static inline uint16_t
3257   thumb32_branch_upper(uint16_t upper_insn, int32_t offset)
3258   {
3259     uint32_t s = offset < 0 ? 1 : 0;
3260     uint32_t bits = static_cast<uint32_t>(offset);
3261     return (upper_insn & ~0x7ffU) | ((bits >> 12) & 0x3ffU) | (s << 10);
3262   }
3263
3264   // Insert OFFSET to a 32-bit THUMB branch and return the lower instruction.
3265   // LOWER_INSN is the original lower instruction of the branch.  Caller is
3266   // responsible for overflow checking and BLX offset adjustment.
3267   static inline uint16_t
3268   thumb32_branch_lower(uint16_t lower_insn, int32_t offset)
3269   {
3270     uint32_t s = offset < 0 ? 1 : 0;
3271     uint32_t bits = static_cast<uint32_t>(offset);
3272     return ((lower_insn & ~0x2fffU)
3273             | ((((bits >> 23) & 1) ^ !s) << 13)
3274             | ((((bits >> 22) & 1) ^ !s) << 11)
3275             | ((bits >> 1) & 0x7ffU));
3276   }
3277
3278   // Return the branch offset of a 32-bit THUMB conditional branch.
3279   static inline int32_t
3280   thumb32_cond_branch_offset(uint16_t upper_insn, uint16_t lower_insn)
3281   {
3282     uint32_t s = (upper_insn & 0x0400U) >> 10;
3283     uint32_t j1 = (lower_insn & 0x2000U) >> 13;
3284     uint32_t j2 = (lower_insn & 0x0800U) >> 11;
3285     uint32_t lower = (lower_insn & 0x07ffU);
3286     uint32_t upper = (s << 8) | (j2 << 7) | (j1 << 6) | (upper_insn & 0x003fU);
3287
3288     return Bits<21>::sign_extend32((upper << 12) | (lower << 1));
3289   }
3290
3291   // Insert OFFSET to a 32-bit THUMB conditional branch and return the upper
3292   // instruction.  UPPER_INSN is the original upper instruction of the branch.
3293   // Caller is responsible for overflow checking.
3294   static inline uint16_t
3295   thumb32_cond_branch_upper(uint16_t upper_insn, int32_t offset)
3296   {
3297     uint32_t s = offset < 0 ? 1 : 0;
3298     uint32_t bits = static_cast<uint32_t>(offset);
3299     return (upper_insn & 0xfbc0U) | (s << 10) | ((bits & 0x0003f000U) >> 12);
3300   }
3301
3302   // Insert OFFSET to a 32-bit THUMB conditional branch and return the lower
3303   // instruction.  LOWER_INSN is the original lower instruction of the branch.
3304   // The caller is responsible for overflow checking.
3305   static inline uint16_t
3306   thumb32_cond_branch_lower(uint16_t lower_insn, int32_t offset)
3307   {
3308     uint32_t bits = static_cast<uint32_t>(offset);
3309     uint32_t j2 = (bits & 0x00080000U) >> 19;
3310     uint32_t j1 = (bits & 0x00040000U) >> 18;
3311     uint32_t lo = (bits & 0x00000ffeU) >> 1;
3312
3313     return (lower_insn & 0xd000U) | (j1 << 13) | (j2 << 11) | lo;
3314   }
3315
3316   // R_ARM_ABS8: S + A
3317   static inline typename This::Status
3318   abs8(unsigned char* view,
3319        const Sized_relobj_file<32, big_endian>* object,
3320        const Symbol_value<32>* psymval)
3321   {
3322     typedef typename elfcpp::Swap<8, big_endian>::Valtype Valtype;
3323     Valtype* wv = reinterpret_cast<Valtype*>(view);
3324     Valtype val = elfcpp::Swap<8, big_endian>::readval(wv);
3325     int32_t addend = Bits<8>::sign_extend32(val);
3326     Arm_address x = psymval->value(object, addend);
3327     val = Bits<32>::bit_select32(val, x, 0xffU);
3328     elfcpp::Swap<8, big_endian>::writeval(wv, val);
3329
3330     // R_ARM_ABS8 permits signed or unsigned results.
3331     return (Bits<8>::has_signed_unsigned_overflow32(x)
3332             ? This::STATUS_OVERFLOW
3333             : This::STATUS_OKAY);
3334   }
3335
3336   // R_ARM_THM_ABS5: S + A
3337   static inline typename This::Status
3338   thm_abs5(unsigned char* view,
3339        const Sized_relobj_file<32, big_endian>* object,
3340        const Symbol_value<32>* psymval)
3341   {
3342     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3343     typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3344     Valtype* wv = reinterpret_cast<Valtype*>(view);
3345     Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3346     Reltype addend = (val & 0x7e0U) >> 6;
3347     Reltype x = psymval->value(object, addend);
3348     val = Bits<32>::bit_select32(val, x << 6, 0x7e0U);
3349     elfcpp::Swap<16, big_endian>::writeval(wv, val);
3350     return (Bits<5>::has_overflow32(x)
3351             ? This::STATUS_OVERFLOW
3352             : This::STATUS_OKAY);
3353   }
3354
3355   // R_ARM_ABS12: S + A
3356   static inline typename This::Status
3357   abs12(unsigned char* view,
3358         const Sized_relobj_file<32, big_endian>* object,
3359         const Symbol_value<32>* psymval)
3360   {
3361     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3362     typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3363     Valtype* wv = reinterpret_cast<Valtype*>(view);
3364     Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3365     Reltype addend = val & 0x0fffU;
3366     Reltype x = psymval->value(object, addend);
3367     val = Bits<32>::bit_select32(val, x, 0x0fffU);
3368     elfcpp::Swap<32, big_endian>::writeval(wv, val);
3369     return (Bits<12>::has_overflow32(x)
3370             ? This::STATUS_OVERFLOW
3371             : This::STATUS_OKAY);
3372   }
3373
3374   // R_ARM_ABS16: S + A
3375   static inline typename This::Status
3376   abs16(unsigned char* view,
3377         const Sized_relobj_file<32, big_endian>* object,
3378         const Symbol_value<32>* psymval)
3379   {
3380     typedef typename elfcpp::Swap_unaligned<16, big_endian>::Valtype Valtype;
3381     Valtype val = elfcpp::Swap_unaligned<16, big_endian>::readval(view);
3382     int32_t addend = Bits<16>::sign_extend32(val);
3383     Arm_address x = psymval->value(object, addend);
3384     val = Bits<32>::bit_select32(val, x, 0xffffU);
3385     elfcpp::Swap_unaligned<16, big_endian>::writeval(view, val);
3386
3387     // R_ARM_ABS16 permits signed or unsigned results.
3388     return (Bits<16>::has_signed_unsigned_overflow32(x)
3389             ? This::STATUS_OVERFLOW
3390             : This::STATUS_OKAY);
3391   }
3392
3393   // R_ARM_ABS32: (S + A) | T
3394   static inline typename This::Status
3395   abs32(unsigned char* view,
3396         const Sized_relobj_file<32, big_endian>* object,
3397         const Symbol_value<32>* psymval,
3398         Arm_address thumb_bit)
3399   {
3400     typedef typename elfcpp::Swap_unaligned<32, big_endian>::Valtype Valtype;
3401     Valtype addend = elfcpp::Swap_unaligned<32, big_endian>::readval(view);
3402     Valtype x = psymval->value(object, addend) | thumb_bit;
3403     elfcpp::Swap_unaligned<32, big_endian>::writeval(view, x);
3404     return This::STATUS_OKAY;
3405   }
3406
3407   // R_ARM_REL32: (S + A) | T - P
3408   static inline typename This::Status
3409   rel32(unsigned char* view,
3410         const Sized_relobj_file<32, big_endian>* object,
3411         const Symbol_value<32>* psymval,
3412         Arm_address address,
3413         Arm_address thumb_bit)
3414   {
3415     typedef typename elfcpp::Swap_unaligned<32, big_endian>::Valtype Valtype;
3416     Valtype addend = elfcpp::Swap_unaligned<32, big_endian>::readval(view);
3417     Valtype x = (psymval->value(object, addend) | thumb_bit) - address;
3418     elfcpp::Swap_unaligned<32, big_endian>::writeval(view, x);
3419     return This::STATUS_OKAY;
3420   }
3421
3422   // R_ARM_THM_JUMP24: (S + A) | T - P
3423   static typename This::Status
3424   thm_jump19(unsigned char* view, const Arm_relobj<big_endian>* object,
3425              const Symbol_value<32>* psymval, Arm_address address,
3426              Arm_address thumb_bit);
3427
3428   // R_ARM_THM_JUMP6: S + A - P
3429   static inline typename This::Status
3430   thm_jump6(unsigned char* view,
3431             const Sized_relobj_file<32, big_endian>* object,
3432             const Symbol_value<32>* psymval,
3433             Arm_address address)
3434   {
3435     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3436     typedef typename elfcpp::Swap<16, big_endian>::Valtype Reltype;
3437     Valtype* wv = reinterpret_cast<Valtype*>(view);
3438     Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3439     // bit[9]:bit[7:3]:'0' (mask: 0x02f8)
3440     Reltype addend = (((val & 0x0200) >> 3) | ((val & 0x00f8) >> 2));
3441     Reltype x = (psymval->value(object, addend) - address);
3442     val = (val & 0xfd07) | ((x  & 0x0040) << 3) | ((val & 0x003e) << 2);
3443     elfcpp::Swap<16, big_endian>::writeval(wv, val);
3444     // CZB does only forward jumps.
3445     return ((x > 0x007e)
3446             ? This::STATUS_OVERFLOW
3447             : This::STATUS_OKAY);
3448   }
3449
3450   // R_ARM_THM_JUMP8: S + A - P
3451   static inline typename This::Status
3452   thm_jump8(unsigned char* view,
3453             const Sized_relobj_file<32, big_endian>* object,
3454             const Symbol_value<32>* psymval,
3455             Arm_address address)
3456   {
3457     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3458     Valtype* wv = reinterpret_cast<Valtype*>(view);
3459     Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3460     int32_t addend = Bits<8>::sign_extend32((val & 0x00ff) << 1);
3461     int32_t x = (psymval->value(object, addend) - address);
3462     elfcpp::Swap<16, big_endian>::writeval(wv, ((val & 0xff00)
3463                                                 | ((x & 0x01fe) >> 1)));
3464     // We do a 9-bit overflow check because x is right-shifted by 1 bit.
3465     return (Bits<9>::has_overflow32(x)
3466             ? This::STATUS_OVERFLOW
3467             : This::STATUS_OKAY);
3468   }
3469
3470   // R_ARM_THM_JUMP11: S + A - P
3471   static inline typename This::Status
3472   thm_jump11(unsigned char* view,
3473             const Sized_relobj_file<32, big_endian>* object,
3474             const Symbol_value<32>* psymval,
3475             Arm_address address)
3476   {
3477     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3478     Valtype* wv = reinterpret_cast<Valtype*>(view);
3479     Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3480     int32_t addend = Bits<11>::sign_extend32((val & 0x07ff) << 1);
3481     int32_t x = (psymval->value(object, addend) - address);
3482     elfcpp::Swap<16, big_endian>::writeval(wv, ((val & 0xf800)
3483                                                 | ((x & 0x0ffe) >> 1)));
3484     // We do a 12-bit overflow check because x is right-shifted by 1 bit.
3485     return (Bits<12>::has_overflow32(x)
3486             ? This::STATUS_OVERFLOW
3487             : This::STATUS_OKAY);
3488   }
3489
3490   // R_ARM_BASE_PREL: B(S) + A - P
3491   static inline typename This::Status
3492   base_prel(unsigned char* view,
3493             Arm_address origin,
3494             Arm_address address)
3495   {
3496     Base::rel32(view, origin - address);
3497     return STATUS_OKAY;
3498   }
3499
3500   // R_ARM_BASE_ABS: B(S) + A
3501   static inline typename This::Status
3502   base_abs(unsigned char* view,
3503            Arm_address origin)
3504   {
3505     Base::rel32(view, origin);
3506     return STATUS_OKAY;
3507   }
3508
3509   // R_ARM_GOT_BREL: GOT(S) + A - GOT_ORG
3510   static inline typename This::Status
3511   got_brel(unsigned char* view,
3512            typename elfcpp::Swap<32, big_endian>::Valtype got_offset)
3513   {
3514     Base::rel32(view, got_offset);
3515     return This::STATUS_OKAY;
3516   }
3517
3518   // R_ARM_GOT_PREL: GOT(S) + A - P
3519   static inline typename This::Status
3520   got_prel(unsigned char* view,
3521            Arm_address got_entry,
3522            Arm_address address)
3523   {
3524     Base::rel32(view, got_entry - address);
3525     return This::STATUS_OKAY;
3526   }
3527
3528   // R_ARM_PREL: (S + A) | T - P
3529   static inline typename This::Status
3530   prel31(unsigned char* view,
3531          const Sized_relobj_file<32, big_endian>* object,
3532          const Symbol_value<32>* psymval,
3533          Arm_address address,
3534          Arm_address thumb_bit)
3535   {
3536     typedef typename elfcpp::Swap_unaligned<32, big_endian>::Valtype Valtype;
3537     Valtype val = elfcpp::Swap_unaligned<32, big_endian>::readval(view);
3538     Valtype addend = Bits<31>::sign_extend32(val);
3539     Valtype x = (psymval->value(object, addend) | thumb_bit) - address;
3540     val = Bits<32>::bit_select32(val, x, 0x7fffffffU);
3541     elfcpp::Swap_unaligned<32, big_endian>::writeval(view, val);
3542     return (Bits<31>::has_overflow32(x)
3543             ? This::STATUS_OVERFLOW
3544             : This::STATUS_OKAY);
3545   }
3546
3547   // R_ARM_MOVW_ABS_NC: (S + A) | T     (relative address base is )
3548   // R_ARM_MOVW_PREL_NC: (S + A) | T - P
3549   // R_ARM_MOVW_BREL_NC: ((S + A) | T) - B(S)
3550   // R_ARM_MOVW_BREL: ((S + A) | T) - B(S)
3551   static inline typename This::Status
3552   movw(unsigned char* view,
3553        const Sized_relobj_file<32, big_endian>* object,
3554        const Symbol_value<32>* psymval,
3555        Arm_address relative_address_base,
3556        Arm_address thumb_bit,
3557        bool check_overflow)
3558   {
3559     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3560     Valtype* wv = reinterpret_cast<Valtype*>(view);
3561     Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3562     Valtype addend = This::extract_arm_movw_movt_addend(val);
3563     Valtype x = ((psymval->value(object, addend) | thumb_bit)
3564                  - relative_address_base);
3565     val = This::insert_val_arm_movw_movt(val, x);
3566     elfcpp::Swap<32, big_endian>::writeval(wv, val);
3567     return ((check_overflow && Bits<16>::has_overflow32(x))
3568             ? This::STATUS_OVERFLOW
3569             : This::STATUS_OKAY);
3570   }
3571
3572   // R_ARM_MOVT_ABS: S + A      (relative address base is 0)
3573   // R_ARM_MOVT_PREL: S + A - P
3574   // R_ARM_MOVT_BREL: S + A - B(S)
3575   static inline typename This::Status
3576   movt(unsigned char* view,
3577        const Sized_relobj_file<32, big_endian>* object,
3578        const Symbol_value<32>* psymval,
3579        Arm_address relative_address_base)
3580   {
3581     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3582     Valtype* wv = reinterpret_cast<Valtype*>(view);
3583     Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3584     Valtype addend = This::extract_arm_movw_movt_addend(val);
3585     Valtype x = (psymval->value(object, addend) - relative_address_base) >> 16;
3586     val = This::insert_val_arm_movw_movt(val, x);
3587     elfcpp::Swap<32, big_endian>::writeval(wv, val);
3588     // FIXME: IHI0044D says that we should check for overflow.
3589     return This::STATUS_OKAY;
3590   }
3591
3592   // R_ARM_THM_MOVW_ABS_NC: S + A | T           (relative_address_base is 0)
3593   // R_ARM_THM_MOVW_PREL_NC: (S + A) | T - P
3594   // R_ARM_THM_MOVW_BREL_NC: ((S + A) | T) - B(S)
3595   // R_ARM_THM_MOVW_BREL: ((S + A) | T) - B(S)
3596   static inline typename This::Status
3597   thm_movw(unsigned char* view,
3598            const Sized_relobj_file<32, big_endian>* object,
3599            const Symbol_value<32>* psymval,
3600            Arm_address relative_address_base,
3601            Arm_address thumb_bit,
3602            bool check_overflow)
3603   {
3604     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3605     typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3606     Valtype* wv = reinterpret_cast<Valtype*>(view);
3607     Reltype val = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3608                   | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3609     Reltype addend = This::extract_thumb_movw_movt_addend(val);
3610     Reltype x =
3611       (psymval->value(object, addend) | thumb_bit) - relative_address_base;
3612     val = This::insert_val_thumb_movw_movt(val, x);
3613     elfcpp::Swap<16, big_endian>::writeval(wv, val >> 16);
3614     elfcpp::Swap<16, big_endian>::writeval(wv + 1, val & 0xffff);
3615     return ((check_overflow && Bits<16>::has_overflow32(x))
3616             ? This::STATUS_OVERFLOW
3617             : This::STATUS_OKAY);
3618   }
3619
3620   // R_ARM_THM_MOVT_ABS: S + A          (relative address base is 0)
3621   // R_ARM_THM_MOVT_PREL: S + A - P
3622   // R_ARM_THM_MOVT_BREL: S + A - B(S)
3623   static inline typename This::Status
3624   thm_movt(unsigned char* view,
3625            const Sized_relobj_file<32, big_endian>* object,
3626            const Symbol_value<32>* psymval,
3627            Arm_address relative_address_base)
3628   {
3629     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3630     typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3631     Valtype* wv = reinterpret_cast<Valtype*>(view);
3632     Reltype val = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3633                   | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3634     Reltype addend = This::extract_thumb_movw_movt_addend(val);
3635     Reltype x = (psymval->value(object, addend) - relative_address_base) >> 16;
3636     val = This::insert_val_thumb_movw_movt(val, x);
3637     elfcpp::Swap<16, big_endian>::writeval(wv, val >> 16);
3638     elfcpp::Swap<16, big_endian>::writeval(wv + 1, val & 0xffff);
3639     return This::STATUS_OKAY;
3640   }
3641
3642   // R_ARM_THM_ALU_PREL_11_0: ((S + A) | T) - Pa (Thumb32)
3643   static inline typename This::Status
3644   thm_alu11(unsigned char* view,
3645             const Sized_relobj_file<32, big_endian>* object,
3646             const Symbol_value<32>* psymval,
3647             Arm_address address,
3648             Arm_address thumb_bit)
3649   {
3650     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3651     typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3652     Valtype* wv = reinterpret_cast<Valtype*>(view);
3653     Reltype insn = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3654                    | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3655
3656     //        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
3657     // -----------------------------------------------------------------------
3658     // ADD{S} 1 1 1 1 0|i|0|1 0 0 0|S|1 1 0 1||0|imm3 |Rd     |imm8
3659     // ADDW   1 1 1 1 0|i|1|0 0 0 0|0|1 1 0 1||0|imm3 |Rd     |imm8
3660     // ADR[+] 1 1 1 1 0|i|1|0 0 0 0|0|1 1 1 1||0|imm3 |Rd     |imm8
3661     // SUB{S} 1 1 1 1 0|i|0|1 1 0 1|S|1 1 0 1||0|imm3 |Rd     |imm8
3662     // SUBW   1 1 1 1 0|i|1|0 1 0 1|0|1 1 0 1||0|imm3 |Rd     |imm8
3663     // ADR[-] 1 1 1 1 0|i|1|0 1 0 1|0|1 1 1 1||0|imm3 |Rd     |imm8
3664
3665     // Determine a sign for the addend.
3666     const int sign = ((insn & 0xf8ef0000) == 0xf0ad0000
3667                       || (insn & 0xf8ef0000) == 0xf0af0000) ? -1 : 1;
3668     // Thumb2 addend encoding:
3669     // imm12 := i | imm3 | imm8
3670     int32_t addend = (insn & 0xff)
3671                      | ((insn & 0x00007000) >> 4)
3672                      | ((insn & 0x04000000) >> 15);
3673     // Apply a sign to the added.
3674     addend *= sign;
3675
3676     int32_t x = (psymval->value(object, addend) | thumb_bit)
3677                 - (address & 0xfffffffc);
3678     Reltype val = abs(x);
3679     // Mask out the value and a distinct part of the ADD/SUB opcode
3680     // (bits 7:5 of opword).
3681     insn = (insn & 0xfb0f8f00)
3682            | (val & 0xff)
3683            | ((val & 0x700) << 4)
3684            | ((val & 0x800) << 15);
3685     // Set the opcode according to whether the value to go in the
3686     // place is negative.
3687     if (x < 0)
3688       insn |= 0x00a00000;
3689
3690     elfcpp::Swap<16, big_endian>::writeval(wv, insn >> 16);
3691     elfcpp::Swap<16, big_endian>::writeval(wv + 1, insn & 0xffff);
3692     return ((val > 0xfff) ?
3693             This::STATUS_OVERFLOW : This::STATUS_OKAY);
3694   }
3695
3696   // R_ARM_THM_PC8: S + A - Pa (Thumb)
3697   static inline typename This::Status
3698   thm_pc8(unsigned char* view,
3699           const Sized_relobj_file<32, big_endian>* object,
3700           const Symbol_value<32>* psymval,
3701           Arm_address address)
3702   {
3703     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3704     typedef typename elfcpp::Swap<16, big_endian>::Valtype Reltype;
3705     Valtype* wv = reinterpret_cast<Valtype*>(view);
3706     Valtype insn = elfcpp::Swap<16, big_endian>::readval(wv);
3707     Reltype addend = ((insn & 0x00ff) << 2);
3708     int32_t x = (psymval->value(object, addend) - (address & 0xfffffffc));
3709     Reltype val = abs(x);
3710     insn = (insn & 0xff00) | ((val & 0x03fc) >> 2);
3711
3712     elfcpp::Swap<16, big_endian>::writeval(wv, insn);
3713     return ((val > 0x03fc)
3714             ? This::STATUS_OVERFLOW
3715             : This::STATUS_OKAY);
3716   }
3717
3718   // R_ARM_THM_PC12: S + A - Pa (Thumb32)
3719   static inline typename This::Status
3720   thm_pc12(unsigned char* view,
3721            const Sized_relobj_file<32, big_endian>* object,
3722            const Symbol_value<32>* psymval,
3723            Arm_address address)
3724   {
3725     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3726     typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3727     Valtype* wv = reinterpret_cast<Valtype*>(view);
3728     Reltype insn = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3729                    | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3730     // Determine a sign for the addend (positive if the U bit is 1).
3731     const int sign = (insn & 0x00800000) ? 1 : -1;
3732     int32_t addend = (insn & 0xfff);
3733     // Apply a sign to the added.
3734     addend *= sign;
3735
3736     int32_t x = (psymval->value(object, addend) - (address & 0xfffffffc));
3737     Reltype val = abs(x);
3738     // Mask out and apply the value and the U bit.
3739     insn = (insn & 0xff7ff000) | (val & 0xfff);
3740     // Set the U bit according to whether the value to go in the
3741     // place is positive.
3742     if (x >= 0)
3743       insn |= 0x00800000;
3744
3745     elfcpp::Swap<16, big_endian>::writeval(wv, insn >> 16);
3746     elfcpp::Swap<16, big_endian>::writeval(wv + 1, insn & 0xffff);
3747     return ((val > 0xfff) ?
3748             This::STATUS_OVERFLOW : This::STATUS_OKAY);
3749   }
3750
3751   // R_ARM_V4BX
3752   static inline typename This::Status
3753   v4bx(const Relocate_info<32, big_endian>* relinfo,
3754        unsigned char* view,
3755        const Arm_relobj<big_endian>* object,
3756        const Arm_address address,
3757        const bool is_interworking)
3758   {
3759
3760     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3761     Valtype* wv = reinterpret_cast<Valtype*>(view);
3762     Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3763
3764     // Ensure that we have a BX instruction.
3765     gold_assert((val & 0x0ffffff0) == 0x012fff10);
3766     const uint32_t reg = (val & 0xf);
3767     if (is_interworking && reg != 0xf)
3768       {
3769         Stub_table<big_endian>* stub_table =
3770             object->stub_table(relinfo->data_shndx);
3771         gold_assert(stub_table != NULL);
3772
3773         Arm_v4bx_stub* stub = stub_table->find_arm_v4bx_stub(reg);
3774         gold_assert(stub != NULL);
3775
3776         int32_t veneer_address =
3777             stub_table->address() + stub->offset() - 8 - address;
3778         gold_assert((veneer_address <= ARM_MAX_FWD_BRANCH_OFFSET)
3779                     && (veneer_address >= ARM_MAX_BWD_BRANCH_OFFSET));
3780         // Replace with a branch to veneer (B <addr>)
3781         val = (val & 0xf0000000) | 0x0a000000
3782               | ((veneer_address >> 2) & 0x00ffffff);
3783       }
3784     else
3785       {
3786         // Preserve Rm (lowest four bits) and the condition code
3787         // (highest four bits). Other bits encode MOV PC,Rm.
3788         val = (val & 0xf000000f) | 0x01a0f000;
3789       }
3790     elfcpp::Swap<32, big_endian>::writeval(wv, val);
3791     return This::STATUS_OKAY;
3792   }
3793
3794   // R_ARM_ALU_PC_G0_NC: ((S + A) | T) - P
3795   // R_ARM_ALU_PC_G0:    ((S + A) | T) - P
3796   // R_ARM_ALU_PC_G1_NC: ((S + A) | T) - P
3797   // R_ARM_ALU_PC_G1:    ((S + A) | T) - P
3798   // R_ARM_ALU_PC_G2:    ((S + A) | T) - P
3799   // R_ARM_ALU_SB_G0_NC: ((S + A) | T) - B(S)
3800   // R_ARM_ALU_SB_G0:    ((S + A) | T) - B(S)
3801   // R_ARM_ALU_SB_G1_NC: ((S + A) | T) - B(S)
3802   // R_ARM_ALU_SB_G1:    ((S + A) | T) - B(S)
3803   // R_ARM_ALU_SB_G2:    ((S + A) | T) - B(S)
3804   static inline typename This::Status
3805   arm_grp_alu(unsigned char* view,
3806         const Sized_relobj_file<32, big_endian>* object,
3807         const Symbol_value<32>* psymval,
3808         const int group,
3809         Arm_address address,
3810         Arm_address thumb_bit,
3811         bool check_overflow)
3812   {
3813     gold_assert(group >= 0 && group < 3);
3814     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3815     Valtype* wv = reinterpret_cast<Valtype*>(view);
3816     Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3817
3818     // ALU group relocations are allowed only for the ADD/SUB instructions.
3819     // (0x00800000 - ADD, 0x00400000 - SUB)
3820     const Valtype opcode = insn & 0x01e00000;
3821     if (opcode != 0x00800000 && opcode != 0x00400000)
3822       return This::STATUS_BAD_RELOC;
3823
3824     // Determine a sign for the addend.
3825     const int sign = (opcode == 0x00800000) ? 1 : -1;
3826     // shifter = rotate_imm * 2
3827     const uint32_t shifter = (insn & 0xf00) >> 7;
3828     // Initial addend value.
3829     int32_t addend = insn & 0xff;
3830     // Rotate addend right by shifter.
3831     addend = (addend >> shifter) | (addend << (32 - shifter));
3832     // Apply a sign to the added.
3833     addend *= sign;
3834
3835     int32_t x = ((psymval->value(object, addend) | thumb_bit) - address);
3836     Valtype gn = Arm_relocate_functions::calc_grp_gn(abs(x), group);
3837     // Check for overflow if required
3838     if (check_overflow
3839         && (Arm_relocate_functions::calc_grp_residual(abs(x), group) != 0))
3840       return This::STATUS_OVERFLOW;
3841
3842     // Mask out the value and the ADD/SUB part of the opcode; take care
3843     // not to destroy the S bit.
3844     insn &= 0xff1ff000;
3845     // Set the opcode according to whether the value to go in the
3846     // place is negative.
3847     insn |= ((x < 0) ? 0x00400000 : 0x00800000);
3848     // Encode the offset (encoded Gn).
3849     insn |= gn;
3850
3851     elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3852     return This::STATUS_OKAY;
3853   }
3854
3855   // R_ARM_LDR_PC_G0: S + A - P
3856   // R_ARM_LDR_PC_G1: S + A - P
3857   // R_ARM_LDR_PC_G2: S + A - P
3858   // R_ARM_LDR_SB_G0: S + A - B(S)
3859   // R_ARM_LDR_SB_G1: S + A - B(S)
3860   // R_ARM_LDR_SB_G2: S + A - B(S)
3861   static inline typename This::Status
3862   arm_grp_ldr(unsigned char* view,
3863         const Sized_relobj_file<32, big_endian>* object,
3864         const Symbol_value<32>* psymval,
3865         const int group,
3866         Arm_address address)
3867   {
3868     gold_assert(group >= 0 && group < 3);
3869     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3870     Valtype* wv = reinterpret_cast<Valtype*>(view);
3871     Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3872
3873     const int sign = (insn & 0x00800000) ? 1 : -1;
3874     int32_t addend = (insn & 0xfff) * sign;
3875     int32_t x = (psymval->value(object, addend) - address);
3876     // Calculate the relevant G(n-1) value to obtain this stage residual.
3877     Valtype residual =
3878         Arm_relocate_functions::calc_grp_residual(abs(x), group - 1);
3879     if (residual >= 0x1000)
3880       return This::STATUS_OVERFLOW;
3881
3882     // Mask out the value and U bit.
3883     insn &= 0xff7ff000;
3884     // Set the U bit for non-negative values.
3885     if (x >= 0)
3886       insn |= 0x00800000;
3887     insn |= residual;
3888
3889     elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3890     return This::STATUS_OKAY;
3891   }
3892
3893   // R_ARM_LDRS_PC_G0: S + A - P
3894   // R_ARM_LDRS_PC_G1: S + A - P
3895   // R_ARM_LDRS_PC_G2: S + A - P
3896   // R_ARM_LDRS_SB_G0: S + A - B(S)
3897   // R_ARM_LDRS_SB_G1: S + A - B(S)
3898   // R_ARM_LDRS_SB_G2: S + A - B(S)
3899   static inline typename This::Status
3900   arm_grp_ldrs(unsigned char* view,
3901         const Sized_relobj_file<32, big_endian>* object,
3902         const Symbol_value<32>* psymval,
3903         const int group,
3904         Arm_address address)
3905   {
3906     gold_assert(group >= 0 && group < 3);
3907     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3908     Valtype* wv = reinterpret_cast<Valtype*>(view);
3909     Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3910
3911     const int sign = (insn & 0x00800000) ? 1 : -1;
3912     int32_t addend = (((insn & 0xf00) >> 4) + (insn & 0xf)) * sign;
3913     int32_t x = (psymval->value(object, addend) - address);
3914     // Calculate the relevant G(n-1) value to obtain this stage residual.
3915     Valtype residual =
3916         Arm_relocate_functions::calc_grp_residual(abs(x), group - 1);
3917    if (residual >= 0x100)
3918       return This::STATUS_OVERFLOW;
3919
3920     // Mask out the value and U bit.
3921     insn &= 0xff7ff0f0;
3922     // Set the U bit for non-negative values.
3923     if (x >= 0)
3924       insn |= 0x00800000;
3925     insn |= ((residual & 0xf0) << 4) | (residual & 0xf);
3926
3927     elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3928     return This::STATUS_OKAY;
3929   }
3930
3931   // R_ARM_LDC_PC_G0: S + A - P
3932   // R_ARM_LDC_PC_G1: S + A - P
3933   // R_ARM_LDC_PC_G2: S + A - P
3934   // R_ARM_LDC_SB_G0: S + A - B(S)
3935   // R_ARM_LDC_SB_G1: S + A - B(S)
3936   // R_ARM_LDC_SB_G2: S + A - B(S)
3937   static inline typename This::Status
3938   arm_grp_ldc(unsigned char* view,
3939       const Sized_relobj_file<32, big_endian>* object,
3940       const Symbol_value<32>* psymval,
3941       const int group,
3942       Arm_address address)
3943   {
3944     gold_assert(group >= 0 && group < 3);
3945     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3946     Valtype* wv = reinterpret_cast<Valtype*>(view);
3947     Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3948
3949     const int sign = (insn & 0x00800000) ? 1 : -1;
3950     int32_t addend = ((insn & 0xff) << 2) * sign;
3951     int32_t x = (psymval->value(object, addend) - address);
3952     // Calculate the relevant G(n-1) value to obtain this stage residual.
3953     Valtype residual =
3954       Arm_relocate_functions::calc_grp_residual(abs(x), group - 1);
3955     if ((residual & 0x3) != 0 || residual >= 0x400)
3956       return This::STATUS_OVERFLOW;
3957
3958     // Mask out the value and U bit.
3959     insn &= 0xff7fff00;
3960     // Set the U bit for non-negative values.
3961     if (x >= 0)
3962       insn |= 0x00800000;
3963     insn |= (residual >> 2);
3964
3965     elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3966     return This::STATUS_OKAY;
3967   }
3968 };
3969
3970 // Relocate ARM long branches.  This handles relocation types
3971 // R_ARM_CALL, R_ARM_JUMP24, R_ARM_PLT32 and R_ARM_XPC25.
3972 // If IS_WEAK_UNDEFINED_WITH_PLT is true.  The target symbol is weakly
3973 // undefined and we do not use PLT in this relocation.  In such a case,
3974 // the branch is converted into an NOP.
3975
3976 template<bool big_endian>
3977 typename Arm_relocate_functions<big_endian>::Status
3978 Arm_relocate_functions<big_endian>::arm_branch_common(
3979     unsigned int r_type,
3980     const Relocate_info<32, big_endian>* relinfo,
3981     unsigned char* view,
3982     const Sized_symbol<32>* gsym,
3983     const Arm_relobj<big_endian>* object,
3984     unsigned int r_sym,
3985     const Symbol_value<32>* psymval,
3986     Arm_address address,
3987     Arm_address thumb_bit,
3988     bool is_weakly_undefined_without_plt)
3989 {
3990   typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3991   Valtype* wv = reinterpret_cast<Valtype*>(view);
3992   Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3993
3994   bool insn_is_b = (((val >> 28) & 0xf) <= 0xe)
3995                     && ((val & 0x0f000000UL) == 0x0a000000UL);
3996   bool insn_is_uncond_bl = (val & 0xff000000UL) == 0xeb000000UL;
3997   bool insn_is_cond_bl = (((val >> 28) & 0xf) < 0xe)
3998                           && ((val & 0x0f000000UL) == 0x0b000000UL);
3999   bool insn_is_blx = (val & 0xfe000000UL) == 0xfa000000UL;
4000   bool insn_is_any_branch = (val & 0x0e000000UL) == 0x0a000000UL;
4001
4002   // Check that the instruction is valid.
4003   if (r_type == elfcpp::R_ARM_CALL)
4004     {
4005       if (!insn_is_uncond_bl && !insn_is_blx)
4006         return This::STATUS_BAD_RELOC;
4007     }
4008   else if (r_type == elfcpp::R_ARM_JUMP24)
4009     {
4010       if (!insn_is_b && !insn_is_cond_bl)
4011         return This::STATUS_BAD_RELOC;
4012     }
4013   else if (r_type == elfcpp::R_ARM_PLT32)
4014     {
4015       if (!insn_is_any_branch)
4016         return This::STATUS_BAD_RELOC;
4017     }
4018   else if (r_type == elfcpp::R_ARM_XPC25)
4019     {
4020       // FIXME: AAELF document IH0044C does not say much about it other
4021       // than it being obsolete.
4022       if (!insn_is_any_branch)
4023         return This::STATUS_BAD_RELOC;
4024     }
4025   else
4026     gold_unreachable();
4027
4028   // A branch to an undefined weak symbol is turned into a jump to
4029   // the next instruction unless a PLT entry will be created.
4030   // Do the same for local undefined symbols.
4031   // The jump to the next instruction is optimized as a NOP depending
4032   // on the architecture.
4033   const Target_arm<big_endian>* arm_target =
4034     Target_arm<big_endian>::default_target();
4035   if (is_weakly_undefined_without_plt)
4036     {
4037       gold_assert(!parameters->options().relocatable());
4038       Valtype cond = val & 0xf0000000U;
4039       if (arm_target->may_use_arm_nop())
4040         val = cond | 0x0320f000;
4041       else
4042         val = cond | 0x01a00000;        // Using pre-UAL nop: mov r0, r0.
4043       elfcpp::Swap<32, big_endian>::writeval(wv, val);
4044       return This::STATUS_OKAY;
4045     }
4046
4047   Valtype addend = Bits<26>::sign_extend32(val << 2);
4048   Valtype branch_target = psymval->value(object, addend);
4049   int32_t branch_offset = branch_target - address;
4050
4051   // We need a stub if the branch offset is too large or if we need
4052   // to switch mode.
4053   bool may_use_blx = arm_target->may_use_v5t_interworking();
4054   Reloc_stub* stub = NULL;
4055
4056   if (!parameters->options().relocatable()
4057       && (Bits<26>::has_overflow32(branch_offset)
4058           || ((thumb_bit != 0)
4059               && !(may_use_blx && r_type == elfcpp::R_ARM_CALL))))
4060     {
4061       Valtype unadjusted_branch_target = psymval->value(object, 0);
4062
4063       Stub_type stub_type =
4064         Reloc_stub::stub_type_for_reloc(r_type, address,
4065                                         unadjusted_branch_target,
4066                                         (thumb_bit != 0));
4067       if (stub_type != arm_stub_none)
4068         {
4069           Stub_table<big_endian>* stub_table =
4070             object->stub_table(relinfo->data_shndx);
4071           gold_assert(stub_table != NULL);
4072
4073           Reloc_stub::Key stub_key(stub_type, gsym, object, r_sym, addend);
4074           stub = stub_table->find_reloc_stub(stub_key);
4075           gold_assert(stub != NULL);
4076           thumb_bit = stub->stub_template()->entry_in_thumb_mode() ? 1 : 0;
4077           branch_target = stub_table->address() + stub->offset() + addend;
4078           branch_offset = branch_target - address;
4079           gold_assert(!Bits<26>::has_overflow32(branch_offset));
4080         }
4081     }
4082
4083   // At this point, if we still need to switch mode, the instruction
4084   // must either be a BLX or a BL that can be converted to a BLX.
4085   if (thumb_bit != 0)
4086     {
4087       // Turn BL to BLX.
4088       gold_assert(may_use_blx && r_type == elfcpp::R_ARM_CALL);
4089       val = (val & 0xffffff) | 0xfa000000 | ((branch_offset & 2) << 23);
4090     }
4091
4092   val = Bits<32>::bit_select32(val, (branch_offset >> 2), 0xffffffUL);
4093   elfcpp::Swap<32, big_endian>::writeval(wv, val);
4094   return (Bits<26>::has_overflow32(branch_offset)
4095           ? This::STATUS_OVERFLOW
4096           : This::STATUS_OKAY);
4097 }
4098
4099 // Relocate THUMB long branches.  This handles relocation types
4100 // R_ARM_THM_CALL, R_ARM_THM_JUMP24 and R_ARM_THM_XPC22.
4101 // If IS_WEAK_UNDEFINED_WITH_PLT is true.  The target symbol is weakly
4102 // undefined and we do not use PLT in this relocation.  In such a case,
4103 // the branch is converted into an NOP.
4104
4105 template<bool big_endian>
4106 typename Arm_relocate_functions<big_endian>::Status
4107 Arm_relocate_functions<big_endian>::thumb_branch_common(
4108     unsigned int r_type,
4109     const Relocate_info<32, big_endian>* relinfo,
4110     unsigned char* view,
4111     const Sized_symbol<32>* gsym,
4112     const Arm_relobj<big_endian>* object,
4113     unsigned int r_sym,
4114     const Symbol_value<32>* psymval,
4115     Arm_address address,
4116     Arm_address thumb_bit,
4117     bool is_weakly_undefined_without_plt)
4118 {
4119   typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
4120   Valtype* wv = reinterpret_cast<Valtype*>(view);
4121   uint32_t upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
4122   uint32_t lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
4123
4124   // FIXME: These tests are too loose and do not take THUMB/THUMB-2 difference
4125   // into account.
4126   bool is_bl_insn = (lower_insn & 0x1000U) == 0x1000U;
4127   bool is_blx_insn = (lower_insn & 0x1000U) == 0x0000U;
4128
4129   // Check that the instruction is valid.
4130   if (r_type == elfcpp::R_ARM_THM_CALL)
4131     {
4132       if (!is_bl_insn && !is_blx_insn)
4133         return This::STATUS_BAD_RELOC;
4134     }
4135   else if (r_type == elfcpp::R_ARM_THM_JUMP24)
4136     {
4137       // This cannot be a BLX.
4138       if (!is_bl_insn)
4139         return This::STATUS_BAD_RELOC;
4140     }
4141   else if (r_type == elfcpp::R_ARM_THM_XPC22)
4142     {
4143       // Check for Thumb to Thumb call.
4144       if (!is_blx_insn)
4145         return This::STATUS_BAD_RELOC;
4146       if (thumb_bit != 0)
4147         {
4148           gold_warning(_("%s: Thumb BLX instruction targets "
4149                          "thumb function '%s'."),
4150                          object->name().c_str(),
4151                          (gsym ? gsym->name() : "(local)"));
4152           // Convert BLX to BL.
4153           lower_insn |= 0x1000U;
4154         }
4155     }
4156   else
4157     gold_unreachable();
4158
4159   // A branch to an undefined weak symbol is turned into a jump to
4160   // the next instruction unless a PLT entry will be created.
4161   // The jump to the next instruction is optimized as a NOP.W for
4162   // Thumb-2 enabled architectures.
4163   const Target_arm<big_endian>* arm_target =
4164     Target_arm<big_endian>::default_target();
4165   if (is_weakly_undefined_without_plt)
4166     {
4167       gold_assert(!parameters->options().relocatable());
4168       if (arm_target->may_use_thumb2_nop())
4169         {
4170           elfcpp::Swap<16, big_endian>::writeval(wv, 0xf3af);
4171           elfcpp::Swap<16, big_endian>::writeval(wv + 1, 0x8000);
4172         }
4173       else
4174         {
4175           elfcpp::Swap<16, big_endian>::writeval(wv, 0xe000);
4176           elfcpp::Swap<16, big_endian>::writeval(wv + 1, 0xbf00);
4177         }
4178       return This::STATUS_OKAY;
4179     }
4180
4181   int32_t addend = This::thumb32_branch_offset(upper_insn, lower_insn);
4182   Arm_address branch_target = psymval->value(object, addend);
4183
4184   // For BLX, bit 1 of target address comes from bit 1 of base address.
4185   bool may_use_blx = arm_target->may_use_v5t_interworking();
4186   if (thumb_bit == 0 && may_use_blx)
4187     branch_target = Bits<32>::bit_select32(branch_target, address, 0x2);
4188
4189   int32_t branch_offset = branch_target - address;
4190
4191   // We need a stub if the branch offset is too large or if we need
4192   // to switch mode.
4193   bool thumb2 = arm_target->using_thumb2();
4194   if (!parameters->options().relocatable()
4195       && ((!thumb2 && Bits<23>::has_overflow32(branch_offset))
4196           || (thumb2 && Bits<25>::has_overflow32(branch_offset))
4197           || ((thumb_bit == 0)
4198               && (((r_type == elfcpp::R_ARM_THM_CALL) && !may_use_blx)
4199                   || r_type == elfcpp::R_ARM_THM_JUMP24))))
4200     {
4201       Arm_address unadjusted_branch_target = psymval->value(object, 0);
4202
4203       Stub_type stub_type =
4204         Reloc_stub::stub_type_for_reloc(r_type, address,
4205                                         unadjusted_branch_target,
4206                                         (thumb_bit != 0));
4207
4208       if (stub_type != arm_stub_none)
4209         {
4210           Stub_table<big_endian>* stub_table =
4211             object->stub_table(relinfo->data_shndx);
4212           gold_assert(stub_table != NULL);
4213
4214           Reloc_stub::Key stub_key(stub_type, gsym, object, r_sym, addend);
4215           Reloc_stub* stub = stub_table->find_reloc_stub(stub_key);
4216           gold_assert(stub != NULL);
4217           thumb_bit = stub->stub_template()->entry_in_thumb_mode() ? 1 : 0;
4218           branch_target = stub_table->address() + stub->offset() + addend;
4219           if (thumb_bit == 0 && may_use_blx)
4220             branch_target = Bits<32>::bit_select32(branch_target, address, 0x2);
4221           branch_offset = branch_target - address;
4222         }
4223     }
4224
4225   // At this point, if we still need to switch mode, the instruction
4226   // must either be a BLX or a BL that can be converted to a BLX.
4227   if (thumb_bit == 0)
4228     {
4229       gold_assert(may_use_blx
4230                   && (r_type == elfcpp::R_ARM_THM_CALL
4231                       || r_type == elfcpp::R_ARM_THM_XPC22));
4232       // Make sure this is a BLX.
4233       lower_insn &= ~0x1000U;
4234     }
4235   else
4236     {
4237       // Make sure this is a BL.
4238       lower_insn |= 0x1000U;
4239     }
4240
4241   // For a BLX instruction, make sure that the relocation is rounded up
4242   // to a word boundary.  This follows the semantics of the instruction
4243   // which specifies that bit 1 of the target address will come from bit
4244   // 1 of the base address.
4245   if ((lower_insn & 0x5000U) == 0x4000U)
4246     gold_assert((branch_offset & 3) == 0);
4247
4248   // Put BRANCH_OFFSET back into the insn.  Assumes two's complement.
4249   // We use the Thumb-2 encoding, which is safe even if dealing with
4250   // a Thumb-1 instruction by virtue of our overflow check above.  */
4251   upper_insn = This::thumb32_branch_upper(upper_insn, branch_offset);
4252   lower_insn = This::thumb32_branch_lower(lower_insn, branch_offset);
4253
4254   elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
4255   elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
4256
4257   gold_assert(!Bits<25>::has_overflow32(branch_offset));
4258
4259   return ((thumb2
4260            ? Bits<25>::has_overflow32(branch_offset)
4261            : Bits<23>::has_overflow32(branch_offset))
4262           ? This::STATUS_OVERFLOW
4263           : This::STATUS_OKAY);
4264 }
4265
4266 // Relocate THUMB-2 long conditional branches.
4267 // If IS_WEAK_UNDEFINED_WITH_PLT is true.  The target symbol is weakly
4268 // undefined and we do not use PLT in this relocation.  In such a case,
4269 // the branch is converted into an NOP.
4270
4271 template<bool big_endian>
4272 typename Arm_relocate_functions<big_endian>::Status
4273 Arm_relocate_functions<big_endian>::thm_jump19(
4274     unsigned char* view,
4275     const Arm_relobj<big_endian>* object,
4276     const Symbol_value<32>* psymval,
4277     Arm_address address,
4278     Arm_address thumb_bit)
4279 {
4280   typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
4281   Valtype* wv = reinterpret_cast<Valtype*>(view);
4282   uint32_t upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
4283   uint32_t lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
4284   int32_t addend = This::thumb32_cond_branch_offset(upper_insn, lower_insn);
4285
4286   Arm_address branch_target = psymval->value(object, addend);
4287   int32_t branch_offset = branch_target - address;
4288
4289   // ??? Should handle interworking?  GCC might someday try to
4290   // use this for tail calls.
4291   // FIXME: We do support thumb entry to PLT yet.
4292   if (thumb_bit == 0)
4293     {
4294       gold_error(_("conditional branch to PLT in THUMB-2 not supported yet."));
4295       return This::STATUS_BAD_RELOC;
4296     }
4297
4298   // Put RELOCATION back into the insn.
4299   upper_insn = This::thumb32_cond_branch_upper(upper_insn, branch_offset);
4300   lower_insn = This::thumb32_cond_branch_lower(lower_insn, branch_offset);
4301
4302   // Put the relocated value back in the object file:
4303   elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
4304   elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
4305
4306   return (Bits<21>::has_overflow32(branch_offset)
4307           ? This::STATUS_OVERFLOW
4308           : This::STATUS_OKAY);
4309 }
4310
4311 // Get the GOT section, creating it if necessary.
4312
4313 template<bool big_endian>
4314 Arm_output_data_got<big_endian>*
4315 Target_arm<big_endian>::got_section(Symbol_table* symtab, Layout* layout)
4316 {
4317   if (this->got_ == NULL)
4318     {
4319       gold_assert(symtab != NULL && layout != NULL);
4320
4321       // When using -z now, we can treat .got as a relro section.
4322       // Without -z now, it is modified after program startup by lazy
4323       // PLT relocations.
4324       bool is_got_relro = parameters->options().now();
4325       Output_section_order got_order = (is_got_relro
4326                                         ? ORDER_RELRO_LAST
4327                                         : ORDER_DATA);
4328
4329       // Unlike some targets (.e.g x86), ARM does not use separate .got and
4330       // .got.plt sections in output.  The output .got section contains both
4331       // PLT and non-PLT GOT entries.
4332       this->got_ = new Arm_output_data_got<big_endian>(symtab, layout);
4333
4334       layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
4335                                       (elfcpp::SHF_ALLOC | elfcpp::SHF_WRITE),
4336                                       this->got_, got_order, is_got_relro);
4337
4338       // The old GNU linker creates a .got.plt section.  We just
4339       // create another set of data in the .got section.  Note that we
4340       // always create a PLT if we create a GOT, although the PLT
4341       // might be empty.
4342       this->got_plt_ = new Output_data_space(4, "** GOT PLT");
4343       layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
4344                                       (elfcpp::SHF_ALLOC | elfcpp::SHF_WRITE),
4345                                       this->got_plt_, got_order, is_got_relro);
4346
4347       // The first three entries are reserved.
4348       this->got_plt_->set_current_data_size(3 * 4);
4349
4350       // Define _GLOBAL_OFFSET_TABLE_ at the start of the PLT.
4351       symtab->define_in_output_data("_GLOBAL_OFFSET_TABLE_", NULL,
4352                                     Symbol_table::PREDEFINED,
4353                                     this->got_plt_,
4354                                     0, 0, elfcpp::STT_OBJECT,
4355                                     elfcpp::STB_LOCAL,
4356                                     elfcpp::STV_HIDDEN, 0,
4357                                     false, false);
4358
4359       // If there are any IRELATIVE relocations, they get GOT entries
4360       // in .got.plt after the jump slot entries.
4361       this->got_irelative_ = new Output_data_space(4, "** GOT IRELATIVE PLT");
4362       layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
4363                                       (elfcpp::SHF_ALLOC | elfcpp::SHF_WRITE),
4364                                       this->got_irelative_,
4365                                       got_order, is_got_relro);
4366
4367     }
4368   return this->got_;
4369 }
4370
4371 // Get the dynamic reloc section, creating it if necessary.
4372
4373 template<bool big_endian>
4374 typename Target_arm<big_endian>::Reloc_section*
4375 Target_arm<big_endian>::rel_dyn_section(Layout* layout)
4376 {
4377   if (this->rel_dyn_ == NULL)
4378     {
4379       gold_assert(layout != NULL);
4380       // Create both relocation sections in the same place, so as to ensure
4381       // their relative order in the output section.
4382       this->rel_dyn_ = new Reloc_section(parameters->options().combreloc());
4383       this->rel_irelative_ = new Reloc_section(false);
4384       layout->add_output_section_data(".rel.dyn", elfcpp::SHT_REL,
4385                                       elfcpp::SHF_ALLOC, this->rel_dyn_,
4386                                       ORDER_DYNAMIC_RELOCS, false);
4387       layout->add_output_section_data(".rel.dyn", elfcpp::SHT_REL,
4388                                       elfcpp::SHF_ALLOC, this->rel_irelative_,
4389                                       ORDER_DYNAMIC_RELOCS, false);
4390     }
4391   return this->rel_dyn_;
4392 }
4393
4394
4395 // Get the section to use for IRELATIVE relocs, creating it if necessary.  These
4396 // go in .rela.dyn, but only after all other dynamic relocations.  They need to
4397 // follow the other dynamic relocations so that they can refer to global
4398 // variables initialized by those relocs.
4399
4400 template<bool big_endian>
4401 typename Target_arm<big_endian>::Reloc_section*
4402 Target_arm<big_endian>::rel_irelative_section(Layout* layout)
4403 {
4404   if (this->rel_irelative_ == NULL)
4405     {
4406       // Delegate the creation to rel_dyn_section so as to ensure their order in
4407       // the output section.
4408       this->rel_dyn_section(layout);
4409       gold_assert(this->rel_irelative_ != NULL
4410                   && (this->rel_dyn_->output_section()
4411                       == this->rel_irelative_->output_section()));
4412     }
4413   return this->rel_irelative_;
4414 }
4415
4416
4417 // Insn_template methods.
4418
4419 // Return byte size of an instruction template.
4420
4421 size_t
4422 Insn_template::size() const
4423 {
4424   switch (this->type())
4425     {
4426     case THUMB16_TYPE:
4427     case THUMB16_SPECIAL_TYPE:
4428       return 2;
4429     case ARM_TYPE:
4430     case THUMB32_TYPE:
4431     case DATA_TYPE:
4432       return 4;
4433     default:
4434       gold_unreachable();
4435     }
4436 }
4437
4438 // Return alignment of an instruction template.
4439
4440 unsigned
4441 Insn_template::alignment() const
4442 {
4443   switch (this->type())
4444     {
4445     case THUMB16_TYPE:
4446     case THUMB16_SPECIAL_TYPE:
4447     case THUMB32_TYPE:
4448       return 2;
4449     case ARM_TYPE:
4450     case DATA_TYPE:
4451       return 4;
4452     default:
4453       gold_unreachable();
4454     }
4455 }
4456
4457 // Stub_template methods.
4458
4459 Stub_template::Stub_template(
4460     Stub_type type, const Insn_template* insns,
4461      size_t insn_count)
4462   : type_(type), insns_(insns), insn_count_(insn_count), alignment_(1),
4463     entry_in_thumb_mode_(false), relocs_()
4464 {
4465   off_t offset = 0;
4466
4467   // Compute byte size and alignment of stub template.
4468   for (size_t i = 0; i < insn_count; i++)
4469     {
4470       unsigned insn_alignment = insns[i].alignment();
4471       size_t insn_size = insns[i].size();
4472       gold_assert((offset & (insn_alignment - 1)) == 0);
4473       this->alignment_ = std::max(this->alignment_, insn_alignment);
4474       switch (insns[i].type())
4475         {
4476         case Insn_template::THUMB16_TYPE:
4477         case Insn_template::THUMB16_SPECIAL_TYPE:
4478           if (i == 0)
4479             this->entry_in_thumb_mode_ = true;
4480           break;
4481
4482         case Insn_template::THUMB32_TYPE:
4483           if (insns[i].r_type() != elfcpp::R_ARM_NONE)
4484             this->relocs_.push_back(Reloc(i, offset));
4485           if (i == 0)
4486             this->entry_in_thumb_mode_ = true;
4487           break;
4488
4489         case Insn_template::ARM_TYPE:
4490           // Handle cases where the target is encoded within the
4491           // instruction.
4492           if (insns[i].r_type() == elfcpp::R_ARM_JUMP24)
4493             this->relocs_.push_back(Reloc(i, offset));
4494           break;
4495
4496         case Insn_template::DATA_TYPE:
4497           // Entry point cannot be data.
4498           gold_assert(i != 0);
4499           this->relocs_.push_back(Reloc(i, offset));
4500           break;
4501
4502         default:
4503           gold_unreachable();
4504         }
4505       offset += insn_size;
4506     }
4507   this->size_ = offset;
4508 }
4509
4510 // Stub methods.
4511
4512 // Template to implement do_write for a specific target endianness.
4513
4514 template<bool big_endian>
4515 void inline
4516 Stub::do_fixed_endian_write(unsigned char* view, section_size_type view_size)
4517 {
4518   const Stub_template* stub_template = this->stub_template();
4519   const Insn_template* insns = stub_template->insns();
4520   const bool enable_be8 = parameters->options().be8();
4521
4522   unsigned char* pov = view;
4523   for (size_t i = 0; i < stub_template->insn_count(); i++)
4524     {
4525       switch (insns[i].type())
4526         {
4527         case Insn_template::THUMB16_TYPE:
4528           if (enable_be8)
4529             elfcpp::Swap<16, false>::writeval(pov, insns[i].data() & 0xffff);
4530           else
4531             elfcpp::Swap<16, big_endian>::writeval(pov,
4532                                                    insns[i].data() & 0xffff);
4533           break;
4534         case Insn_template::THUMB16_SPECIAL_TYPE:
4535           if (enable_be8)
4536             elfcpp::Swap<16, false>::writeval(pov, this->thumb16_special(i));
4537           else
4538             elfcpp::Swap<16, big_endian>::writeval(pov,
4539                                                    this->thumb16_special(i));
4540           break;
4541         case Insn_template::THUMB32_TYPE:
4542           {
4543             uint32_t hi = (insns[i].data() >> 16) & 0xffff;
4544             uint32_t lo = insns[i].data() & 0xffff;
4545             if (enable_be8)
4546               {
4547                 elfcpp::Swap<16, false>::writeval(pov, hi);
4548                 elfcpp::Swap<16, false>::writeval(pov + 2, lo);
4549               }
4550             else
4551               {
4552                 elfcpp::Swap<16, big_endian>::writeval(pov, hi);
4553                 elfcpp::Swap<16, big_endian>::writeval(pov + 2, lo);
4554               }
4555           }
4556           break;
4557         case Insn_template::ARM_TYPE:
4558           if (enable_be8)
4559             elfcpp::Swap<32, false>::writeval(pov, insns[i].data());
4560           else
4561             elfcpp::Swap<32, big_endian>::writeval(pov, insns[i].data());
4562           break;
4563         case Insn_template::DATA_TYPE:
4564           elfcpp::Swap<32, big_endian>::writeval(pov, insns[i].data());
4565           break;
4566         default:
4567           gold_unreachable();
4568         }
4569       pov += insns[i].size();
4570     }
4571   gold_assert(static_cast<section_size_type>(pov - view) == view_size);
4572 }
4573
4574 // Reloc_stub::Key methods.
4575
4576 // Dump a Key as a string for debugging.
4577
4578 std::string
4579 Reloc_stub::Key::name() const
4580 {
4581   if (this->r_sym_ == invalid_index)
4582     {
4583       // Global symbol key name
4584       // <stub-type>:<symbol name>:<addend>.
4585       const std::string sym_name = this->u_.symbol->name();
4586       // We need to print two hex number and two colons.  So just add 100 bytes
4587       // to the symbol name size.
4588       size_t len = sym_name.size() + 100;
4589       char* buffer = new char[len];
4590       int c = snprintf(buffer, len, "%d:%s:%x", this->stub_type_,
4591                        sym_name.c_str(), this->addend_);
4592       gold_assert(c > 0 && c < static_cast<int>(len));
4593       delete[] buffer;
4594       return std::string(buffer);
4595     }
4596   else
4597     {
4598       // local symbol key name
4599       // <stub-type>:<object>:<r_sym>:<addend>.
4600       const size_t len = 200;
4601       char buffer[len];
4602       int c = snprintf(buffer, len, "%d:%p:%u:%x", this->stub_type_,
4603                        this->u_.relobj, this->r_sym_, this->addend_);
4604       gold_assert(c > 0 && c < static_cast<int>(len));
4605       return std::string(buffer);
4606     }
4607 }
4608
4609 // Reloc_stub methods.
4610
4611 // Determine the type of stub needed, if any, for a relocation of R_TYPE at
4612 // LOCATION to DESTINATION.
4613 // This code is based on the arm_type_of_stub function in
4614 // bfd/elf32-arm.c.  We have changed the interface a little to keep the Stub
4615 // class simple.
4616
4617 Stub_type
4618 Reloc_stub::stub_type_for_reloc(
4619    unsigned int r_type,
4620    Arm_address location,
4621    Arm_address destination,
4622    bool target_is_thumb)
4623 {
4624   Stub_type stub_type = arm_stub_none;
4625
4626   // This is a bit ugly but we want to avoid using a templated class for
4627   // big and little endianities.
4628   bool may_use_blx;
4629   bool should_force_pic_veneer = parameters->options().pic_veneer();
4630   bool thumb2;
4631   bool thumb_only;
4632   if (parameters->target().is_big_endian())
4633     {
4634       const Target_arm<true>* big_endian_target =
4635         Target_arm<true>::default_target();
4636       may_use_blx = big_endian_target->may_use_v5t_interworking();
4637       should_force_pic_veneer |= big_endian_target->should_force_pic_veneer();
4638       thumb2 = big_endian_target->using_thumb2();
4639       thumb_only = big_endian_target->using_thumb_only();
4640     }
4641   else
4642     {
4643       const Target_arm<false>* little_endian_target =
4644         Target_arm<false>::default_target();
4645       may_use_blx = little_endian_target->may_use_v5t_interworking();
4646       should_force_pic_veneer |=
4647         little_endian_target->should_force_pic_veneer();
4648       thumb2 = little_endian_target->using_thumb2();
4649       thumb_only = little_endian_target->using_thumb_only();
4650     }
4651
4652   int64_t branch_offset;
4653   bool output_is_position_independent =
4654       parameters->options().output_is_position_independent();
4655   if (r_type == elfcpp::R_ARM_THM_CALL || r_type == elfcpp::R_ARM_THM_JUMP24)
4656     {
4657       // For THUMB BLX instruction, bit 1 of target comes from bit 1 of the
4658       // base address (instruction address + 4).
4659       if ((r_type == elfcpp::R_ARM_THM_CALL) && may_use_blx && !target_is_thumb)
4660         destination = Bits<32>::bit_select32(destination, location, 0x2);
4661       branch_offset = static_cast<int64_t>(destination) - location;
4662
4663       // Handle cases where:
4664       // - this call goes too far (different Thumb/Thumb2 max
4665       //   distance)
4666       // - it's a Thumb->Arm call and blx is not available, or it's a
4667       //   Thumb->Arm branch (not bl). A stub is needed in this case.
4668       if ((!thumb2
4669             && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
4670                 || (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
4671           || (thumb2
4672               && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
4673                   || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
4674           || ((!target_is_thumb)
4675               && (((r_type == elfcpp::R_ARM_THM_CALL) && !may_use_blx)
4676                   || (r_type == elfcpp::R_ARM_THM_JUMP24))))
4677         {
4678           if (target_is_thumb)
4679             {
4680               // Thumb to thumb.
4681               if (!thumb_only)
4682                 {
4683                   stub_type = (output_is_position_independent
4684                                || should_force_pic_veneer)
4685                     // PIC stubs.
4686                     ? ((may_use_blx
4687                         && (r_type == elfcpp::R_ARM_THM_CALL))
4688                        // V5T and above. Stub starts with ARM code, so
4689                        // we must be able to switch mode before
4690                        // reaching it, which is only possible for 'bl'
4691                        // (ie R_ARM_THM_CALL relocation).
4692                        ? arm_stub_long_branch_any_thumb_pic
4693                        // On V4T, use Thumb code only.
4694                        : arm_stub_long_branch_v4t_thumb_thumb_pic)
4695
4696                     // non-PIC stubs.
4697                     : ((may_use_blx
4698                         && (r_type == elfcpp::R_ARM_THM_CALL))
4699                        ? arm_stub_long_branch_any_any // V5T and above.
4700                        : arm_stub_long_branch_v4t_thumb_thumb); // V4T.
4701                 }
4702               else
4703                 {
4704                   stub_type = (output_is_position_independent
4705                                || should_force_pic_veneer)
4706                     ? arm_stub_long_branch_thumb_only_pic       // PIC stub.
4707                     : arm_stub_long_branch_thumb_only;  // non-PIC stub.
4708                 }
4709             }
4710           else
4711             {
4712               // Thumb to arm.
4713
4714               // FIXME: We should check that the input section is from an
4715               // object that has interwork enabled.
4716
4717               stub_type = (output_is_position_independent
4718                            || should_force_pic_veneer)
4719                 // PIC stubs.
4720                 ? ((may_use_blx
4721                     && (r_type == elfcpp::R_ARM_THM_CALL))
4722                    ? arm_stub_long_branch_any_arm_pic   // V5T and above.
4723                    : arm_stub_long_branch_v4t_thumb_arm_pic)    // V4T.
4724
4725                 // non-PIC stubs.
4726                 : ((may_use_blx
4727                     && (r_type == elfcpp::R_ARM_THM_CALL))
4728                    ? arm_stub_long_branch_any_any       // V5T and above.
4729                    : arm_stub_long_branch_v4t_thumb_arm);       // V4T.
4730
4731               // Handle v4t short branches.
4732               if ((stub_type == arm_stub_long_branch_v4t_thumb_arm)
4733                   && (branch_offset <= THM_MAX_FWD_BRANCH_OFFSET)
4734                   && (branch_offset >= THM_MAX_BWD_BRANCH_OFFSET))
4735                 stub_type = arm_stub_short_branch_v4t_thumb_arm;
4736             }
4737         }
4738     }
4739   else if (r_type == elfcpp::R_ARM_CALL
4740            || r_type == elfcpp::R_ARM_JUMP24
4741            || r_type == elfcpp::R_ARM_PLT32)
4742     {
4743       branch_offset = static_cast<int64_t>(destination) - location;
4744       if (target_is_thumb)
4745         {
4746           // Arm to thumb.
4747
4748           // FIXME: We should check that the input section is from an
4749           // object that has interwork enabled.
4750
4751           // We have an extra 2-bytes reach because of
4752           // the mode change (bit 24 (H) of BLX encoding).
4753           if (branch_offset > (ARM_MAX_FWD_BRANCH_OFFSET + 2)
4754               || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET)
4755               || ((r_type == elfcpp::R_ARM_CALL) && !may_use_blx)
4756               || (r_type == elfcpp::R_ARM_JUMP24)
4757               || (r_type == elfcpp::R_ARM_PLT32))
4758             {
4759               stub_type = (output_is_position_independent
4760                            || should_force_pic_veneer)
4761                 // PIC stubs.
4762                 ? (may_use_blx
4763                    ? arm_stub_long_branch_any_thumb_pic// V5T and above.
4764                    : arm_stub_long_branch_v4t_arm_thumb_pic)    // V4T stub.
4765
4766                 // non-PIC stubs.
4767                 : (may_use_blx
4768                    ? arm_stub_long_branch_any_any       // V5T and above.
4769                    : arm_stub_long_branch_v4t_arm_thumb);       // V4T.
4770             }
4771         }
4772       else
4773         {
4774           // Arm to arm.
4775           if (branch_offset > ARM_MAX_FWD_BRANCH_OFFSET
4776               || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET))
4777             {
4778               stub_type = (output_is_position_independent
4779                            || should_force_pic_veneer)
4780                 ? arm_stub_long_branch_any_arm_pic      // PIC stubs.
4781                 : arm_stub_long_branch_any_any;         /// non-PIC.
4782             }
4783         }
4784     }
4785
4786   return stub_type;
4787 }
4788
4789 // Cortex_a8_stub methods.
4790
4791 // Return the instruction for a THUMB16_SPECIAL_TYPE instruction template.
4792 // I is the position of the instruction template in the stub template.
4793
4794 uint16_t
4795 Cortex_a8_stub::do_thumb16_special(size_t i)
4796 {
4797   // The only use of this is to copy condition code from a conditional
4798   // branch being worked around to the corresponding conditional branch in
4799   // to the stub.
4800   gold_assert(this->stub_template()->type() == arm_stub_a8_veneer_b_cond
4801               && i == 0);
4802   uint16_t data = this->stub_template()->insns()[i].data();
4803   gold_assert((data & 0xff00U) == 0xd000U);
4804   data |= ((this->original_insn_ >> 22) & 0xf) << 8;
4805   return data;
4806 }
4807
4808 // Stub_factory methods.
4809
4810 Stub_factory::Stub_factory()
4811 {
4812   // The instruction template sequences are declared as static
4813   // objects and initialized first time the constructor runs.
4814
4815   // Arm/Thumb -> Arm/Thumb long branch stub. On V5T and above, use blx
4816   // to reach the stub if necessary.
4817   static const Insn_template elf32_arm_stub_long_branch_any_any[] =
4818     {
4819       Insn_template::arm_insn(0xe51ff004),      // ldr   pc, [pc, #-4]
4820       Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4821                                                 // dcd   R_ARM_ABS32(X)
4822     };
4823
4824   // V4T Arm -> Thumb long branch stub. Used on V4T where blx is not
4825   // available.
4826   static const Insn_template elf32_arm_stub_long_branch_v4t_arm_thumb[] =
4827     {
4828       Insn_template::arm_insn(0xe59fc000),      // ldr   ip, [pc, #0]
4829       Insn_template::arm_insn(0xe12fff1c),      // bx    ip
4830       Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4831                                                 // dcd   R_ARM_ABS32(X)
4832     };
4833
4834   // Thumb -> Thumb long branch stub. Used on M-profile architectures.
4835   static const Insn_template elf32_arm_stub_long_branch_thumb_only[] =
4836     {
4837       Insn_template::thumb16_insn(0xb401),      // push {r0}
4838       Insn_template::thumb16_insn(0x4802),      // ldr  r0, [pc, #8]
4839       Insn_template::thumb16_insn(0x4684),      // mov  ip, r0
4840       Insn_template::thumb16_insn(0xbc01),      // pop  {r0}
4841       Insn_template::thumb16_insn(0x4760),      // bx   ip
4842       Insn_template::thumb16_insn(0xbf00),      // nop
4843       Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4844                                                 // dcd  R_ARM_ABS32(X)
4845     };
4846
4847   // V4T Thumb -> Thumb long branch stub. Using the stack is not
4848   // allowed.
4849   static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_thumb[] =
4850     {
4851       Insn_template::thumb16_insn(0x4778),      // bx   pc
4852       Insn_template::thumb16_insn(0x46c0),      // nop
4853       Insn_template::arm_insn(0xe59fc000),      // ldr  ip, [pc, #0]
4854       Insn_template::arm_insn(0xe12fff1c),      // bx   ip
4855       Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4856                                                 // dcd  R_ARM_ABS32(X)
4857     };
4858
4859   // V4T Thumb -> ARM long branch stub. Used on V4T where blx is not
4860   // available.
4861   static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_arm[] =
4862     {
4863       Insn_template::thumb16_insn(0x4778),      // bx   pc
4864       Insn_template::thumb16_insn(0x46c0),      // nop
4865       Insn_template::arm_insn(0xe51ff004),      // ldr   pc, [pc, #-4]
4866       Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4867                                                 // dcd   R_ARM_ABS32(X)
4868     };
4869
4870   // V4T Thumb -> ARM short branch stub. Shorter variant of the above
4871   // one, when the destination is close enough.
4872   static const Insn_template elf32_arm_stub_short_branch_v4t_thumb_arm[] =
4873     {
4874       Insn_template::thumb16_insn(0x4778),              // bx   pc
4875       Insn_template::thumb16_insn(0x46c0),              // nop
4876       Insn_template::arm_rel_insn(0xea000000, -8),      // b    (X-8)
4877     };
4878
4879   // ARM/Thumb -> ARM long branch stub, PIC.  On V5T and above, use
4880   // blx to reach the stub if necessary.
4881   static const Insn_template elf32_arm_stub_long_branch_any_arm_pic[] =
4882     {
4883       Insn_template::arm_insn(0xe59fc000),      // ldr   r12, [pc]
4884       Insn_template::arm_insn(0xe08ff00c),      // add   pc, pc, ip
4885       Insn_template::data_word(0, elfcpp::R_ARM_REL32, -4),
4886                                                 // dcd   R_ARM_REL32(X-4)
4887     };
4888
4889   // ARM/Thumb -> Thumb long branch stub, PIC.  On V5T and above, use
4890   // blx to reach the stub if necessary.  We can not add into pc;
4891   // it is not guaranteed to mode switch (different in ARMv6 and
4892   // ARMv7).
4893   static const Insn_template elf32_arm_stub_long_branch_any_thumb_pic[] =
4894     {
4895       Insn_template::arm_insn(0xe59fc004),      // ldr   r12, [pc, #4]
4896       Insn_template::arm_insn(0xe08fc00c),      // add   ip, pc, ip
4897       Insn_template::arm_insn(0xe12fff1c),      // bx    ip
4898       Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
4899                                                 // dcd   R_ARM_REL32(X)
4900     };
4901
4902   // V4T ARM -> ARM long branch stub, PIC.
4903   static const Insn_template elf32_arm_stub_long_branch_v4t_arm_thumb_pic[] =
4904     {
4905       Insn_template::arm_insn(0xe59fc004),      // ldr   ip, [pc, #4]
4906       Insn_template::arm_insn(0xe08fc00c),      // add   ip, pc, ip
4907       Insn_template::arm_insn(0xe12fff1c),      // bx    ip
4908       Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
4909                                                 // dcd   R_ARM_REL32(X)
4910     };
4911
4912   // V4T Thumb -> ARM long branch stub, PIC.
4913   static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_arm_pic[] =
4914     {
4915       Insn_template::thumb16_insn(0x4778),      // bx   pc
4916       Insn_template::thumb16_insn(0x46c0),      // nop
4917       Insn_template::arm_insn(0xe59fc000),      // ldr  ip, [pc, #0]
4918       Insn_template::arm_insn(0xe08cf00f),      // add  pc, ip, pc
4919       Insn_template::data_word(0, elfcpp::R_ARM_REL32, -4),
4920                                                 // dcd  R_ARM_REL32(X)
4921     };
4922
4923   // Thumb -> Thumb long branch stub, PIC. Used on M-profile
4924   // architectures.
4925   static const Insn_template elf32_arm_stub_long_branch_thumb_only_pic[] =
4926     {
4927       Insn_template::thumb16_insn(0xb401),      // push {r0}
4928       Insn_template::thumb16_insn(0x4802),      // ldr  r0, [pc, #8]
4929       Insn_template::thumb16_insn(0x46fc),      // mov  ip, pc
4930       Insn_template::thumb16_insn(0x4484),      // add  ip, r0
4931       Insn_template::thumb16_insn(0xbc01),      // pop  {r0}
4932       Insn_template::thumb16_insn(0x4760),      // bx   ip
4933       Insn_template::data_word(0, elfcpp::R_ARM_REL32, 4),
4934                                                 // dcd  R_ARM_REL32(X)
4935     };
4936
4937   // V4T Thumb -> Thumb long branch stub, PIC. Using the stack is not
4938   // allowed.
4939   static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_thumb_pic[] =
4940     {
4941       Insn_template::thumb16_insn(0x4778),      // bx   pc
4942       Insn_template::thumb16_insn(0x46c0),      // nop
4943       Insn_template::arm_insn(0xe59fc004),      // ldr  ip, [pc, #4]
4944       Insn_template::arm_insn(0xe08fc00c),      // add   ip, pc, ip
4945       Insn_template::arm_insn(0xe12fff1c),      // bx   ip
4946       Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
4947                                                 // dcd  R_ARM_REL32(X)
4948     };
4949
4950   // Cortex-A8 erratum-workaround stubs.
4951
4952   // Stub used for conditional branches (which may be beyond +/-1MB away,
4953   // so we can't use a conditional branch to reach this stub).
4954
4955   // original code:
4956   //
4957   //    b<cond> X
4958   // after:
4959   //
4960   static const Insn_template elf32_arm_stub_a8_veneer_b_cond[] =
4961     {
4962       Insn_template::thumb16_bcond_insn(0xd001),        //      b<cond>.n true
4963       Insn_template::thumb32_b_insn(0xf000b800, -4),    //      b.w after
4964       Insn_template::thumb32_b_insn(0xf000b800, -4)     // true:
4965                                                         //      b.w X
4966     };
4967
4968   // Stub used for b.w and bl.w instructions.
4969
4970   static const Insn_template elf32_arm_stub_a8_veneer_b[] =
4971     {
4972       Insn_template::thumb32_b_insn(0xf000b800, -4)     // b.w dest
4973     };
4974
4975   static const Insn_template elf32_arm_stub_a8_veneer_bl[] =
4976     {
4977       Insn_template::thumb32_b_insn(0xf000b800, -4)     // b.w dest
4978     };
4979
4980   // Stub used for Thumb-2 blx.w instructions.  We modified the original blx.w
4981   // instruction (which switches to ARM mode) to point to this stub.  Jump to
4982   // the real destination using an ARM-mode branch.
4983   static const Insn_template elf32_arm_stub_a8_veneer_blx[] =
4984     {
4985       Insn_template::arm_rel_insn(0xea000000, -8)       // b dest
4986     };
4987
4988   // Stub used to provide an interworking for R_ARM_V4BX relocation
4989   // (bx r[n] instruction).
4990   static const Insn_template elf32_arm_stub_v4_veneer_bx[] =
4991     {
4992       Insn_template::arm_insn(0xe3100001),              // tst   r<n>, #1
4993       Insn_template::arm_insn(0x01a0f000),              // moveq pc, r<n>
4994       Insn_template::arm_insn(0xe12fff10)               // bx    r<n>
4995     };
4996
4997   // Fill in the stub template look-up table.  Stub templates are constructed
4998   // per instance of Stub_factory for fast look-up without locking
4999   // in a thread-enabled environment.
5000
5001   this->stub_templates_[arm_stub_none] =
5002     new Stub_template(arm_stub_none, NULL, 0);
5003
5004 #define DEF_STUB(x)     \
5005   do \
5006     { \
5007       size_t array_size \
5008         = sizeof(elf32_arm_stub_##x) / sizeof(elf32_arm_stub_##x[0]); \
5009       Stub_type type = arm_stub_##x; \
5010       this->stub_templates_[type] = \
5011         new Stub_template(type, elf32_arm_stub_##x, array_size); \
5012     } \
5013   while (0);
5014
5015   DEF_STUBS
5016 #undef DEF_STUB
5017 }
5018
5019 // Stub_table methods.
5020
5021 // Remove all Cortex-A8 stub.
5022
5023 template<bool big_endian>
5024 void
5025 Stub_table<big_endian>::remove_all_cortex_a8_stubs()
5026 {
5027   for (Cortex_a8_stub_list::iterator p = this->cortex_a8_stubs_.begin();
5028        p != this->cortex_a8_stubs_.end();
5029        ++p)
5030     delete p->second;
5031   this->cortex_a8_stubs_.clear();
5032 }
5033
5034 // Relocate one stub.  This is a helper for Stub_table::relocate_stubs().
5035
5036 template<bool big_endian>
5037 void
5038 Stub_table<big_endian>::relocate_stub(
5039     Stub* stub,
5040     const Relocate_info<32, big_endian>* relinfo,
5041     Target_arm<big_endian>* arm_target,
5042     Output_section* output_section,
5043     unsigned char* view,
5044     Arm_address address,
5045     section_size_type view_size)
5046 {
5047   const Stub_template* stub_template = stub->stub_template();
5048   if (stub_template->reloc_count() != 0)
5049     {
5050       // Adjust view to cover the stub only.
5051       section_size_type offset = stub->offset();
5052       section_size_type stub_size = stub_template->size();
5053       gold_assert(offset + stub_size <= view_size);
5054
5055       arm_target->relocate_stub(stub, relinfo, output_section, view + offset,
5056                                 address + offset, stub_size);
5057     }
5058 }
5059
5060 // Relocate all stubs in this stub table.
5061
5062 template<bool big_endian>
5063 void
5064 Stub_table<big_endian>::relocate_stubs(
5065     const Relocate_info<32, big_endian>* relinfo,
5066     Target_arm<big_endian>* arm_target,
5067     Output_section* output_section,
5068     unsigned char* view,
5069     Arm_address address,
5070     section_size_type view_size)
5071 {
5072   // If we are passed a view bigger than the stub table's.  we need to
5073   // adjust the view.
5074   gold_assert(address == this->address()
5075               && (view_size
5076                   == static_cast<section_size_type>(this->data_size())));
5077
5078   // Relocate all relocation stubs.
5079   for (typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.begin();
5080       p != this->reloc_stubs_.end();
5081       ++p)
5082     this->relocate_stub(p->second, relinfo, arm_target, output_section, view,
5083                         address, view_size);
5084
5085   // Relocate all Cortex-A8 stubs.
5086   for (Cortex_a8_stub_list::iterator p = this->cortex_a8_stubs_.begin();
5087        p != this->cortex_a8_stubs_.end();
5088        ++p)
5089     this->relocate_stub(p->second, relinfo, arm_target, output_section, view,
5090                         address, view_size);
5091
5092   // Relocate all ARM V4BX stubs.
5093   for (Arm_v4bx_stub_list::iterator p = this->arm_v4bx_stubs_.begin();
5094        p != this->arm_v4bx_stubs_.end();
5095        ++p)
5096     {
5097       if (*p != NULL)
5098         this->relocate_stub(*p, relinfo, arm_target, output_section, view,
5099                             address, view_size);
5100     }
5101 }
5102
5103 // Write out the stubs to file.
5104
5105 template<bool big_endian>
5106 void
5107 Stub_table<big_endian>::do_write(Output_file* of)
5108 {
5109   off_t offset = this->offset();
5110   const section_size_type oview_size =
5111     convert_to_section_size_type(this->data_size());
5112   unsigned char* const oview = of->get_output_view(offset, oview_size);
5113
5114   // Write relocation stubs.
5115   for (typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.begin();
5116       p != this->reloc_stubs_.end();
5117       ++p)
5118     {
5119       Reloc_stub* stub = p->second;
5120       Arm_address address = this->address() + stub->offset();
5121       gold_assert(address
5122                   == align_address(address,
5123                                    stub->stub_template()->alignment()));
5124       stub->write(oview + stub->offset(), stub->stub_template()->size(),
5125                   big_endian);
5126     }
5127
5128   // Write Cortex-A8 stubs.
5129   for (Cortex_a8_stub_list::const_iterator p = this->cortex_a8_stubs_.begin();
5130        p != this->cortex_a8_stubs_.end();
5131        ++p)
5132     {
5133       Cortex_a8_stub* stub = p->second;
5134       Arm_address address = this->address() + stub->offset();
5135       gold_assert(address
5136                   == align_address(address,
5137                                    stub->stub_template()->alignment()));
5138       stub->write(oview + stub->offset(), stub->stub_template()->size(),
5139                   big_endian);
5140     }
5141
5142   // Write ARM V4BX relocation stubs.
5143   for (Arm_v4bx_stub_list::const_iterator p = this->arm_v4bx_stubs_.begin();
5144        p != this->arm_v4bx_stubs_.end();
5145        ++p)
5146     {
5147       if (*p == NULL)
5148         continue;
5149
5150       Arm_address address = this->address() + (*p)->offset();
5151       gold_assert(address
5152                   == align_address(address,
5153                                    (*p)->stub_template()->alignment()));
5154       (*p)->write(oview + (*p)->offset(), (*p)->stub_template()->size(),
5155                   big_endian);
5156     }
5157
5158   of->write_output_view(this->offset(), oview_size, oview);
5159 }
5160
5161 // Update the data size and address alignment of the stub table at the end
5162 // of a relaxation pass.   Return true if either the data size or the
5163 // alignment changed in this relaxation pass.
5164
5165 template<bool big_endian>
5166 bool
5167 Stub_table<big_endian>::update_data_size_and_addralign()
5168 {
5169   // Go over all stubs in table to compute data size and address alignment.
5170   off_t size = this->reloc_stubs_size_;
5171   unsigned addralign = this->reloc_stubs_addralign_;
5172
5173   for (Cortex_a8_stub_list::const_iterator p = this->cortex_a8_stubs_.begin();
5174        p != this->cortex_a8_stubs_.end();
5175        ++p)
5176     {
5177       const Stub_template* stub_template = p->second->stub_template();
5178       addralign = std::max(addralign, stub_template->alignment());
5179       size = (align_address(size, stub_template->alignment())
5180               + stub_template->size());
5181     }
5182
5183   for (Arm_v4bx_stub_list::const_iterator p = this->arm_v4bx_stubs_.begin();
5184        p != this->arm_v4bx_stubs_.end();
5185        ++p)
5186     {
5187       if (*p == NULL)
5188         continue;
5189
5190       const Stub_template* stub_template = (*p)->stub_template();
5191       addralign = std::max(addralign, stub_template->alignment());
5192       size = (align_address(size, stub_template->alignment())
5193               + stub_template->size());
5194     }
5195
5196   // Check if either data size or alignment changed in this pass.
5197   // Update prev_data_size_ and prev_addralign_.  These will be used
5198   // as the current data size and address alignment for the next pass.
5199   bool changed = size != this->prev_data_size_;
5200   this->prev_data_size_ = size;
5201
5202   if (addralign != this->prev_addralign_)
5203     changed = true;
5204   this->prev_addralign_ = addralign;
5205
5206   return changed;
5207 }
5208
5209 // Finalize the stubs.  This sets the offsets of the stubs within the stub
5210 // table.  It also marks all input sections needing Cortex-A8 workaround.
5211
5212 template<bool big_endian>
5213 void
5214 Stub_table<big_endian>::finalize_stubs()
5215 {
5216   off_t off = this->reloc_stubs_size_;
5217   for (Cortex_a8_stub_list::const_iterator p = this->cortex_a8_stubs_.begin();
5218        p != this->cortex_a8_stubs_.end();
5219        ++p)
5220     {
5221       Cortex_a8_stub* stub = p->second;
5222       const Stub_template* stub_template = stub->stub_template();
5223       uint64_t stub_addralign = stub_template->alignment();
5224       off = align_address(off, stub_addralign);
5225       stub->set_offset(off);
5226       off += stub_template->size();
5227
5228       // Mark input section so that we can determine later if a code section
5229       // needs the Cortex-A8 workaround quickly.
5230       Arm_relobj<big_endian>* arm_relobj =
5231         Arm_relobj<big_endian>::as_arm_relobj(stub->relobj());
5232       arm_relobj->mark_section_for_cortex_a8_workaround(stub->shndx());
5233     }
5234
5235   for (Arm_v4bx_stub_list::const_iterator p = this->arm_v4bx_stubs_.begin();
5236       p != this->arm_v4bx_stubs_.end();
5237       ++p)
5238     {
5239       if (*p == NULL)
5240         continue;
5241
5242       const Stub_template* stub_template = (*p)->stub_template();
5243       uint64_t stub_addralign = stub_template->alignment();
5244       off = align_address(off, stub_addralign);
5245       (*p)->set_offset(off);
5246       off += stub_template->size();
5247     }
5248
5249   gold_assert(off <= this->prev_data_size_);
5250 }
5251
5252 // Apply Cortex-A8 workaround to an address range between VIEW_ADDRESS
5253 // and VIEW_ADDRESS + VIEW_SIZE - 1.  VIEW points to the mapped address
5254 // of the address range seen by the linker.
5255
5256 template<bool big_endian>
5257 void
5258 Stub_table<big_endian>::apply_cortex_a8_workaround_to_address_range(
5259     Target_arm<big_endian>* arm_target,
5260     unsigned char* view,
5261     Arm_address view_address,
5262     section_size_type view_size)
5263 {
5264   // Cortex-A8 stubs are sorted by addresses of branches being fixed up.
5265   for (Cortex_a8_stub_list::const_iterator p =
5266          this->cortex_a8_stubs_.lower_bound(view_address);
5267        ((p != this->cortex_a8_stubs_.end())
5268         && (p->first < (view_address + view_size)));
5269        ++p)
5270     {
5271       // We do not store the THUMB bit in the LSB of either the branch address
5272       // or the stub offset.  There is no need to strip the LSB.
5273       Arm_address branch_address = p->first;
5274       const Cortex_a8_stub* stub = p->second;
5275       Arm_address stub_address = this->address() + stub->offset();
5276
5277       // Offset of the branch instruction relative to this view.
5278       section_size_type offset =
5279         convert_to_section_size_type(branch_address - view_address);
5280       gold_assert((offset + 4) <= view_size);
5281
5282       arm_target->apply_cortex_a8_workaround(stub, stub_address,
5283                                              view + offset, branch_address);
5284     }
5285 }
5286
5287 // Arm_input_section methods.
5288
5289 // Initialize an Arm_input_section.
5290
5291 template<bool big_endian>
5292 void
5293 Arm_input_section<big_endian>::init()
5294 {
5295   Relobj* relobj = this->relobj();
5296   unsigned int shndx = this->shndx();
5297
5298   // We have to cache original size, alignment and contents to avoid locking
5299   // the original file.
5300   this->original_addralign_ =
5301     convert_types<uint32_t, uint64_t>(relobj->section_addralign(shndx));
5302
5303   // This is not efficient but we expect only a small number of relaxed
5304   // input sections for stubs.
5305   section_size_type section_size;
5306   const unsigned char* section_contents =
5307     relobj->section_contents(shndx, &section_size, false);
5308   this->original_size_ =
5309     convert_types<uint32_t, uint64_t>(relobj->section_size(shndx));
5310
5311   gold_assert(this->original_contents_ == NULL);
5312   this->original_contents_ = new unsigned char[section_size];
5313   memcpy(this->original_contents_, section_contents, section_size);
5314
5315   // We want to make this look like the original input section after
5316   // output sections are finalized.
5317   Output_section* os = relobj->output_section(shndx);
5318   off_t offset = relobj->output_section_offset(shndx);
5319   gold_assert(os != NULL && !relobj->is_output_section_offset_invalid(shndx));
5320   this->set_address(os->address() + offset);
5321   this->set_file_offset(os->offset() + offset);
5322
5323   this->set_current_data_size(this->original_size_);
5324   this->finalize_data_size();
5325 }
5326
5327 template<bool big_endian>
5328 void
5329 Arm_input_section<big_endian>::do_write(Output_file* of)
5330 {
5331   // We have to write out the original section content.
5332   gold_assert(this->original_contents_ != NULL);
5333   of->write(this->offset(), this->original_contents_,
5334             this->original_size_);
5335
5336   // If this owns a stub table and it is not empty, write it.
5337   if (this->is_stub_table_owner() && !this->stub_table_->empty())
5338     this->stub_table_->write(of);
5339 }
5340
5341 // Finalize data size.
5342
5343 template<bool big_endian>
5344 void
5345 Arm_input_section<big_endian>::set_final_data_size()
5346 {
5347   off_t off = convert_types<off_t, uint64_t>(this->original_size_);
5348
5349   if (this->is_stub_table_owner())
5350     {
5351       this->stub_table_->finalize_data_size();
5352       off = align_address(off, this->stub_table_->addralign());
5353       off += this->stub_table_->data_size();
5354     }
5355   this->set_data_size(off);
5356 }
5357
5358 // Reset address and file offset.
5359
5360 template<bool big_endian>
5361 void
5362 Arm_input_section<big_endian>::do_reset_address_and_file_offset()
5363 {
5364   // Size of the original input section contents.
5365   off_t off = convert_types<off_t, uint64_t>(this->original_size_);
5366
5367   // If this is a stub table owner, account for the stub table size.
5368   if (this->is_stub_table_owner())
5369     {
5370       Stub_table<big_endian>* stub_table = this->stub_table_;
5371
5372       // Reset the stub table's address and file offset.  The
5373       // current data size for child will be updated after that.
5374       stub_table_->reset_address_and_file_offset();
5375       off = align_address(off, stub_table_->addralign());
5376       off += stub_table->current_data_size();
5377     }
5378
5379   this->set_current_data_size(off);
5380 }
5381
5382 // Arm_exidx_cantunwind methods.
5383
5384 // Write this to Output file OF for a fixed endianness.
5385
5386 template<bool big_endian>
5387 void
5388 Arm_exidx_cantunwind::do_fixed_endian_write(Output_file* of)
5389 {
5390   off_t offset = this->offset();
5391   const section_size_type oview_size = 8;
5392   unsigned char* const oview = of->get_output_view(offset, oview_size);
5393
5394   Output_section* os = this->relobj_->output_section(this->shndx_);
5395   gold_assert(os != NULL);
5396
5397   Arm_relobj<big_endian>* arm_relobj =
5398     Arm_relobj<big_endian>::as_arm_relobj(this->relobj_);
5399   Arm_address output_offset =
5400     arm_relobj->get_output_section_offset(this->shndx_);
5401   Arm_address section_start;
5402   section_size_type section_size;
5403
5404   // Find out the end of the text section referred by this.
5405   if (output_offset != Arm_relobj<big_endian>::invalid_address)
5406     {
5407       section_start = os->address() + output_offset;
5408       const Arm_exidx_input_section* exidx_input_section =
5409         arm_relobj->exidx_input_section_by_link(this->shndx_);
5410       gold_assert(exidx_input_section != NULL);
5411       section_size =
5412         convert_to_section_size_type(exidx_input_section->text_size());
5413     }
5414   else
5415     {
5416       // Currently this only happens for a relaxed section.
5417       const Output_relaxed_input_section* poris =
5418         os->find_relaxed_input_section(this->relobj_, this->shndx_);
5419       gold_assert(poris != NULL);
5420       section_start = poris->address();
5421       section_size = convert_to_section_size_type(poris->data_size());
5422     }
5423
5424   // We always append this to the end of an EXIDX section.
5425   Arm_address output_address = section_start + section_size;
5426
5427   // Write out the entry.  The first word either points to the beginning
5428   // or after the end of a text section.  The second word is the special
5429   // EXIDX_CANTUNWIND value.
5430   uint32_t prel31_offset = output_address - this->address();
5431   if (Bits<31>::has_overflow32(offset))
5432     gold_error(_("PREL31 overflow in EXIDX_CANTUNWIND entry"));
5433   elfcpp::Swap_unaligned<32, big_endian>::writeval(oview,
5434                                                    prel31_offset & 0x7fffffffU);
5435   elfcpp::Swap_unaligned<32, big_endian>::writeval(oview + 4,
5436                                                    elfcpp::EXIDX_CANTUNWIND);
5437
5438   of->write_output_view(this->offset(), oview_size, oview);
5439 }
5440
5441 // Arm_exidx_merged_section methods.
5442
5443 // Constructor for Arm_exidx_merged_section.
5444 // EXIDX_INPUT_SECTION points to the unmodified EXIDX input section.
5445 // SECTION_OFFSET_MAP points to a section offset map describing how
5446 // parts of the input section are mapped to output.  DELETED_BYTES is
5447 // the number of bytes deleted from the EXIDX input section.
5448
5449 Arm_exidx_merged_section::Arm_exidx_merged_section(
5450     const Arm_exidx_input_section& exidx_input_section,
5451     const Arm_exidx_section_offset_map& section_offset_map,
5452     uint32_t deleted_bytes)
5453   : Output_relaxed_input_section(exidx_input_section.relobj(),
5454                                  exidx_input_section.shndx(),
5455                                  exidx_input_section.addralign()),
5456     exidx_input_section_(exidx_input_section),
5457     section_offset_map_(section_offset_map)
5458 {
5459   // If we retain or discard the whole EXIDX input section,  we would
5460   // not be here.
5461   gold_assert(deleted_bytes != 0
5462               && deleted_bytes != this->exidx_input_section_.size());
5463
5464   // Fix size here so that we do not need to implement set_final_data_size.
5465   uint32_t size = exidx_input_section.size() - deleted_bytes;
5466   this->set_data_size(size);
5467   this->fix_data_size();
5468
5469   // Allocate buffer for section contents and build contents.
5470   this->section_contents_ = new unsigned char[size];
5471 }
5472
5473 // Build the contents of a merged EXIDX output section.
5474
5475 void
5476 Arm_exidx_merged_section::build_contents(
5477     const unsigned char* original_contents,
5478     section_size_type original_size)
5479 {
5480   // Go over spans of input offsets and write only those that are not
5481   // discarded.
5482   section_offset_type in_start = 0;
5483   section_offset_type out_start = 0;
5484   section_offset_type in_max =
5485     convert_types<section_offset_type>(original_size);
5486   section_offset_type out_max =
5487     convert_types<section_offset_type>(this->data_size());
5488   for (Arm_exidx_section_offset_map::const_iterator p =
5489         this->section_offset_map_.begin();
5490       p != this->section_offset_map_.end();
5491       ++p)
5492     {
5493       section_offset_type in_end = p->first;
5494       gold_assert(in_end >= in_start);
5495       section_offset_type out_end = p->second;
5496       size_t in_chunk_size = convert_types<size_t>(in_end - in_start + 1);
5497       if (out_end != -1)
5498         {
5499           size_t out_chunk_size =
5500             convert_types<size_t>(out_end - out_start + 1);
5501
5502           gold_assert(out_chunk_size == in_chunk_size
5503                       && in_end < in_max && out_end < out_max);
5504
5505           memcpy(this->section_contents_ + out_start,
5506                  original_contents + in_start,
5507                  out_chunk_size);
5508           out_start += out_chunk_size;
5509         }
5510       in_start += in_chunk_size;
5511     }
5512 }
5513
5514 // Given an input OBJECT, an input section index SHNDX within that
5515 // object, and an OFFSET relative to the start of that input
5516 // section, return whether or not the corresponding offset within
5517 // the output section is known.  If this function returns true, it
5518 // sets *POUTPUT to the output offset.  The value -1 indicates that
5519 // this input offset is being discarded.
5520
5521 bool
5522 Arm_exidx_merged_section::do_output_offset(
5523     const Relobj* relobj,
5524     unsigned int shndx,
5525     section_offset_type offset,
5526     section_offset_type* poutput) const
5527 {
5528   // We only handle offsets for the original EXIDX input section.
5529   if (relobj != this->exidx_input_section_.relobj()
5530       || shndx != this->exidx_input_section_.shndx())
5531     return false;
5532
5533   section_offset_type section_size =
5534     convert_types<section_offset_type>(this->exidx_input_section_.size());
5535   if (offset < 0 || offset >= section_size)
5536     // Input offset is out of valid range.
5537     *poutput = -1;
5538   else
5539     {
5540       // We need to look up the section offset map to determine the output
5541       // offset.  Find the reference point in map that is first offset
5542       // bigger than or equal to this offset.
5543       Arm_exidx_section_offset_map::const_iterator p =
5544         this->section_offset_map_.lower_bound(offset);
5545
5546       // The section offset maps are build such that this should not happen if
5547       // input offset is in the valid range.
5548       gold_assert(p != this->section_offset_map_.end());
5549
5550       // We need to check if this is dropped.
5551      section_offset_type ref = p->first;
5552      section_offset_type mapped_ref = p->second;
5553
5554       if (mapped_ref != Arm_exidx_input_section::invalid_offset)
5555         // Offset is present in output.
5556         *poutput = mapped_ref + (offset - ref);
5557       else
5558         // Offset is discarded owing to EXIDX entry merging.
5559         *poutput = -1;
5560     }
5561
5562   return true;
5563 }
5564
5565 // Write this to output file OF.
5566
5567 void
5568 Arm_exidx_merged_section::do_write(Output_file* of)
5569 {
5570   off_t offset = this->offset();
5571   const section_size_type oview_size = this->data_size();
5572   unsigned char* const oview = of->get_output_view(offset, oview_size);
5573
5574   Output_section* os = this->relobj()->output_section(this->shndx());
5575   gold_assert(os != NULL);
5576
5577   memcpy(oview, this->section_contents_, oview_size);
5578   of->write_output_view(this->offset(), oview_size, oview);
5579 }
5580
5581 // Arm_exidx_fixup methods.
5582
5583 // Append an EXIDX_CANTUNWIND in the current output section if the last entry
5584 // is not an EXIDX_CANTUNWIND entry already.  The new EXIDX_CANTUNWIND entry
5585 // points to the end of the last seen EXIDX section.
5586
5587 void
5588 Arm_exidx_fixup::add_exidx_cantunwind_as_needed()
5589 {
5590   if (this->last_unwind_type_ != UT_EXIDX_CANTUNWIND
5591       && this->last_input_section_ != NULL)
5592     {
5593       Relobj* relobj = this->last_input_section_->relobj();
5594       unsigned int text_shndx = this->last_input_section_->link();
5595       Arm_exidx_cantunwind* cantunwind =
5596         new Arm_exidx_cantunwind(relobj, text_shndx);
5597       this->exidx_output_section_->add_output_section_data(cantunwind);
5598       this->last_unwind_type_ = UT_EXIDX_CANTUNWIND;
5599     }
5600 }
5601
5602 // Process an EXIDX section entry in input.  Return whether this entry
5603 // can be deleted in the output.  SECOND_WORD in the second word of the
5604 // EXIDX entry.
5605
5606 bool
5607 Arm_exidx_fixup::process_exidx_entry(uint32_t second_word)
5608 {
5609   bool delete_entry;
5610   if (second_word == elfcpp::EXIDX_CANTUNWIND)
5611     {
5612       // Merge if previous entry is also an EXIDX_CANTUNWIND.
5613       delete_entry = this->last_unwind_type_ == UT_EXIDX_CANTUNWIND;
5614       this->last_unwind_type_ = UT_EXIDX_CANTUNWIND;
5615     }
5616   else if ((second_word & 0x80000000) != 0)
5617     {
5618       // Inlined unwinding data.  Merge if equal to previous.
5619       delete_entry = (merge_exidx_entries_
5620                       && this->last_unwind_type_ == UT_INLINED_ENTRY
5621                       && this->last_inlined_entry_ == second_word);
5622       this->last_unwind_type_ = UT_INLINED_ENTRY;
5623       this->last_inlined_entry_ = second_word;
5624     }
5625   else
5626     {
5627       // Normal table entry.  In theory we could merge these too,
5628       // but duplicate entries are likely to be much less common.
5629       delete_entry = false;
5630       this->last_unwind_type_ = UT_NORMAL_ENTRY;
5631     }
5632   return delete_entry;
5633 }
5634
5635 // Update the current section offset map during EXIDX section fix-up.
5636 // If there is no map, create one.  INPUT_OFFSET is the offset of a
5637 // reference point, DELETED_BYTES is the number of deleted by in the
5638 // section so far.  If DELETE_ENTRY is true, the reference point and
5639 // all offsets after the previous reference point are discarded.
5640
5641 void
5642 Arm_exidx_fixup::update_offset_map(
5643     section_offset_type input_offset,
5644     section_size_type deleted_bytes,
5645     bool delete_entry)
5646 {
5647   if (this->section_offset_map_ == NULL)
5648     this->section_offset_map_ = new Arm_exidx_section_offset_map();
5649   section_offset_type output_offset;
5650   if (delete_entry)
5651     output_offset = Arm_exidx_input_section::invalid_offset;
5652   else
5653     output_offset = input_offset - deleted_bytes;
5654   (*this->section_offset_map_)[input_offset] = output_offset;
5655 }
5656
5657 // Process EXIDX_INPUT_SECTION for EXIDX entry merging.  Return the number of
5658 // bytes deleted.  SECTION_CONTENTS points to the contents of the EXIDX
5659 // section and SECTION_SIZE is the number of bytes pointed by SECTION_CONTENTS.
5660 // If some entries are merged, also store a pointer to a newly created
5661 // Arm_exidx_section_offset_map object in *PSECTION_OFFSET_MAP.  The caller
5662 // owns the map and is responsible for releasing it after use.
5663
5664 template<bool big_endian>
5665 uint32_t
5666 Arm_exidx_fixup::process_exidx_section(
5667     const Arm_exidx_input_section* exidx_input_section,
5668     const unsigned char* section_contents,
5669     section_size_type section_size,
5670     Arm_exidx_section_offset_map** psection_offset_map)
5671 {
5672   Relobj* relobj = exidx_input_section->relobj();
5673   unsigned shndx = exidx_input_section->shndx();
5674
5675   if ((section_size % 8) != 0)
5676     {
5677       // Something is wrong with this section.  Better not touch it.
5678       gold_error(_("uneven .ARM.exidx section size in %s section %u"),
5679                  relobj->name().c_str(), shndx);
5680       this->last_input_section_ = exidx_input_section;
5681       this->last_unwind_type_ = UT_NONE;
5682       return 0;
5683     }
5684
5685   uint32_t deleted_bytes = 0;
5686   bool prev_delete_entry = false;
5687   gold_assert(this->section_offset_map_ == NULL);
5688
5689   for (section_size_type i = 0; i < section_size; i += 8)
5690     {
5691       typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
5692       const Valtype* wv =
5693           reinterpret_cast<const Valtype*>(section_contents + i + 4);
5694       uint32_t second_word = elfcpp::Swap<32, big_endian>::readval(wv);
5695
5696       bool delete_entry = this->process_exidx_entry(second_word);
5697
5698       // Entry deletion causes changes in output offsets.  We use a std::map
5699       // to record these.  And entry (x, y) means input offset x
5700       // is mapped to output offset y.  If y is invalid_offset, then x is
5701       // dropped in the output.  Because of the way std::map::lower_bound
5702       // works, we record the last offset in a region w.r.t to keeping or
5703       // dropping.  If there is no entry (x0, y0) for an input offset x0,
5704       // the output offset y0 of it is determined by the output offset y1 of
5705       // the smallest input offset x1 > x0 that there is an (x1, y1) entry
5706       // in the map.  If y1 is not -1, then y0 = y1 + x0 - x1.  Otherwise, y1
5707       // y0 is also -1.
5708       if (delete_entry != prev_delete_entry && i != 0)
5709         this->update_offset_map(i - 1, deleted_bytes, prev_delete_entry);
5710
5711       // Update total deleted bytes for this entry.
5712       if (delete_entry)
5713         deleted_bytes += 8;
5714
5715       prev_delete_entry = delete_entry;
5716     }
5717
5718   // If section offset map is not NULL, make an entry for the end of
5719   // section.
5720   if (this->section_offset_map_ != NULL)
5721     update_offset_map(section_size - 1, deleted_bytes, prev_delete_entry);
5722
5723   *psection_offset_map = this->section_offset_map_;
5724   this->section_offset_map_ = NULL;
5725   this->last_input_section_ = exidx_input_section;
5726
5727   // Set the first output text section so that we can link the EXIDX output
5728   // section to it.  Ignore any EXIDX input section that is completely merged.
5729   if (this->first_output_text_section_ == NULL
5730       && deleted_bytes != section_size)
5731     {
5732       unsigned int link = exidx_input_section->link();
5733       Output_section* os = relobj->output_section(link);
5734       gold_assert(os != NULL);
5735       this->first_output_text_section_ = os;
5736     }
5737
5738   return deleted_bytes;
5739 }
5740
5741 // Arm_output_section methods.
5742
5743 // Create a stub group for input sections from BEGIN to END.  OWNER
5744 // points to the input section to be the owner a new stub table.
5745
5746 template<bool big_endian>
5747 void
5748 Arm_output_section<big_endian>::create_stub_group(
5749   Input_section_list::const_iterator begin,
5750   Input_section_list::const_iterator end,
5751   Input_section_list::const_iterator owner,
5752   Target_arm<big_endian>* target,
5753   std::vector<Output_relaxed_input_section*>* new_relaxed_sections,
5754   const Task* task)
5755 {
5756   // We use a different kind of relaxed section in an EXIDX section.
5757   // The static casting from Output_relaxed_input_section to
5758   // Arm_input_section is invalid in an EXIDX section.  We are okay
5759   // because we should not be calling this for an EXIDX section.
5760   gold_assert(this->type() != elfcpp::SHT_ARM_EXIDX);
5761
5762   // Currently we convert ordinary input sections into relaxed sections only
5763   // at this point but we may want to support creating relaxed input section
5764   // very early.  So we check here to see if owner is already a relaxed
5765   // section.
5766
5767   Arm_input_section<big_endian>* arm_input_section;
5768   if (owner->is_relaxed_input_section())
5769     {
5770       arm_input_section =
5771         Arm_input_section<big_endian>::as_arm_input_section(
5772           owner->relaxed_input_section());
5773     }
5774   else
5775     {
5776       gold_assert(owner->is_input_section());
5777       // Create a new relaxed input section.  We need to lock the original
5778       // file.
5779       Task_lock_obj<Object> tl(task, owner->relobj());
5780       arm_input_section =
5781         target->new_arm_input_section(owner->relobj(), owner->shndx());
5782       new_relaxed_sections->push_back(arm_input_section);
5783     }
5784
5785   // Create a stub table.
5786   Stub_table<big_endian>* stub_table =
5787     target->new_stub_table(arm_input_section);
5788
5789   arm_input_section->set_stub_table(stub_table);
5790
5791   Input_section_list::const_iterator p = begin;
5792   Input_section_list::const_iterator prev_p;
5793
5794   // Look for input sections or relaxed input sections in [begin ... end].
5795   do
5796     {
5797       if (p->is_input_section() || p->is_relaxed_input_section())
5798         {
5799           // The stub table information for input sections live
5800           // in their objects.
5801           Arm_relobj<big_endian>* arm_relobj =
5802             Arm_relobj<big_endian>::as_arm_relobj(p->relobj());
5803           arm_relobj->set_stub_table(p->shndx(), stub_table);
5804         }
5805       prev_p = p++;
5806     }
5807   while (prev_p != end);
5808 }
5809
5810 // Group input sections for stub generation.  GROUP_SIZE is roughly the limit
5811 // of stub groups.  We grow a stub group by adding input section until the
5812 // size is just below GROUP_SIZE.  The last input section will be converted
5813 // into a stub table.  If STUB_ALWAYS_AFTER_BRANCH is false, we also add
5814 // input section after the stub table, effectively double the group size.
5815 //
5816 // This is similar to the group_sections() function in elf32-arm.c but is
5817 // implemented differently.
5818
5819 template<bool big_endian>
5820 void
5821 Arm_output_section<big_endian>::group_sections(
5822     section_size_type group_size,
5823     bool stubs_always_after_branch,
5824     Target_arm<big_endian>* target,
5825     const Task* task)
5826 {
5827   // States for grouping.
5828   typedef enum
5829   {
5830     // No group is being built.
5831     NO_GROUP,
5832     // A group is being built but the stub table is not found yet.
5833     // We keep group a stub group until the size is just under GROUP_SIZE.
5834     // The last input section in the group will be used as the stub table.
5835     FINDING_STUB_SECTION,
5836     // A group is being built and we have already found a stub table.
5837     // We enter this state to grow a stub group by adding input section
5838     // after the stub table.  This effectively doubles the group size.
5839     HAS_STUB_SECTION
5840   } State;
5841
5842   // Any newly created relaxed sections are stored here.
5843   std::vector<Output_relaxed_input_section*> new_relaxed_sections;
5844
5845   State state = NO_GROUP;
5846   section_size_type off = 0;
5847   section_size_type group_begin_offset = 0;
5848   section_size_type group_end_offset = 0;
5849   section_size_type stub_table_end_offset = 0;
5850   Input_section_list::const_iterator group_begin =
5851     this->input_sections().end();
5852   Input_section_list::const_iterator stub_table =
5853     this->input_sections().end();
5854   Input_section_list::const_iterator group_end = this->input_sections().end();
5855   for (Input_section_list::const_iterator p = this->input_sections().begin();
5856        p != this->input_sections().end();
5857        ++p)
5858     {
5859       section_size_type section_begin_offset =
5860         align_address(off, p->addralign());
5861       section_size_type section_end_offset =
5862         section_begin_offset + p->data_size();
5863
5864       // Check to see if we should group the previously seen sections.
5865       switch (state)
5866         {
5867         case NO_GROUP:
5868           break;
5869
5870         case FINDING_STUB_SECTION:
5871           // Adding this section makes the group larger than GROUP_SIZE.
5872           if (section_end_offset - group_begin_offset >= group_size)
5873             {
5874               if (stubs_always_after_branch)
5875                 {
5876                   gold_assert(group_end != this->input_sections().end());
5877                   this->create_stub_group(group_begin, group_end, group_end,
5878                                           target, &new_relaxed_sections,
5879                                           task);
5880                   state = NO_GROUP;
5881                 }
5882               else
5883                 {
5884                   // But wait, there's more!  Input sections up to
5885                   // stub_group_size bytes after the stub table can be
5886                   // handled by it too.
5887                   state = HAS_STUB_SECTION;
5888                   stub_table = group_end;
5889                   stub_table_end_offset = group_end_offset;
5890                 }
5891             }
5892             break;
5893
5894         case HAS_STUB_SECTION:
5895           // Adding this section makes the post stub-section group larger
5896           // than GROUP_SIZE.
5897           if (section_end_offset - stub_table_end_offset >= group_size)
5898            {
5899              gold_assert(group_end != this->input_sections().end());
5900              this->create_stub_group(group_begin, group_end, stub_table,
5901                                      target, &new_relaxed_sections, task);
5902              state = NO_GROUP;
5903            }
5904            break;
5905
5906           default:
5907             gold_unreachable();
5908         }
5909
5910       // If we see an input section and currently there is no group, start
5911       // a new one.  Skip any empty sections.  We look at the data size
5912       // instead of calling p->relobj()->section_size() to avoid locking.
5913       if ((p->is_input_section() || p->is_relaxed_input_section())
5914           && (p->data_size() != 0))
5915         {
5916           if (state == NO_GROUP)
5917             {
5918               state = FINDING_STUB_SECTION;
5919               group_begin = p;
5920               group_begin_offset = section_begin_offset;
5921             }
5922
5923           // Keep track of the last input section seen.
5924           group_end = p;
5925           group_end_offset = section_end_offset;
5926         }
5927
5928       off = section_end_offset;
5929     }
5930
5931   // Create a stub group for any ungrouped sections.
5932   if (state == FINDING_STUB_SECTION || state == HAS_STUB_SECTION)
5933     {
5934       gold_assert(group_end != this->input_sections().end());
5935       this->create_stub_group(group_begin, group_end,
5936                               (state == FINDING_STUB_SECTION
5937                                ? group_end
5938                                : stub_table),
5939                                target, &new_relaxed_sections, task);
5940     }
5941
5942   // Convert input section into relaxed input section in a batch.
5943   if (!new_relaxed_sections.empty())
5944     this->convert_input_sections_to_relaxed_sections(new_relaxed_sections);
5945
5946   // Update the section offsets
5947   for (size_t i = 0; i < new_relaxed_sections.size(); ++i)
5948     {
5949       Arm_relobj<big_endian>* arm_relobj =
5950         Arm_relobj<big_endian>::as_arm_relobj(
5951           new_relaxed_sections[i]->relobj());
5952       unsigned int shndx = new_relaxed_sections[i]->shndx();
5953       // Tell Arm_relobj that this input section is converted.
5954       arm_relobj->convert_input_section_to_relaxed_section(shndx);
5955     }
5956 }
5957
5958 // Append non empty text sections in this to LIST in ascending
5959 // order of their position in this.
5960
5961 template<bool big_endian>
5962 void
5963 Arm_output_section<big_endian>::append_text_sections_to_list(
5964     Text_section_list* list)
5965 {
5966   gold_assert((this->flags() & elfcpp::SHF_ALLOC) != 0);
5967
5968   for (Input_section_list::const_iterator p = this->input_sections().begin();
5969        p != this->input_sections().end();
5970        ++p)
5971     {
5972       // We only care about plain or relaxed input sections.  We also
5973       // ignore any merged sections.
5974       if (p->is_input_section() || p->is_relaxed_input_section())
5975         list->push_back(Text_section_list::value_type(p->relobj(),
5976                                                       p->shndx()));
5977     }
5978 }
5979
5980 template<bool big_endian>
5981 void
5982 Arm_output_section<big_endian>::fix_exidx_coverage(
5983     Layout* layout,
5984     const Text_section_list& sorted_text_sections,
5985     Symbol_table* symtab,
5986     bool merge_exidx_entries,
5987     const Task* task)
5988 {
5989   // We should only do this for the EXIDX output section.
5990   gold_assert(this->type() == elfcpp::SHT_ARM_EXIDX);
5991
5992   // We don't want the relaxation loop to undo these changes, so we discard
5993   // the current saved states and take another one after the fix-up.
5994   this->discard_states();
5995
5996   // Remove all input sections.
5997   uint64_t address = this->address();
5998   typedef std::list<Output_section::Input_section> Input_section_list;
5999   Input_section_list input_sections;
6000   this->reset_address_and_file_offset();
6001   this->get_input_sections(address, std::string(""), &input_sections);
6002
6003   if (!this->input_sections().empty())
6004     gold_error(_("Found non-EXIDX input sections in EXIDX output section"));
6005
6006   // Go through all the known input sections and record them.
6007   typedef Unordered_set<Section_id, Section_id_hash> Section_id_set;
6008   typedef Unordered_map<Section_id, const Output_section::Input_section*,
6009                         Section_id_hash> Text_to_exidx_map;
6010   Text_to_exidx_map text_to_exidx_map;
6011   for (Input_section_list::const_iterator p = input_sections.begin();
6012        p != input_sections.end();
6013        ++p)
6014     {
6015       // This should never happen.  At this point, we should only see
6016       // plain EXIDX input sections.
6017       gold_assert(!p->is_relaxed_input_section());
6018       text_to_exidx_map[Section_id(p->relobj(), p->shndx())] = &(*p);
6019     }
6020
6021   Arm_exidx_fixup exidx_fixup(this, merge_exidx_entries);
6022
6023   // Go over the sorted text sections.
6024   typedef Unordered_set<Section_id, Section_id_hash> Section_id_set;
6025   Section_id_set processed_input_sections;
6026   for (Text_section_list::const_iterator p = sorted_text_sections.begin();
6027        p != sorted_text_sections.end();
6028        ++p)
6029     {
6030       Relobj* relobj = p->first;
6031       unsigned int shndx = p->second;
6032
6033       Arm_relobj<big_endian>* arm_relobj =
6034          Arm_relobj<big_endian>::as_arm_relobj(relobj);
6035       const Arm_exidx_input_section* exidx_input_section =
6036          arm_relobj->exidx_input_section_by_link(shndx);
6037
6038       // If this text section has no EXIDX section or if the EXIDX section
6039       // has errors, force an EXIDX_CANTUNWIND entry pointing to the end
6040       // of the last seen EXIDX section.
6041       if (exidx_input_section == NULL || exidx_input_section->has_errors())
6042         {
6043           exidx_fixup.add_exidx_cantunwind_as_needed();
6044           continue;
6045         }
6046
6047       Relobj* exidx_relobj = exidx_input_section->relobj();
6048       unsigned int exidx_shndx = exidx_input_section->shndx();
6049       Section_id sid(exidx_relobj, exidx_shndx);
6050       Text_to_exidx_map::const_iterator iter = text_to_exidx_map.find(sid);
6051       if (iter == text_to_exidx_map.end())
6052         {
6053           // This is odd.  We have not seen this EXIDX input section before.
6054           // We cannot do fix-up.  If we saw a SECTIONS clause in a script,
6055           // issue a warning instead.  We assume the user knows what he
6056           // or she is doing.  Otherwise, this is an error.
6057           if (layout->script_options()->saw_sections_clause())
6058             gold_warning(_("unwinding may not work because EXIDX input section"
6059                            " %u of %s is not in EXIDX output section"),
6060                          exidx_shndx, exidx_relobj->name().c_str());
6061           else
6062             gold_error(_("unwinding may not work because EXIDX input section"
6063                          " %u of %s is not in EXIDX output section"),
6064                        exidx_shndx, exidx_relobj->name().c_str());
6065
6066           exidx_fixup.add_exidx_cantunwind_as_needed();
6067           continue;
6068         }
6069
6070       // We need to access the contents of the EXIDX section, lock the
6071       // object here.
6072       Task_lock_obj<Object> tl(task, exidx_relobj);
6073       section_size_type exidx_size;
6074       const unsigned char* exidx_contents =
6075         exidx_relobj->section_contents(exidx_shndx, &exidx_size, false);
6076
6077       // Fix up coverage and append input section to output data list.
6078       Arm_exidx_section_offset_map* section_offset_map = NULL;
6079       uint32_t deleted_bytes =
6080         exidx_fixup.process_exidx_section<big_endian>(exidx_input_section,
6081                                                       exidx_contents,
6082                                                       exidx_size,
6083                                                       &section_offset_map);
6084
6085       if (deleted_bytes == exidx_input_section->size())
6086         {
6087           // The whole EXIDX section got merged.  Remove it from output.
6088           gold_assert(section_offset_map == NULL);
6089           exidx_relobj->set_output_section(exidx_shndx, NULL);
6090
6091           // All local symbols defined in this input section will be dropped.
6092           // We need to adjust output local symbol count.
6093           arm_relobj->set_output_local_symbol_count_needs_update();
6094         }
6095       else if (deleted_bytes > 0)
6096         {
6097           // Some entries are merged.  We need to convert this EXIDX input
6098           // section into a relaxed section.
6099           gold_assert(section_offset_map != NULL);
6100
6101           Arm_exidx_merged_section* merged_section =
6102             new Arm_exidx_merged_section(*exidx_input_section,
6103                                          *section_offset_map, deleted_bytes);
6104           merged_section->build_contents(exidx_contents, exidx_size);
6105
6106           const std::string secname = exidx_relobj->section_name(exidx_shndx);
6107           this->add_relaxed_input_section(layout, merged_section, secname);
6108           arm_relobj->convert_input_section_to_relaxed_section(exidx_shndx);
6109
6110           // All local symbols defined in discarded portions of this input
6111           // section will be dropped.  We need to adjust output local symbol
6112           // count.
6113           arm_relobj->set_output_local_symbol_count_needs_update();
6114         }
6115       else
6116         {
6117           // Just add back the EXIDX input section.
6118           gold_assert(section_offset_map == NULL);
6119           const Output_section::Input_section* pis = iter->second;
6120           gold_assert(pis->is_input_section());
6121           this->add_script_input_section(*pis);
6122         }
6123
6124       processed_input_sections.insert(Section_id(exidx_relobj, exidx_shndx));
6125     }
6126
6127   // Insert an EXIDX_CANTUNWIND entry at the end of output if necessary.
6128   exidx_fixup.add_exidx_cantunwind_as_needed();
6129
6130   // Remove any known EXIDX input sections that are not processed.
6131   for (Input_section_list::const_iterator p = input_sections.begin();
6132        p != input_sections.end();
6133        ++p)
6134     {
6135       if (processed_input_sections.find(Section_id(p->relobj(), p->shndx()))
6136           == processed_input_sections.end())
6137         {
6138           // We discard a known EXIDX section because its linked
6139           // text section has been folded by ICF.  We also discard an
6140           // EXIDX section with error, the output does not matter in this
6141           // case.  We do this to avoid triggering asserts.
6142           Arm_relobj<big_endian>* arm_relobj =
6143             Arm_relobj<big_endian>::as_arm_relobj(p->relobj());
6144           const Arm_exidx_input_section* exidx_input_section =
6145             arm_relobj->exidx_input_section_by_shndx(p->shndx());
6146           gold_assert(exidx_input_section != NULL);
6147           if (!exidx_input_section->has_errors())
6148             {
6149               unsigned int text_shndx = exidx_input_section->link();
6150               gold_assert(symtab->is_section_folded(p->relobj(), text_shndx));
6151             }
6152
6153           // Remove this from link.  We also need to recount the
6154           // local symbols.
6155           p->relobj()->set_output_section(p->shndx(), NULL);
6156           arm_relobj->set_output_local_symbol_count_needs_update();
6157         }
6158     }
6159
6160   // Link exidx output section to the first seen output section and
6161   // set correct entry size.
6162   this->set_link_section(exidx_fixup.first_output_text_section());
6163   this->set_entsize(8);
6164
6165   // Make changes permanent.
6166   this->save_states();
6167   this->set_section_offsets_need_adjustment();
6168 }
6169
6170 // Link EXIDX output sections to text output sections.
6171
6172 template<bool big_endian>
6173 void
6174 Arm_output_section<big_endian>::set_exidx_section_link()
6175 {
6176   gold_assert(this->type() == elfcpp::SHT_ARM_EXIDX);
6177   if (!this->input_sections().empty())
6178     {
6179       Input_section_list::const_iterator p = this->input_sections().begin();
6180       Arm_relobj<big_endian>* arm_relobj =
6181         Arm_relobj<big_endian>::as_arm_relobj(p->relobj());
6182       unsigned exidx_shndx = p->shndx();
6183       const Arm_exidx_input_section* exidx_input_section =
6184         arm_relobj->exidx_input_section_by_shndx(exidx_shndx);
6185       gold_assert(exidx_input_section != NULL);
6186       unsigned int text_shndx = exidx_input_section->link();
6187       Output_section* os = arm_relobj->output_section(text_shndx);
6188       this->set_link_section(os);
6189     }
6190 }
6191
6192 // Arm_relobj methods.
6193
6194 // Determine if an input section is scannable for stub processing.  SHDR is
6195 // the header of the section and SHNDX is the section index.  OS is the output
6196 // section for the input section and SYMTAB is the global symbol table used to
6197 // look up ICF information.
6198
6199 template<bool big_endian>
6200 bool
6201 Arm_relobj<big_endian>::section_is_scannable(
6202     const elfcpp::Shdr<32, big_endian>& shdr,
6203     unsigned int shndx,
6204     const Output_section* os,
6205     const Symbol_table* symtab)
6206 {
6207   // Skip any empty sections, unallocated sections or sections whose
6208   // type are not SHT_PROGBITS.
6209   if (shdr.get_sh_size() == 0
6210       || (shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0
6211       || shdr.get_sh_type() != elfcpp::SHT_PROGBITS)
6212     return false;
6213
6214   // Skip any discarded or ICF'ed sections.
6215   if (os == NULL || symtab->is_section_folded(this, shndx))
6216     return false;
6217
6218   // If this requires special offset handling, check to see if it is
6219   // a relaxed section.  If this is not, then it is a merged section that
6220   // we cannot handle.
6221   if (this->is_output_section_offset_invalid(shndx))
6222     {
6223       const Output_relaxed_input_section* poris =
6224         os->find_relaxed_input_section(this, shndx);
6225       if (poris == NULL)
6226         return false;
6227     }
6228
6229   return true;
6230 }
6231
6232 // Determine if we want to scan the SHNDX-th section for relocation stubs.
6233 // This is a helper for Arm_relobj::scan_sections_for_stubs() below.
6234
6235 template<bool big_endian>
6236 bool
6237 Arm_relobj<big_endian>::section_needs_reloc_stub_scanning(
6238     const elfcpp::Shdr<32, big_endian>& shdr,
6239     const Relobj::Output_sections& out_sections,
6240     const Symbol_table* symtab,
6241     const unsigned char* pshdrs)
6242 {
6243   unsigned int sh_type = shdr.get_sh_type();
6244   if (sh_type != elfcpp::SHT_REL && sh_type != elfcpp::SHT_RELA)
6245     return false;
6246
6247   // Ignore empty section.
6248   off_t sh_size = shdr.get_sh_size();
6249   if (sh_size == 0)
6250     return false;
6251
6252   // Ignore reloc section with unexpected symbol table.  The
6253   // error will be reported in the final link.
6254   if (this->adjust_shndx(shdr.get_sh_link()) != this->symtab_shndx())
6255     return false;
6256
6257   unsigned int reloc_size;
6258   if (sh_type == elfcpp::SHT_REL)
6259     reloc_size = elfcpp::Elf_sizes<32>::rel_size;
6260   else
6261     reloc_size = elfcpp::Elf_sizes<32>::rela_size;
6262
6263   // Ignore reloc section with unexpected entsize or uneven size.
6264   // The error will be reported in the final link.
6265   if (reloc_size != shdr.get_sh_entsize() || sh_size % reloc_size != 0)
6266     return false;
6267
6268   // Ignore reloc section with bad info.  This error will be
6269   // reported in the final link.
6270   unsigned int index = this->adjust_shndx(shdr.get_sh_info());
6271   if (index >= this->shnum())
6272     return false;
6273
6274   const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
6275   const elfcpp::Shdr<32, big_endian> text_shdr(pshdrs + index * shdr_size);
6276   return this->section_is_scannable(text_shdr, index,
6277                                    out_sections[index], symtab);
6278 }
6279
6280 // Return the output address of either a plain input section or a relaxed
6281 // input section.  SHNDX is the section index.  We define and use this
6282 // instead of calling Output_section::output_address because that is slow
6283 // for large output.
6284
6285 template<bool big_endian>
6286 Arm_address
6287 Arm_relobj<big_endian>::simple_input_section_output_address(
6288     unsigned int shndx,
6289     Output_section* os)
6290 {
6291   if (this->is_output_section_offset_invalid(shndx))
6292     {
6293       const Output_relaxed_input_section* poris =
6294         os->find_relaxed_input_section(this, shndx);
6295       // We do not handle merged sections here.
6296       gold_assert(poris != NULL);
6297       return poris->address();
6298     }
6299   else
6300     return os->address() + this->get_output_section_offset(shndx);
6301 }
6302
6303 // Determine if we want to scan the SHNDX-th section for non-relocation stubs.
6304 // This is a helper for Arm_relobj::scan_sections_for_stubs() below.
6305
6306 template<bool big_endian>
6307 bool
6308 Arm_relobj<big_endian>::section_needs_cortex_a8_stub_scanning(
6309     const elfcpp::Shdr<32, big_endian>& shdr,
6310     unsigned int shndx,
6311     Output_section* os,
6312     const Symbol_table* symtab)
6313 {
6314   if (!this->section_is_scannable(shdr, shndx, os, symtab))
6315     return false;
6316
6317   // If the section does not cross any 4K-boundaries, it does not need to
6318   // be scanned.
6319   Arm_address address = this->simple_input_section_output_address(shndx, os);
6320   if ((address & ~0xfffU) == ((address + shdr.get_sh_size() - 1) & ~0xfffU))
6321     return false;
6322
6323   return true;
6324 }
6325
6326 // Scan a section for Cortex-A8 workaround.
6327
6328 template<bool big_endian>
6329 void
6330 Arm_relobj<big_endian>::scan_section_for_cortex_a8_erratum(
6331     const elfcpp::Shdr<32, big_endian>& shdr,
6332     unsigned int shndx,
6333     Output_section* os,
6334     Target_arm<big_endian>* arm_target)
6335 {
6336   // Look for the first mapping symbol in this section.  It should be
6337   // at (shndx, 0).
6338   Mapping_symbol_position section_start(shndx, 0);
6339   typename Mapping_symbols_info::const_iterator p =
6340     this->mapping_symbols_info_.lower_bound(section_start);
6341
6342   // There are no mapping symbols for this section.  Treat it as a data-only
6343   // section.
6344   if (p == this->mapping_symbols_info_.end() || p->first.first != shndx)
6345     return;
6346
6347   Arm_address output_address =
6348     this->simple_input_section_output_address(shndx, os);
6349
6350   // Get the section contents.
6351   section_size_type input_view_size = 0;
6352   const unsigned char* input_view =
6353     this->section_contents(shndx, &input_view_size, false);
6354
6355   // We need to go through the mapping symbols to determine what to
6356   // scan.  There are two reasons.  First, we should look at THUMB code and
6357   // THUMB code only.  Second, we only want to look at the 4K-page boundary
6358   // to speed up the scanning.
6359
6360   while (p != this->mapping_symbols_info_.end()
6361         && p->first.first == shndx)
6362     {
6363       typename Mapping_symbols_info::const_iterator next =
6364         this->mapping_symbols_info_.upper_bound(p->first);
6365
6366       // Only scan part of a section with THUMB code.
6367       if (p->second == 't')
6368         {
6369           // Determine the end of this range.
6370           section_size_type span_start =
6371             convert_to_section_size_type(p->first.second);
6372           section_size_type span_end;
6373           if (next != this->mapping_symbols_info_.end()
6374               && next->first.first == shndx)
6375             span_end = convert_to_section_size_type(next->first.second);
6376           else
6377             span_end = convert_to_section_size_type(shdr.get_sh_size());
6378
6379           if (((span_start + output_address) & ~0xfffUL)
6380               != ((span_end + output_address - 1) & ~0xfffUL))
6381             {
6382               arm_target->scan_span_for_cortex_a8_erratum(this, shndx,
6383                                                           span_start, span_end,
6384                                                           input_view,
6385                                                           output_address);
6386             }
6387         }
6388
6389       p = next;
6390     }
6391 }
6392
6393 // Scan relocations for stub generation.
6394
6395 template<bool big_endian>
6396 void
6397 Arm_relobj<big_endian>::scan_sections_for_stubs(
6398     Target_arm<big_endian>* arm_target,
6399     const Symbol_table* symtab,
6400     const Layout* layout)
6401 {
6402   unsigned int shnum = this->shnum();
6403   const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
6404
6405   // Read the section headers.
6406   const unsigned char* pshdrs = this->get_view(this->elf_file()->shoff(),
6407                                                shnum * shdr_size,
6408                                                true, true);
6409
6410   // To speed up processing, we set up hash tables for fast lookup of
6411   // input offsets to output addresses.
6412   this->initialize_input_to_output_maps();
6413
6414   const Relobj::Output_sections& out_sections(this->output_sections());
6415
6416   Relocate_info<32, big_endian> relinfo;
6417   relinfo.symtab = symtab;
6418   relinfo.layout = layout;
6419   relinfo.object = this;
6420
6421   // Do relocation stubs scanning.
6422   const unsigned char* p = pshdrs + shdr_size;
6423   for (unsigned int i = 1; i < shnum; ++i, p += shdr_size)
6424     {
6425       const elfcpp::Shdr<32, big_endian> shdr(p);
6426       if (this->section_needs_reloc_stub_scanning(shdr, out_sections, symtab,
6427                                                   pshdrs))
6428         {
6429           unsigned int index = this->adjust_shndx(shdr.get_sh_info());
6430           Arm_address output_offset = this->get_output_section_offset(index);
6431           Arm_address output_address;
6432           if (output_offset != invalid_address)
6433             output_address = out_sections[index]->address() + output_offset;
6434           else
6435             {
6436               // Currently this only happens for a relaxed section.
6437               const Output_relaxed_input_section* poris =
6438               out_sections[index]->find_relaxed_input_section(this, index);
6439               gold_assert(poris != NULL);
6440               output_address = poris->address();
6441             }
6442
6443           // Get the relocations.
6444           const unsigned char* prelocs = this->get_view(shdr.get_sh_offset(),
6445                                                         shdr.get_sh_size(),
6446                                                         true, false);
6447
6448           // Get the section contents.  This does work for the case in which
6449           // we modify the contents of an input section.  We need to pass the
6450           // output view under such circumstances.
6451           section_size_type input_view_size = 0;
6452           const unsigned char* input_view =
6453             this->section_contents(index, &input_view_size, false);
6454
6455           relinfo.reloc_shndx = i;
6456           relinfo.data_shndx = index;
6457           unsigned int sh_type = shdr.get_sh_type();
6458           unsigned int reloc_size;
6459           if (sh_type == elfcpp::SHT_REL)
6460             reloc_size = elfcpp::Elf_sizes<32>::rel_size;
6461           else
6462             reloc_size = elfcpp::Elf_sizes<32>::rela_size;
6463
6464           Output_section* os = out_sections[index];
6465           arm_target->scan_section_for_stubs(&relinfo, sh_type, prelocs,
6466                                              shdr.get_sh_size() / reloc_size,
6467                                              os,
6468                                              output_offset == invalid_address,
6469                                              input_view, output_address,
6470                                              input_view_size);
6471         }
6472     }
6473
6474   // Do Cortex-A8 erratum stubs scanning.  This has to be done for a section
6475   // after its relocation section, if there is one, is processed for
6476   // relocation stubs.  Merging this loop with the one above would have been
6477   // complicated since we would have had to make sure that relocation stub
6478   // scanning is done first.
6479   if (arm_target->fix_cortex_a8())
6480     {
6481       const unsigned char* p = pshdrs + shdr_size;
6482       for (unsigned int i = 1; i < shnum; ++i, p += shdr_size)
6483         {
6484           const elfcpp::Shdr<32, big_endian> shdr(p);
6485           if (this->section_needs_cortex_a8_stub_scanning(shdr, i,
6486                                                           out_sections[i],
6487                                                           symtab))
6488             this->scan_section_for_cortex_a8_erratum(shdr, i, out_sections[i],
6489                                                      arm_target);
6490         }
6491     }
6492
6493   // After we've done the relocations, we release the hash tables,
6494   // since we no longer need them.
6495   this->free_input_to_output_maps();
6496 }
6497
6498 // Count the local symbols.  The ARM backend needs to know if a symbol
6499 // is a THUMB function or not.  For global symbols, it is easy because
6500 // the Symbol object keeps the ELF symbol type.  For local symbol it is
6501 // harder because we cannot access this information.   So we override the
6502 // do_count_local_symbol in parent and scan local symbols to mark
6503 // THUMB functions.  This is not the most efficient way but I do not want to
6504 // slow down other ports by calling a per symbol target hook inside
6505 // Sized_relobj_file<size, big_endian>::do_count_local_symbols.
6506
6507 template<bool big_endian>
6508 void
6509 Arm_relobj<big_endian>::do_count_local_symbols(
6510     Stringpool_template<char>* pool,
6511     Stringpool_template<char>* dynpool)
6512 {
6513   // We need to fix-up the values of any local symbols whose type are
6514   // STT_ARM_TFUNC.
6515
6516   // Ask parent to count the local symbols.
6517   Sized_relobj_file<32, big_endian>::do_count_local_symbols(pool, dynpool);
6518   const unsigned int loccount = this->local_symbol_count();
6519   if (loccount == 0)
6520     return;
6521
6522   // Initialize the thumb function bit-vector.
6523   std::vector<bool> empty_vector(loccount, false);
6524   this->local_symbol_is_thumb_function_.swap(empty_vector);
6525
6526   // Read the symbol table section header.
6527   const unsigned int symtab_shndx = this->symtab_shndx();
6528   elfcpp::Shdr<32, big_endian>
6529       symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
6530   gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
6531
6532   // Read the local symbols.
6533   const int sym_size =elfcpp::Elf_sizes<32>::sym_size;
6534   gold_assert(loccount == symtabshdr.get_sh_info());
6535   off_t locsize = loccount * sym_size;
6536   const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
6537                                               locsize, true, true);
6538
6539   // For mapping symbol processing, we need to read the symbol names.
6540   unsigned int strtab_shndx = this->adjust_shndx(symtabshdr.get_sh_link());
6541   if (strtab_shndx >= this->shnum())
6542     {
6543       this->error(_("invalid symbol table name index: %u"), strtab_shndx);
6544       return;
6545     }
6546
6547   elfcpp::Shdr<32, big_endian>
6548     strtabshdr(this, this->elf_file()->section_header(strtab_shndx));
6549   if (strtabshdr.get_sh_type() != elfcpp::SHT_STRTAB)
6550     {
6551       this->error(_("symbol table name section has wrong type: %u"),
6552                   static_cast<unsigned int>(strtabshdr.get_sh_type()));
6553       return;
6554     }
6555   const char* pnames =
6556     reinterpret_cast<const char*>(this->get_view(strtabshdr.get_sh_offset(),
6557                                                  strtabshdr.get_sh_size(),
6558                                                  false, false));
6559
6560   // Loop over the local symbols and mark any local symbols pointing
6561   // to THUMB functions.
6562
6563   // Skip the first dummy symbol.
6564   psyms += sym_size;
6565   typename Sized_relobj_file<32, big_endian>::Local_values* plocal_values =
6566     this->local_values();
6567   for (unsigned int i = 1; i < loccount; ++i, psyms += sym_size)
6568     {
6569       elfcpp::Sym<32, big_endian> sym(psyms);
6570       elfcpp::STT st_type = sym.get_st_type();
6571       Symbol_value<32>& lv((*plocal_values)[i]);
6572       Arm_address input_value = lv.input_value();
6573
6574       // Check to see if this is a mapping symbol.
6575       const char* sym_name = pnames + sym.get_st_name();
6576       if (Target_arm<big_endian>::is_mapping_symbol_name(sym_name))
6577         {
6578           bool is_ordinary;
6579           unsigned int input_shndx =
6580             this->adjust_sym_shndx(i, sym.get_st_shndx(), &is_ordinary);
6581           gold_assert(is_ordinary);
6582
6583           // Strip of LSB in case this is a THUMB symbol.
6584           Mapping_symbol_position msp(input_shndx, input_value & ~1U);
6585           this->mapping_symbols_info_[msp] = sym_name[1];
6586         }
6587
6588       if (st_type == elfcpp::STT_ARM_TFUNC
6589           || (st_type == elfcpp::STT_FUNC && ((input_value & 1) != 0)))
6590         {
6591           // This is a THUMB function.  Mark this and canonicalize the
6592           // symbol value by setting LSB.
6593           this->local_symbol_is_thumb_function_[i] = true;
6594           if ((input_value & 1) == 0)
6595             lv.set_input_value(input_value | 1);
6596         }
6597     }
6598 }
6599
6600 // Relocate sections.
6601 template<bool big_endian>
6602 void
6603 Arm_relobj<big_endian>::do_relocate_sections(
6604     const Symbol_table* symtab,
6605     const Layout* layout,
6606     const unsigned char* pshdrs,
6607     Output_file* of,
6608     typename Sized_relobj_file<32, big_endian>::Views* pviews)
6609 {
6610   // Relocate the section data.
6611   this->relocate_section_range(symtab, layout, pshdrs, of, pviews,
6612                                1, this->shnum() - 1);
6613
6614   // We do not generate stubs if doing a relocatable link.
6615   if (parameters->options().relocatable())
6616     return;
6617
6618   // Relocate stub tables.
6619   unsigned int shnum = this->shnum();
6620
6621   Target_arm<big_endian>* arm_target =
6622     Target_arm<big_endian>::default_target();
6623
6624   Relocate_info<32, big_endian> relinfo;
6625   relinfo.symtab = symtab;
6626   relinfo.layout = layout;
6627   relinfo.object = this;
6628
6629   for (unsigned int i = 1; i < shnum; ++i)
6630     {
6631       Arm_input_section<big_endian>* arm_input_section =
6632         arm_target->find_arm_input_section(this, i);
6633
6634       if (arm_input_section != NULL
6635           && arm_input_section->is_stub_table_owner()
6636           && !arm_input_section->stub_table()->empty())
6637         {
6638           // We cannot discard a section if it owns a stub table.
6639           Output_section* os = this->output_section(i);
6640           gold_assert(os != NULL);
6641
6642           relinfo.reloc_shndx = elfcpp::SHN_UNDEF;
6643           relinfo.reloc_shdr = NULL;
6644           relinfo.data_shndx = i;
6645           relinfo.data_shdr = pshdrs + i * elfcpp::Elf_sizes<32>::shdr_size;
6646
6647           gold_assert((*pviews)[i].view != NULL);
6648
6649           // We are passed the output section view.  Adjust it to cover the
6650           // stub table only.
6651           Stub_table<big_endian>* stub_table = arm_input_section->stub_table();
6652           gold_assert((stub_table->address() >= (*pviews)[i].address)
6653                       && ((stub_table->address() + stub_table->data_size())
6654                           <= (*pviews)[i].address + (*pviews)[i].view_size));
6655
6656           off_t offset = stub_table->address() - (*pviews)[i].address;
6657           unsigned char* view = (*pviews)[i].view + offset;
6658           Arm_address address = stub_table->address();
6659           section_size_type view_size = stub_table->data_size();
6660
6661           stub_table->relocate_stubs(&relinfo, arm_target, os, view, address,
6662                                      view_size);
6663         }
6664
6665       // Apply Cortex A8 workaround if applicable.
6666       if (this->section_has_cortex_a8_workaround(i))
6667         {
6668           unsigned char* view = (*pviews)[i].view;
6669           Arm_address view_address = (*pviews)[i].address;
6670           section_size_type view_size = (*pviews)[i].view_size;
6671           Stub_table<big_endian>* stub_table = this->stub_tables_[i];
6672
6673           // Adjust view to cover section.
6674           Output_section* os = this->output_section(i);
6675           gold_assert(os != NULL);
6676           Arm_address section_address =
6677             this->simple_input_section_output_address(i, os);
6678           uint64_t section_size = this->section_size(i);
6679
6680           gold_assert(section_address >= view_address
6681                       && ((section_address + section_size)
6682                           <= (view_address + view_size)));
6683
6684           unsigned char* section_view = view + (section_address - view_address);
6685
6686           // Apply the Cortex-A8 workaround to the output address range
6687           // corresponding to this input section.
6688           stub_table->apply_cortex_a8_workaround_to_address_range(
6689               arm_target,
6690               section_view,
6691               section_address,
6692               section_size);
6693         }
6694         // BE8 swapping
6695         if (parameters->options().be8())
6696           {
6697             section_size_type  span_start, span_end;
6698             elfcpp::Shdr<32, big_endian>
6699               shdr(pshdrs + i * elfcpp::Elf_sizes<32>::shdr_size);
6700             Mapping_symbol_position section_start(i, 0);
6701             typename Mapping_symbols_info::const_iterator p =
6702               this->mapping_symbols_info_.lower_bound(section_start);
6703             unsigned char* view = (*pviews)[i].view;
6704             Arm_address view_address = (*pviews)[i].address;
6705             section_size_type view_size = (*pviews)[i].view_size;
6706             while (p != this->mapping_symbols_info_.end()
6707                    && p->first.first == i)
6708               {
6709                 typename Mapping_symbols_info::const_iterator next =
6710                   this->mapping_symbols_info_.upper_bound(p->first);
6711
6712                 // Only swap arm or thumb code.
6713                 if ((p->second == 'a') || (p->second == 't'))
6714                   {
6715                     Output_section* os = this->output_section(i);
6716                     gold_assert(os != NULL);
6717                     Arm_address section_address =
6718                       this->simple_input_section_output_address(i, os);
6719                     span_start = convert_to_section_size_type(p->first.second);
6720                     if (next != this->mapping_symbols_info_.end()
6721                         && next->first.first == i)
6722                       span_end =
6723                         convert_to_section_size_type(next->first.second);
6724                     else
6725                       span_end =
6726                         convert_to_section_size_type(shdr.get_sh_size());
6727                     unsigned char* section_view =
6728                       view + (section_address - view_address);
6729                     uint64_t section_size = this->section_size(i);
6730
6731                     gold_assert(section_address >= view_address
6732                                 && ((section_address + section_size)
6733                                     <= (view_address + view_size)));
6734
6735                     // Set Output view for swapping
6736                     unsigned char *oview = section_view + span_start;
6737                     unsigned int index = 0;
6738                     if (p->second == 'a')
6739                       {
6740                         while (index + 3 < (span_end - span_start))
6741                           {
6742                             typedef typename elfcpp::Swap<32, big_endian>
6743                                                      ::Valtype Valtype;
6744                             Valtype* wv =
6745                               reinterpret_cast<Valtype*>(oview+index);
6746                             uint32_t val = elfcpp::Swap<32, false>::readval(wv);
6747                             elfcpp::Swap<32, true>::writeval(wv, val);
6748                             index += 4;
6749                           }
6750                       }
6751                     else if (p->second == 't')
6752                       {
6753                         while (index + 1 < (span_end - span_start))
6754                           {
6755                             typedef typename elfcpp::Swap<16, big_endian>
6756                                                      ::Valtype Valtype;
6757                             Valtype* wv =
6758                               reinterpret_cast<Valtype*>(oview+index);
6759                             uint16_t val = elfcpp::Swap<16, false>::readval(wv);
6760                             elfcpp::Swap<16, true>::writeval(wv, val);
6761                             index += 2;
6762                            }
6763                       }
6764                   }
6765                 p = next;
6766               }
6767           }
6768     }
6769 }
6770
6771 // Find the linked text section of an EXIDX section by looking at the first
6772 // relocation.  4.4.1 of the EHABI specifications says that an EXIDX section
6773 // must be linked to its associated code section via the sh_link field of
6774 // its section header.  However, some tools are broken and the link is not
6775 // always set.  LD just drops such an EXIDX section silently, causing the
6776 // associated code not unwindabled.   Here we try a little bit harder to
6777 // discover the linked code section.
6778 //
6779 // PSHDR points to the section header of a relocation section of an EXIDX
6780 // section.  If we can find a linked text section, return true and
6781 // store the text section index in the location PSHNDX.  Otherwise
6782 // return false.
6783
6784 template<bool big_endian>
6785 bool
6786 Arm_relobj<big_endian>::find_linked_text_section(
6787     const unsigned char* pshdr,
6788     const unsigned char* psyms,
6789     unsigned int* pshndx)
6790 {
6791   elfcpp::Shdr<32, big_endian> shdr(pshdr);
6792
6793   // If there is no relocation, we cannot find the linked text section.
6794   size_t reloc_size;
6795   if (shdr.get_sh_type() == elfcpp::SHT_REL)
6796       reloc_size = elfcpp::Elf_sizes<32>::rel_size;
6797   else
6798       reloc_size = elfcpp::Elf_sizes<32>::rela_size;
6799   size_t reloc_count = shdr.get_sh_size() / reloc_size;
6800
6801   // Get the relocations.
6802   const unsigned char* prelocs =
6803       this->get_view(shdr.get_sh_offset(), shdr.get_sh_size(), true, false);
6804
6805   // Find the REL31 relocation for the first word of the first EXIDX entry.
6806   for (size_t i = 0; i < reloc_count; ++i, prelocs += reloc_size)
6807     {
6808       Arm_address r_offset;
6809       typename elfcpp::Elf_types<32>::Elf_WXword r_info;
6810       if (shdr.get_sh_type() == elfcpp::SHT_REL)
6811         {
6812           typename elfcpp::Rel<32, big_endian> reloc(prelocs);
6813           r_info = reloc.get_r_info();
6814           r_offset = reloc.get_r_offset();
6815         }
6816       else
6817         {
6818           typename elfcpp::Rela<32, big_endian> reloc(prelocs);
6819           r_info = reloc.get_r_info();
6820           r_offset = reloc.get_r_offset();
6821         }
6822
6823       unsigned int r_type = elfcpp::elf_r_type<32>(r_info);
6824       if (r_type != elfcpp::R_ARM_PREL31 && r_type != elfcpp::R_ARM_SBREL31)
6825         continue;
6826
6827       unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
6828       if (r_sym == 0
6829           || r_sym >= this->local_symbol_count()
6830           || r_offset != 0)
6831         continue;
6832
6833       // This is the relocation for the first word of the first EXIDX entry.
6834       // We expect to see a local section symbol.
6835       const int sym_size = elfcpp::Elf_sizes<32>::sym_size;
6836       elfcpp::Sym<32, big_endian> sym(psyms + r_sym * sym_size);
6837       if (sym.get_st_type() == elfcpp::STT_SECTION)
6838         {
6839           bool is_ordinary;
6840           *pshndx =
6841             this->adjust_sym_shndx(r_sym, sym.get_st_shndx(), &is_ordinary);
6842           gold_assert(is_ordinary);
6843           return true;
6844         }
6845       else
6846         return false;
6847     }
6848
6849   return false;
6850 }
6851
6852 // Make an EXIDX input section object for an EXIDX section whose index is
6853 // SHNDX.  SHDR is the section header of the EXIDX section and TEXT_SHNDX
6854 // is the section index of the linked text section.
6855
6856 template<bool big_endian>
6857 void
6858 Arm_relobj<big_endian>::make_exidx_input_section(
6859     unsigned int shndx,
6860     const elfcpp::Shdr<32, big_endian>& shdr,
6861     unsigned int text_shndx,
6862     const elfcpp::Shdr<32, big_endian>& text_shdr)
6863 {
6864   // Create an Arm_exidx_input_section object for this EXIDX section.
6865   Arm_exidx_input_section* exidx_input_section =
6866     new Arm_exidx_input_section(this, shndx, text_shndx, shdr.get_sh_size(),
6867                                 shdr.get_sh_addralign(),
6868                                 text_shdr.get_sh_size());
6869
6870   gold_assert(this->exidx_section_map_[shndx] == NULL);
6871   this->exidx_section_map_[shndx] = exidx_input_section;
6872
6873   if (text_shndx == elfcpp::SHN_UNDEF || text_shndx >= this->shnum())
6874     {
6875       gold_error(_("EXIDX section %s(%u) links to invalid section %u in %s"),
6876                  this->section_name(shndx).c_str(), shndx, text_shndx,
6877                  this->name().c_str());
6878       exidx_input_section->set_has_errors();
6879     }
6880   else if (this->exidx_section_map_[text_shndx] != NULL)
6881     {
6882       unsigned other_exidx_shndx =
6883         this->exidx_section_map_[text_shndx]->shndx();
6884       gold_error(_("EXIDX sections %s(%u) and %s(%u) both link to text section"
6885                    "%s(%u) in %s"),
6886                  this->section_name(shndx).c_str(), shndx,
6887                  this->section_name(other_exidx_shndx).c_str(),
6888                  other_exidx_shndx, this->section_name(text_shndx).c_str(),
6889                  text_shndx, this->name().c_str());
6890       exidx_input_section->set_has_errors();
6891     }
6892   else
6893      this->exidx_section_map_[text_shndx] = exidx_input_section;
6894
6895   // Check section flags of text section.
6896   if ((text_shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0)
6897     {
6898       gold_error(_("EXIDX section %s(%u) links to non-allocated section %s(%u) "
6899                    " in %s"),
6900                  this->section_name(shndx).c_str(), shndx,
6901                  this->section_name(text_shndx).c_str(), text_shndx,
6902                  this->name().c_str());
6903       exidx_input_section->set_has_errors();
6904     }
6905   else if ((text_shdr.get_sh_flags() & elfcpp::SHF_EXECINSTR) == 0)
6906     // I would like to make this an error but currently ld just ignores
6907     // this.
6908     gold_warning(_("EXIDX section %s(%u) links to non-executable section "
6909                    "%s(%u) in %s"),
6910                  this->section_name(shndx).c_str(), shndx,
6911                  this->section_name(text_shndx).c_str(), text_shndx,
6912                  this->name().c_str());
6913 }
6914
6915 // Read the symbol information.
6916
6917 template<bool big_endian>
6918 void
6919 Arm_relobj<big_endian>::do_read_symbols(Read_symbols_data* sd)
6920 {
6921   // Call parent class to read symbol information.
6922   this->base_read_symbols(sd);
6923
6924   // If this input file is a binary file, it has no processor
6925   // specific flags and attributes section.
6926   Input_file::Format format = this->input_file()->format();
6927   if (format != Input_file::FORMAT_ELF)
6928     {
6929       gold_assert(format == Input_file::FORMAT_BINARY);
6930       this->merge_flags_and_attributes_ = false;
6931       return;
6932     }
6933
6934   // Read processor-specific flags in ELF file header.
6935   const unsigned char* pehdr = this->get_view(elfcpp::file_header_offset,
6936                                               elfcpp::Elf_sizes<32>::ehdr_size,
6937                                               true, false);
6938   elfcpp::Ehdr<32, big_endian> ehdr(pehdr);
6939   this->processor_specific_flags_ = ehdr.get_e_flags();
6940
6941   // Go over the section headers and look for .ARM.attributes and .ARM.exidx
6942   // sections.
6943   std::vector<unsigned int> deferred_exidx_sections;
6944   const size_t shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
6945   const unsigned char* pshdrs = sd->section_headers->data();
6946   const unsigned char* ps = pshdrs + shdr_size;
6947   bool must_merge_flags_and_attributes = false;
6948   for (unsigned int i = 1; i < this->shnum(); ++i, ps += shdr_size)
6949     {
6950       elfcpp::Shdr<32, big_endian> shdr(ps);
6951
6952       // Sometimes an object has no contents except the section name string
6953       // table and an empty symbol table with the undefined symbol.  We
6954       // don't want to merge processor-specific flags from such an object.
6955       if (shdr.get_sh_type() == elfcpp::SHT_SYMTAB)
6956         {
6957           // Symbol table is not empty.
6958           const elfcpp::Elf_types<32>::Elf_WXword sym_size =
6959              elfcpp::Elf_sizes<32>::sym_size;
6960           if (shdr.get_sh_size() > sym_size)
6961             must_merge_flags_and_attributes = true;
6962         }
6963       else if (shdr.get_sh_type() != elfcpp::SHT_STRTAB)
6964         // If this is neither an empty symbol table nor a string table,
6965         // be conservative.
6966         must_merge_flags_and_attributes = true;
6967
6968       if (shdr.get_sh_type() == elfcpp::SHT_ARM_ATTRIBUTES)
6969         {
6970           gold_assert(this->attributes_section_data_ == NULL);
6971           section_offset_type section_offset = shdr.get_sh_offset();
6972           section_size_type section_size =
6973             convert_to_section_size_type(shdr.get_sh_size());
6974           const unsigned char* view =
6975              this->get_view(section_offset, section_size, true, false);
6976           this->attributes_section_data_ =
6977             new Attributes_section_data(view, section_size);
6978         }
6979       else if (shdr.get_sh_type() == elfcpp::SHT_ARM_EXIDX)
6980         {
6981           unsigned int text_shndx = this->adjust_shndx(shdr.get_sh_link());
6982           if (text_shndx == elfcpp::SHN_UNDEF)
6983             deferred_exidx_sections.push_back(i);
6984           else
6985             {
6986               elfcpp::Shdr<32, big_endian> text_shdr(pshdrs
6987                                                      + text_shndx * shdr_size);
6988               this->make_exidx_input_section(i, shdr, text_shndx, text_shdr);
6989             }
6990           // EHABI 4.4.1 requires that SHF_LINK_ORDER flag to be set.
6991           if ((shdr.get_sh_flags() & elfcpp::SHF_LINK_ORDER) == 0)
6992             gold_warning(_("SHF_LINK_ORDER not set in EXIDX section %s of %s"),
6993                          this->section_name(i).c_str(), this->name().c_str());
6994         }
6995     }
6996
6997   // This is rare.
6998   if (!must_merge_flags_and_attributes)
6999     {
7000       gold_assert(deferred_exidx_sections.empty());
7001       this->merge_flags_and_attributes_ = false;
7002       return;
7003     }
7004
7005   // Some tools are broken and they do not set the link of EXIDX sections.
7006   // We look at the first relocation to figure out the linked sections.
7007   if (!deferred_exidx_sections.empty())
7008     {
7009       // We need to go over the section headers again to find the mapping
7010       // from sections being relocated to their relocation sections.  This is
7011       // a bit inefficient as we could do that in the loop above.  However,
7012       // we do not expect any deferred EXIDX sections normally.  So we do not
7013       // want to slow down the most common path.
7014       typedef Unordered_map<unsigned int, unsigned int> Reloc_map;
7015       Reloc_map reloc_map;
7016       ps = pshdrs + shdr_size;
7017       for (unsigned int i = 1; i < this->shnum(); ++i, ps += shdr_size)
7018         {
7019           elfcpp::Shdr<32, big_endian> shdr(ps);
7020           elfcpp::Elf_Word sh_type = shdr.get_sh_type();
7021           if (sh_type == elfcpp::SHT_REL || sh_type == elfcpp::SHT_RELA)
7022             {
7023               unsigned int info_shndx = this->adjust_shndx(shdr.get_sh_info());
7024               if (info_shndx >= this->shnum())
7025                 gold_error(_("relocation section %u has invalid info %u"),
7026                            i, info_shndx);
7027               Reloc_map::value_type value(info_shndx, i);
7028               std::pair<Reloc_map::iterator, bool> result =
7029                 reloc_map.insert(value);
7030               if (!result.second)
7031                 gold_error(_("section %u has multiple relocation sections "
7032                              "%u and %u"),
7033                            info_shndx, i, reloc_map[info_shndx]);
7034             }
7035         }
7036
7037       // Read the symbol table section header.
7038       const unsigned int symtab_shndx = this->symtab_shndx();
7039       elfcpp::Shdr<32, big_endian>
7040           symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
7041       gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
7042
7043       // Read the local symbols.
7044       const int sym_size =elfcpp::Elf_sizes<32>::sym_size;
7045       const unsigned int loccount = this->local_symbol_count();
7046       gold_assert(loccount == symtabshdr.get_sh_info());
7047       off_t locsize = loccount * sym_size;
7048       const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
7049                                                   locsize, true, true);
7050
7051       // Process the deferred EXIDX sections.
7052       for (unsigned int i = 0; i < deferred_exidx_sections.size(); ++i)
7053         {
7054           unsigned int shndx = deferred_exidx_sections[i];
7055           elfcpp::Shdr<32, big_endian> shdr(pshdrs + shndx * shdr_size);
7056           unsigned int text_shndx = elfcpp::SHN_UNDEF;
7057           Reloc_map::const_iterator it = reloc_map.find(shndx);
7058           if (it != reloc_map.end())
7059             find_linked_text_section(pshdrs + it->second * shdr_size,
7060                                      psyms, &text_shndx);
7061           elfcpp::Shdr<32, big_endian> text_shdr(pshdrs
7062                                                  + text_shndx * shdr_size);
7063           this->make_exidx_input_section(shndx, shdr, text_shndx, text_shdr);
7064         }
7065     }
7066 }
7067
7068 // Process relocations for garbage collection.  The ARM target uses .ARM.exidx
7069 // sections for unwinding.  These sections are referenced implicitly by
7070 // text sections linked in the section headers.  If we ignore these implicit
7071 // references, the .ARM.exidx sections and any .ARM.extab sections they use
7072 // will be garbage-collected incorrectly.  Hence we override the same function
7073 // in the base class to handle these implicit references.
7074
7075 template<bool big_endian>
7076 void
7077 Arm_relobj<big_endian>::do_gc_process_relocs(Symbol_table* symtab,
7078                                              Layout* layout,
7079                                              Read_relocs_data* rd)
7080 {
7081   // First, call base class method to process relocations in this object.
7082   Sized_relobj_file<32, big_endian>::do_gc_process_relocs(symtab, layout, rd);
7083
7084   // If --gc-sections is not specified, there is nothing more to do.
7085   // This happens when --icf is used but --gc-sections is not.
7086   if (!parameters->options().gc_sections())
7087     return;
7088
7089   unsigned int shnum = this->shnum();
7090   const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
7091   const unsigned char* pshdrs = this->get_view(this->elf_file()->shoff(),
7092                                                shnum * shdr_size,
7093                                                true, true);
7094
7095   // Scan section headers for sections of type SHT_ARM_EXIDX.  Add references
7096   // to these from the linked text sections.
7097   const unsigned char* ps = pshdrs + shdr_size;
7098   for (unsigned int i = 1; i < shnum; ++i, ps += shdr_size)
7099     {
7100       elfcpp::Shdr<32, big_endian> shdr(ps);
7101       if (shdr.get_sh_type() == elfcpp::SHT_ARM_EXIDX)
7102         {
7103           // Found an .ARM.exidx section, add it to the set of reachable
7104           // sections from its linked text section.
7105           unsigned int text_shndx = this->adjust_shndx(shdr.get_sh_link());
7106           symtab->gc()->add_reference(this, text_shndx, this, i);
7107         }
7108     }
7109 }
7110
7111 // Update output local symbol count.  Owing to EXIDX entry merging, some local
7112 // symbols  will be removed in output.  Adjust output local symbol count
7113 // accordingly.  We can only changed the static output local symbol count.  It
7114 // is too late to change the dynamic symbols.
7115
7116 template<bool big_endian>
7117 void
7118 Arm_relobj<big_endian>::update_output_local_symbol_count()
7119 {
7120   // Caller should check that this needs updating.  We want caller checking
7121   // because output_local_symbol_count_needs_update() is most likely inlined.
7122   gold_assert(this->output_local_symbol_count_needs_update_);
7123
7124   gold_assert(this->symtab_shndx() != -1U);
7125   if (this->symtab_shndx() == 0)
7126     {
7127       // This object has no symbols.  Weird but legal.
7128       return;
7129     }
7130
7131   // Read the symbol table section header.
7132   const unsigned int symtab_shndx = this->symtab_shndx();
7133   elfcpp::Shdr<32, big_endian>
7134     symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
7135   gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
7136
7137   // Read the local symbols.
7138   const int sym_size = elfcpp::Elf_sizes<32>::sym_size;
7139   const unsigned int loccount = this->local_symbol_count();
7140   gold_assert(loccount == symtabshdr.get_sh_info());
7141   off_t locsize = loccount * sym_size;
7142   const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
7143                                               locsize, true, true);
7144
7145   // Loop over the local symbols.
7146
7147   typedef typename Sized_relobj_file<32, big_endian>::Output_sections
7148      Output_sections;
7149   const Output_sections& out_sections(this->output_sections());
7150   unsigned int shnum = this->shnum();
7151   unsigned int count = 0;
7152   // Skip the first, dummy, symbol.
7153   psyms += sym_size;
7154   for (unsigned int i = 1; i < loccount; ++i, psyms += sym_size)
7155     {
7156       elfcpp::Sym<32, big_endian> sym(psyms);
7157
7158       Symbol_value<32>& lv((*this->local_values())[i]);
7159
7160       // This local symbol was already discarded by do_count_local_symbols.
7161       if (lv.is_output_symtab_index_set() && !lv.has_output_symtab_entry())
7162         continue;
7163
7164       bool is_ordinary;
7165       unsigned int shndx = this->adjust_sym_shndx(i, sym.get_st_shndx(),
7166                                                   &is_ordinary);
7167
7168       if (shndx < shnum)
7169         {
7170           Output_section* os = out_sections[shndx];
7171
7172           // This local symbol no longer has an output section.  Discard it.
7173           if (os == NULL)
7174             {
7175               lv.set_no_output_symtab_entry();
7176               continue;
7177             }
7178
7179           // Currently we only discard parts of EXIDX input sections.
7180           // We explicitly check for a merged EXIDX input section to avoid
7181           // calling Output_section_data::output_offset unless necessary.
7182           if ((this->get_output_section_offset(shndx) == invalid_address)
7183               && (this->exidx_input_section_by_shndx(shndx) != NULL))
7184             {
7185               section_offset_type output_offset =
7186                 os->output_offset(this, shndx, lv.input_value());
7187               if (output_offset == -1)
7188                 {
7189                   // This symbol is defined in a part of an EXIDX input section
7190                   // that is discarded due to entry merging.
7191                   lv.set_no_output_symtab_entry();
7192                   continue;
7193                 }
7194             }
7195         }
7196
7197       ++count;
7198     }
7199
7200   this->set_output_local_symbol_count(count);
7201   this->output_local_symbol_count_needs_update_ = false;
7202 }
7203
7204 // Arm_dynobj methods.
7205
7206 // Read the symbol information.
7207
7208 template<bool big_endian>
7209 void
7210 Arm_dynobj<big_endian>::do_read_symbols(Read_symbols_data* sd)
7211 {
7212   // Call parent class to read symbol information.
7213   this->base_read_symbols(sd);
7214
7215   // Read processor-specific flags in ELF file header.
7216   const unsigned char* pehdr = this->get_view(elfcpp::file_header_offset,
7217                                               elfcpp::Elf_sizes<32>::ehdr_size,
7218                                               true, false);
7219   elfcpp::Ehdr<32, big_endian> ehdr(pehdr);
7220   this->processor_specific_flags_ = ehdr.get_e_flags();
7221
7222   // Read the attributes section if there is one.
7223   // We read from the end because gas seems to put it near the end of
7224   // the section headers.
7225   const size_t shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
7226   const unsigned char* ps =
7227     sd->section_headers->data() + shdr_size * (this->shnum() - 1);
7228   for (unsigned int i = this->shnum(); i > 0; --i, ps -= shdr_size)
7229     {
7230       elfcpp::Shdr<32, big_endian> shdr(ps);
7231       if (shdr.get_sh_type() == elfcpp::SHT_ARM_ATTRIBUTES)
7232         {
7233           section_offset_type section_offset = shdr.get_sh_offset();
7234           section_size_type section_size =
7235             convert_to_section_size_type(shdr.get_sh_size());
7236           const unsigned char* view =
7237             this->get_view(section_offset, section_size, true, false);
7238           this->attributes_section_data_ =
7239             new Attributes_section_data(view, section_size);
7240           break;
7241         }
7242     }
7243 }
7244
7245 // Stub_addend_reader methods.
7246
7247 // Read the addend of a REL relocation of type R_TYPE at VIEW.
7248
7249 template<bool big_endian>
7250 elfcpp::Elf_types<32>::Elf_Swxword
7251 Stub_addend_reader<elfcpp::SHT_REL, big_endian>::operator()(
7252     unsigned int r_type,
7253     const unsigned char* view,
7254     const typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc&) const
7255 {
7256   typedef class Arm_relocate_functions<big_endian> RelocFuncs;
7257
7258   switch (r_type)
7259     {
7260     case elfcpp::R_ARM_CALL:
7261     case elfcpp::R_ARM_JUMP24:
7262     case elfcpp::R_ARM_PLT32:
7263       {
7264         typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
7265         const Valtype* wv = reinterpret_cast<const Valtype*>(view);
7266         Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
7267         return Bits<26>::sign_extend32(val << 2);
7268       }
7269
7270     case elfcpp::R_ARM_THM_CALL:
7271     case elfcpp::R_ARM_THM_JUMP24:
7272     case elfcpp::R_ARM_THM_XPC22:
7273       {
7274         typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
7275         const Valtype* wv = reinterpret_cast<const Valtype*>(view);
7276         Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
7277         Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
7278         return RelocFuncs::thumb32_branch_offset(upper_insn, lower_insn);
7279       }
7280
7281     case elfcpp::R_ARM_THM_JUMP19:
7282       {
7283         typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
7284         const Valtype* wv = reinterpret_cast<const Valtype*>(view);
7285         Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
7286         Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
7287         return RelocFuncs::thumb32_cond_branch_offset(upper_insn, lower_insn);
7288       }
7289
7290     default:
7291       gold_unreachable();
7292     }
7293 }
7294
7295 // Arm_output_data_got methods.
7296
7297 // Add a GOT pair for R_ARM_TLS_GD32.  The creates a pair of GOT entries.
7298 // The first one is initialized to be 1, which is the module index for
7299 // the main executable and the second one 0.  A reloc of the type
7300 // R_ARM_TLS_DTPOFF32 will be created for the second GOT entry and will
7301 // be applied by gold.  GSYM is a global symbol.
7302 //
7303 template<bool big_endian>
7304 void
7305 Arm_output_data_got<big_endian>::add_tls_gd32_with_static_reloc(
7306     unsigned int got_type,
7307     Symbol* gsym)
7308 {
7309   if (gsym->has_got_offset(got_type))
7310     return;
7311
7312   // We are doing a static link.  Just mark it as belong to module 1,
7313   // the executable.
7314   unsigned int got_offset = this->add_constant(1);
7315   gsym->set_got_offset(got_type, got_offset);
7316   got_offset = this->add_constant(0);
7317   this->static_relocs_.push_back(Static_reloc(got_offset,
7318                                               elfcpp::R_ARM_TLS_DTPOFF32,
7319                                               gsym));
7320 }
7321
7322 // Same as the above but for a local symbol.
7323
7324 template<bool big_endian>
7325 void
7326 Arm_output_data_got<big_endian>::add_tls_gd32_with_static_reloc(
7327   unsigned int got_type,
7328   Sized_relobj_file<32, big_endian>* object,
7329   unsigned int index)
7330 {
7331   if (object->local_has_got_offset(index, got_type))
7332     return;
7333
7334   // We are doing a static link.  Just mark it as belong to module 1,
7335   // the executable.
7336   unsigned int got_offset = this->add_constant(1);
7337   object->set_local_got_offset(index, got_type, got_offset);
7338   got_offset = this->add_constant(0);
7339   this->static_relocs_.push_back(Static_reloc(got_offset,
7340                                               elfcpp::R_ARM_TLS_DTPOFF32,
7341                                               object, index));
7342 }
7343
7344 template<bool big_endian>
7345 void
7346 Arm_output_data_got<big_endian>::do_write(Output_file* of)
7347 {
7348   // Call parent to write out GOT.
7349   Output_data_got<32, big_endian>::do_write(of);
7350
7351   // We are done if there is no fix up.
7352   if (this->static_relocs_.empty())
7353     return;
7354
7355   gold_assert(parameters->doing_static_link());
7356
7357   const off_t offset = this->offset();
7358   const section_size_type oview_size =
7359     convert_to_section_size_type(this->data_size());
7360   unsigned char* const oview = of->get_output_view(offset, oview_size);
7361
7362   Output_segment* tls_segment = this->layout_->tls_segment();
7363   gold_assert(tls_segment != NULL);
7364
7365   // The thread pointer $tp points to the TCB, which is followed by the
7366   // TLS.  So we need to adjust $tp relative addressing by this amount.
7367   Arm_address aligned_tcb_size =
7368     align_address(ARM_TCB_SIZE, tls_segment->maximum_alignment());
7369
7370   for (size_t i = 0; i < this->static_relocs_.size(); ++i)
7371     {
7372       Static_reloc& reloc(this->static_relocs_[i]);
7373
7374       Arm_address value;
7375       if (!reloc.symbol_is_global())
7376         {
7377           Sized_relobj_file<32, big_endian>* object = reloc.relobj();
7378           const Symbol_value<32>* psymval =
7379             reloc.relobj()->local_symbol(reloc.index());
7380
7381           // We are doing static linking.  Issue an error and skip this
7382           // relocation if the symbol is undefined or in a discarded_section.
7383           bool is_ordinary;
7384           unsigned int shndx = psymval->input_shndx(&is_ordinary);
7385           if ((shndx == elfcpp::SHN_UNDEF)
7386               || (is_ordinary
7387                   && shndx != elfcpp::SHN_UNDEF
7388                   && !object->is_section_included(shndx)
7389                   && !this->symbol_table_->is_section_folded(object, shndx)))
7390             {
7391               gold_error(_("undefined or discarded local symbol %u from "
7392                            " object %s in GOT"),
7393                          reloc.index(), reloc.relobj()->name().c_str());
7394               continue;
7395             }
7396
7397           value = psymval->value(object, 0);
7398         }
7399       else
7400         {
7401           const Symbol* gsym = reloc.symbol();
7402           gold_assert(gsym != NULL);
7403           if (gsym->is_forwarder())
7404             gsym = this->symbol_table_->resolve_forwards(gsym);
7405
7406           // We are doing static linking.  Issue an error and skip this
7407           // relocation if the symbol is undefined or in a discarded_section
7408           // unless it is a weakly_undefined symbol.
7409           if ((gsym->is_defined_in_discarded_section()
7410                || gsym->is_undefined())
7411               && !gsym->is_weak_undefined())
7412             {
7413               gold_error(_("undefined or discarded symbol %s in GOT"),
7414                          gsym->name());
7415               continue;
7416             }
7417
7418           if (!gsym->is_weak_undefined())
7419             {
7420               const Sized_symbol<32>* sym =
7421                 static_cast<const Sized_symbol<32>*>(gsym);
7422               value = sym->value();
7423             }
7424           else
7425               value = 0;
7426         }
7427
7428       unsigned got_offset = reloc.got_offset();
7429       gold_assert(got_offset < oview_size);
7430
7431       typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
7432       Valtype* wv = reinterpret_cast<Valtype*>(oview + got_offset);
7433       Valtype x;
7434       switch (reloc.r_type())
7435         {
7436         case elfcpp::R_ARM_TLS_DTPOFF32:
7437           x = value;
7438           break;
7439         case elfcpp::R_ARM_TLS_TPOFF32:
7440           x = value + aligned_tcb_size;
7441           break;
7442         default:
7443           gold_unreachable();
7444         }
7445       elfcpp::Swap<32, big_endian>::writeval(wv, x);
7446     }
7447
7448   of->write_output_view(offset, oview_size, oview);
7449 }
7450
7451 // A class to handle the PLT data.
7452 // This is an abstract base class that handles most of the linker details
7453 // but does not know the actual contents of PLT entries.  The derived
7454 // classes below fill in those details.
7455
7456 template<bool big_endian>
7457 class Output_data_plt_arm : public Output_section_data
7458 {
7459  public:
7460   // Unlike aarch64, which records symbol value in "addend" field of relocations
7461   // and could be done at the same time an IRelative reloc is created for the
7462   // symbol, arm puts the symbol value into "GOT" table, which, however, is
7463   // issued later in Output_data_plt_arm::do_write(). So we have a struct here
7464   // to keep necessary symbol information for later use in do_write. We usually
7465   // have only a very limited number of ifuncs, so the extra data required here
7466   // is also limited.
7467
7468   struct IRelative_data
7469   {
7470     IRelative_data(Sized_symbol<32>* sized_symbol)
7471       : symbol_is_global_(true)
7472     {
7473       u_.global = sized_symbol;
7474     }
7475
7476     IRelative_data(Sized_relobj_file<32, big_endian>* relobj,
7477                    unsigned int index)
7478       : symbol_is_global_(false)
7479     {
7480       u_.local.relobj = relobj;
7481       u_.local.index = index;
7482     }
7483
7484     union
7485     {
7486       Sized_symbol<32>* global;
7487
7488       struct
7489       {
7490         Sized_relobj_file<32, big_endian>* relobj;
7491         unsigned int index;
7492       } local;
7493     } u_;
7494
7495     bool symbol_is_global_;
7496   };
7497
7498   typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, big_endian>
7499     Reloc_section;
7500
7501   Output_data_plt_arm(Layout* layout, uint64_t addralign,
7502                       Arm_output_data_got<big_endian>* got,
7503                       Output_data_space* got_plt,
7504                       Output_data_space* got_irelative);
7505
7506   // Add an entry to the PLT.
7507   void
7508   add_entry(Symbol_table* symtab, Layout* layout, Symbol* gsym);
7509
7510   // Add the relocation for a plt entry.
7511   void
7512   add_relocation(Symbol_table* symtab, Layout* layout,
7513                  Symbol* gsym, unsigned int got_offset);
7514
7515   // Add an entry to the PLT for a local STT_GNU_IFUNC symbol.
7516   unsigned int
7517   add_local_ifunc_entry(Symbol_table* symtab, Layout*,
7518                         Sized_relobj_file<32, big_endian>* relobj,
7519                         unsigned int local_sym_index);
7520
7521   // Return the .rel.plt section data.
7522   const Reloc_section*
7523   rel_plt() const
7524   { return this->rel_; }
7525
7526   // Return the PLT relocation container for IRELATIVE.
7527   Reloc_section*
7528   rel_irelative(Symbol_table*, Layout*);
7529
7530   // Return the number of PLT entries.
7531   unsigned int
7532   entry_count() const
7533   { return this->count_ + this->irelative_count_; }
7534
7535   // Return the offset of the first non-reserved PLT entry.
7536   unsigned int
7537   first_plt_entry_offset() const
7538   { return this->do_first_plt_entry_offset(); }
7539
7540   // Return the size of a PLT entry.
7541   unsigned int
7542   get_plt_entry_size() const
7543   { return this->do_get_plt_entry_size(); }
7544
7545   // Return the PLT address for globals.
7546   uint32_t
7547   address_for_global(const Symbol*) const;
7548
7549   // Return the PLT address for locals.
7550   uint32_t
7551   address_for_local(const Relobj*, unsigned int symndx) const;
7552
7553  protected:
7554   // Fill in the first PLT entry.
7555   void
7556   fill_first_plt_entry(unsigned char* pov,
7557                        Arm_address got_address,
7558                        Arm_address plt_address)
7559   { this->do_fill_first_plt_entry(pov, got_address, plt_address); }
7560
7561   void
7562   fill_plt_entry(unsigned char* pov,
7563                  Arm_address got_address,
7564                  Arm_address plt_address,
7565                  unsigned int got_offset,
7566                  unsigned int plt_offset)
7567   { do_fill_plt_entry(pov, got_address, plt_address, got_offset, plt_offset); }
7568
7569   virtual unsigned int
7570   do_first_plt_entry_offset() const = 0;
7571
7572   virtual unsigned int
7573   do_get_plt_entry_size() const = 0;
7574
7575   virtual void
7576   do_fill_first_plt_entry(unsigned char* pov,
7577                           Arm_address got_address,
7578                           Arm_address plt_address) = 0;
7579
7580   virtual void
7581   do_fill_plt_entry(unsigned char* pov,
7582                     Arm_address got_address,
7583                     Arm_address plt_address,
7584                     unsigned int got_offset,
7585                     unsigned int plt_offset) = 0;
7586
7587   void
7588   do_adjust_output_section(Output_section* os);
7589
7590   // Write to a map file.
7591   void
7592   do_print_to_mapfile(Mapfile* mapfile) const
7593   { mapfile->print_output_data(this, _("** PLT")); }
7594
7595  private:
7596   // Set the final size.
7597   void
7598   set_final_data_size()
7599   {
7600     this->set_data_size(this->first_plt_entry_offset()
7601                         + ((this->count_ + this->irelative_count_)
7602                            * this->get_plt_entry_size()));
7603   }
7604
7605   // Write out the PLT data.
7606   void
7607   do_write(Output_file*);
7608
7609   // Record irelative symbol data.
7610   void insert_irelative_data(const IRelative_data& idata)
7611   { irelative_data_vec_.push_back(idata); }
7612
7613   // The reloc section.
7614   Reloc_section* rel_;
7615   // The IRELATIVE relocs, if necessary.  These must follow the
7616   // regular PLT relocations.
7617   Reloc_section* irelative_rel_;
7618   // The .got section.
7619   Arm_output_data_got<big_endian>* got_;
7620   // The .got.plt section.
7621   Output_data_space* got_plt_;
7622   // The part of the .got.plt section used for IRELATIVE relocs.
7623   Output_data_space* got_irelative_;
7624   // The number of PLT entries.
7625   unsigned int count_;
7626   // Number of PLT entries with R_ARM_IRELATIVE relocs.  These
7627   // follow the regular PLT entries.
7628   unsigned int irelative_count_;
7629   // Vector for irelative data.
7630   typedef std::vector<IRelative_data> IRelative_data_vec;
7631   IRelative_data_vec irelative_data_vec_;
7632 };
7633
7634 // Create the PLT section.  The ordinary .got section is an argument,
7635 // since we need to refer to the start.  We also create our own .got
7636 // section just for PLT entries.
7637
7638 template<bool big_endian>
7639 Output_data_plt_arm<big_endian>::Output_data_plt_arm(
7640     Layout* layout, uint64_t addralign,
7641     Arm_output_data_got<big_endian>* got,
7642     Output_data_space* got_plt,
7643     Output_data_space* got_irelative)
7644   : Output_section_data(addralign), irelative_rel_(NULL),
7645     got_(got), got_plt_(got_plt), got_irelative_(got_irelative),
7646     count_(0), irelative_count_(0)
7647 {
7648   this->rel_ = new Reloc_section(false);
7649   layout->add_output_section_data(".rel.plt", elfcpp::SHT_REL,
7650                                   elfcpp::SHF_ALLOC, this->rel_,
7651                                   ORDER_DYNAMIC_PLT_RELOCS, false);
7652 }
7653
7654 template<bool big_endian>
7655 void
7656 Output_data_plt_arm<big_endian>::do_adjust_output_section(Output_section* os)
7657 {
7658   os->set_entsize(0);
7659 }
7660
7661 // Add an entry to the PLT.
7662
7663 template<bool big_endian>
7664 void
7665 Output_data_plt_arm<big_endian>::add_entry(Symbol_table* symtab,
7666                                            Layout* layout,
7667                                            Symbol* gsym)
7668 {
7669   gold_assert(!gsym->has_plt_offset());
7670
7671   unsigned int* entry_count;
7672   Output_section_data_build* got;
7673
7674   // We have 2 different types of plt entry here, normal and ifunc.
7675
7676   // For normal plt, the offset begins with first_plt_entry_offset(20), and the
7677   // 1st entry offset would be 20, the second 32, third 44 ... etc.
7678
7679   // For ifunc plt, the offset begins with 0. So the first offset would 0,
7680   // second 12, third 24 ... etc.
7681
7682   // IFunc plt entries *always* come after *normal* plt entries.
7683
7684   // Notice, when computing the plt address of a certain symbol, "plt_address +
7685   // plt_offset" is no longer correct. Use target->plt_address_for_global() or
7686   // target->plt_address_for_local() instead.
7687
7688   int begin_offset = 0;
7689   if (gsym->type() == elfcpp::STT_GNU_IFUNC
7690       && gsym->can_use_relative_reloc(false))
7691     {
7692       entry_count = &this->irelative_count_;
7693       got = this->got_irelative_;
7694       // For irelative plt entries, offset is relative to the end of normal plt
7695       // entries, so it starts from 0.
7696       begin_offset = 0;
7697       // Record symbol information.
7698       this->insert_irelative_data(
7699           IRelative_data(symtab->get_sized_symbol<32>(gsym)));
7700     }
7701   else
7702     {
7703       entry_count = &this->count_;
7704       got = this->got_plt_;
7705       // Note that for normal plt entries, when setting the PLT offset we skip
7706       // the initial reserved PLT entry.
7707       begin_offset = this->first_plt_entry_offset();
7708     }
7709
7710   gsym->set_plt_offset(begin_offset
7711                        + (*entry_count) * this->get_plt_entry_size());
7712
7713   ++(*entry_count);
7714
7715   section_offset_type got_offset = got->current_data_size();
7716
7717   // Every PLT entry needs a GOT entry which points back to the PLT
7718   // entry (this will be changed by the dynamic linker, normally
7719   // lazily when the function is called).
7720   got->set_current_data_size(got_offset + 4);
7721
7722   // Every PLT entry needs a reloc.
7723   this->add_relocation(symtab, layout, gsym, got_offset);
7724
7725   // Note that we don't need to save the symbol.  The contents of the
7726   // PLT are independent of which symbols are used.  The symbols only
7727   // appear in the relocations.
7728 }
7729
7730 // Add an entry to the PLT for a local STT_GNU_IFUNC symbol.  Return
7731 // the PLT offset.
7732
7733 template<bool big_endian>
7734 unsigned int
7735 Output_data_plt_arm<big_endian>::add_local_ifunc_entry(
7736     Symbol_table* symtab,
7737     Layout* layout,
7738     Sized_relobj_file<32, big_endian>* relobj,
7739     unsigned int local_sym_index)
7740 {
7741   this->insert_irelative_data(IRelative_data(relobj, local_sym_index));
7742
7743   // Notice, when computingthe plt entry address, "plt_address + plt_offset" is
7744   // no longer correct. Use target->plt_address_for_local() instead.
7745   unsigned int plt_offset = this->irelative_count_ * this->get_plt_entry_size();
7746   ++this->irelative_count_;
7747
7748   section_offset_type got_offset = this->got_irelative_->current_data_size();
7749
7750   // Every PLT entry needs a GOT entry which points back to the PLT
7751   // entry.
7752   this->got_irelative_->set_current_data_size(got_offset + 4);
7753
7754
7755   // Every PLT entry needs a reloc.
7756   Reloc_section* rel = this->rel_irelative(symtab, layout);
7757   rel->add_symbolless_local_addend(relobj, local_sym_index,
7758                                    elfcpp::R_ARM_IRELATIVE,
7759                                    this->got_irelative_, got_offset);
7760   return plt_offset;
7761 }
7762
7763
7764 // Add the relocation for a PLT entry.
7765
7766 template<bool big_endian>
7767 void
7768 Output_data_plt_arm<big_endian>::add_relocation(
7769     Symbol_table* symtab, Layout* layout, Symbol* gsym, unsigned int got_offset)
7770 {
7771   if (gsym->type() == elfcpp::STT_GNU_IFUNC
7772       && gsym->can_use_relative_reloc(false))
7773     {
7774       Reloc_section* rel = this->rel_irelative(symtab, layout);
7775       rel->add_symbolless_global_addend(gsym, elfcpp::R_ARM_IRELATIVE,
7776                                         this->got_irelative_, got_offset);
7777     }
7778   else
7779     {
7780       gsym->set_needs_dynsym_entry();
7781       this->rel_->add_global(gsym, elfcpp::R_ARM_JUMP_SLOT, this->got_plt_,
7782                              got_offset);
7783     }
7784 }
7785
7786
7787 // Create the irelative relocation data.
7788
7789 template<bool big_endian>
7790 typename Output_data_plt_arm<big_endian>::Reloc_section*
7791 Output_data_plt_arm<big_endian>::rel_irelative(Symbol_table* symtab,
7792                                                 Layout* layout)
7793 {
7794   if (this->irelative_rel_ == NULL)
7795     {
7796       // Since irelative relocations goes into 'rel.dyn', we delegate the
7797       // creation of irelative_rel_ to where rel_dyn section gets created.
7798       Target_arm<big_endian>* arm_target =
7799           Target_arm<big_endian>::default_target();
7800       this->irelative_rel_ = arm_target->rel_irelative_section(layout);
7801
7802       // Make sure we have a place for the TLSDESC relocations, in
7803       // case we see any later on.
7804       // this->rel_tlsdesc(layout);
7805       if (parameters->doing_static_link())
7806         {
7807           // A statically linked executable will only have a .rel.plt section to
7808           // hold R_ARM_IRELATIVE relocs for STT_GNU_IFUNC symbols.  The library
7809           // will use these symbols to locate the IRELATIVE relocs at program
7810           // startup time.
7811           symtab->define_in_output_data("__rel_iplt_start", NULL,
7812                                         Symbol_table::PREDEFINED,
7813                                         this->irelative_rel_, 0, 0,
7814                                         elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL,
7815                                         elfcpp::STV_HIDDEN, 0, false, true);
7816           symtab->define_in_output_data("__rel_iplt_end", NULL,
7817                                         Symbol_table::PREDEFINED,
7818                                         this->irelative_rel_, 0, 0,
7819                                         elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL,
7820                                         elfcpp::STV_HIDDEN, 0, true, true);
7821         }
7822     }
7823   return this->irelative_rel_;
7824 }
7825
7826
7827 // Return the PLT address for a global symbol.
7828
7829 template<bool big_endian>
7830 uint32_t
7831 Output_data_plt_arm<big_endian>::address_for_global(const Symbol* gsym) const
7832 {
7833   uint64_t begin_offset = 0;
7834   if (gsym->type() == elfcpp::STT_GNU_IFUNC
7835       && gsym->can_use_relative_reloc(false))
7836     {
7837       begin_offset = (this->first_plt_entry_offset() +
7838                       this->count_ * this->get_plt_entry_size());
7839     }
7840   return this->address() + begin_offset + gsym->plt_offset();
7841 }
7842
7843
7844 // Return the PLT address for a local symbol.  These are always
7845 // IRELATIVE relocs.
7846
7847 template<bool big_endian>
7848 uint32_t
7849 Output_data_plt_arm<big_endian>::address_for_local(
7850     const Relobj* object,
7851     unsigned int r_sym) const
7852 {
7853   return (this->address()
7854           + this->first_plt_entry_offset()
7855           + this->count_ * this->get_plt_entry_size()
7856           + object->local_plt_offset(r_sym));
7857 }
7858
7859
7860 template<bool big_endian>
7861 class Output_data_plt_arm_standard : public Output_data_plt_arm<big_endian>
7862 {
7863  public:
7864   Output_data_plt_arm_standard(Layout* layout,
7865                                Arm_output_data_got<big_endian>* got,
7866                                Output_data_space* got_plt,
7867                                Output_data_space* got_irelative)
7868     : Output_data_plt_arm<big_endian>(layout, 4, got, got_plt, got_irelative)
7869   { }
7870
7871  protected:
7872   // Return the offset of the first non-reserved PLT entry.
7873   virtual unsigned int
7874   do_first_plt_entry_offset() const
7875   { return sizeof(first_plt_entry); }
7876
7877   virtual void
7878   do_fill_first_plt_entry(unsigned char* pov,
7879                           Arm_address got_address,
7880                           Arm_address plt_address);
7881
7882  private:
7883   // Template for the first PLT entry.
7884   static const uint32_t first_plt_entry[5];
7885 };
7886
7887 // ARM PLTs.
7888 // FIXME:  This is not very flexible.  Right now this has only been tested
7889 // on armv5te.  If we are to support additional architecture features like
7890 // Thumb-2 or BE8, we need to make this more flexible like GNU ld.
7891
7892 // The first entry in the PLT.
7893 template<bool big_endian>
7894 const uint32_t Output_data_plt_arm_standard<big_endian>::first_plt_entry[5] =
7895 {
7896   0xe52de004,   // str   lr, [sp, #-4]!
7897   0xe59fe004,   // ldr   lr, [pc, #4]
7898   0xe08fe00e,   // add   lr, pc, lr
7899   0xe5bef008,   // ldr   pc, [lr, #8]!
7900   0x00000000,   // &GOT[0] - .
7901 };
7902
7903 template<bool big_endian>
7904 void
7905 Output_data_plt_arm_standard<big_endian>::do_fill_first_plt_entry(
7906     unsigned char* pov,
7907     Arm_address got_address,
7908     Arm_address plt_address)
7909 {
7910   // Write first PLT entry.  All but the last word are constants.
7911   const size_t num_first_plt_words = (sizeof(first_plt_entry)
7912                                       / sizeof(first_plt_entry[0]));
7913   for (size_t i = 0; i < num_first_plt_words - 1; i++)
7914     {
7915       if (parameters->options().be8())
7916         {
7917           elfcpp::Swap<32, false>::writeval(pov + i * 4,
7918                                             first_plt_entry[i]);
7919         }
7920       else
7921         {
7922           elfcpp::Swap<32, big_endian>::writeval(pov + i * 4,
7923                                                  first_plt_entry[i]);
7924         }
7925     }
7926   // Last word in first PLT entry is &GOT[0] - .
7927   elfcpp::Swap<32, big_endian>::writeval(pov + 16,
7928                                          got_address - (plt_address + 16));
7929 }
7930
7931 // Subsequent entries in the PLT.
7932 // This class generates short (12-byte) entries, for displacements up to 2^28.
7933
7934 template<bool big_endian>
7935 class Output_data_plt_arm_short : public Output_data_plt_arm_standard<big_endian>
7936 {
7937  public:
7938   Output_data_plt_arm_short(Layout* layout,
7939                             Arm_output_data_got<big_endian>* got,
7940                             Output_data_space* got_plt,
7941                             Output_data_space* got_irelative)
7942     : Output_data_plt_arm_standard<big_endian>(layout, got, got_plt, got_irelative)
7943   { }
7944
7945  protected:
7946   // Return the size of a PLT entry.
7947   virtual unsigned int
7948   do_get_plt_entry_size() const
7949   { return sizeof(plt_entry); }
7950
7951   virtual void
7952   do_fill_plt_entry(unsigned char* pov,
7953                     Arm_address got_address,
7954                     Arm_address plt_address,
7955                     unsigned int got_offset,
7956                     unsigned int plt_offset);
7957
7958  private:
7959   // Template for subsequent PLT entries.
7960   static const uint32_t plt_entry[3];
7961 };
7962
7963 template<bool big_endian>
7964 const uint32_t Output_data_plt_arm_short<big_endian>::plt_entry[3] =
7965 {
7966   0xe28fc600,   // add   ip, pc, #0xNN00000
7967   0xe28cca00,   // add   ip, ip, #0xNN000
7968   0xe5bcf000,   // ldr   pc, [ip, #0xNNN]!
7969 };
7970
7971 template<bool big_endian>
7972 void
7973 Output_data_plt_arm_short<big_endian>::do_fill_plt_entry(
7974     unsigned char* pov,
7975     Arm_address got_address,
7976     Arm_address plt_address,
7977     unsigned int got_offset,
7978     unsigned int plt_offset)
7979 {
7980   int32_t offset = ((got_address + got_offset)
7981                     - (plt_address + plt_offset + 8));
7982   if (offset < 0 || offset > 0x0fffffff)
7983     gold_error(_("PLT offset too large, try linking with --long-plt"));
7984
7985   uint32_t plt_insn0 = plt_entry[0] | ((offset >> 20) & 0xff);
7986   uint32_t plt_insn1 = plt_entry[1] | ((offset >> 12) & 0xff);
7987   uint32_t plt_insn2 = plt_entry[2] | (offset & 0xfff);
7988
7989   if (parameters->options().be8())
7990     {
7991       elfcpp::Swap<32, false>::writeval(pov, plt_insn0);
7992       elfcpp::Swap<32, false>::writeval(pov + 4, plt_insn1);
7993       elfcpp::Swap<32, false>::writeval(pov + 8, plt_insn2);
7994     }
7995   else
7996     {
7997       elfcpp::Swap<32, big_endian>::writeval(pov, plt_insn0);
7998       elfcpp::Swap<32, big_endian>::writeval(pov + 4, plt_insn1);
7999       elfcpp::Swap<32, big_endian>::writeval(pov + 8, plt_insn2);
8000     }
8001 }
8002
8003 // This class generates long (16-byte) entries, for arbitrary displacements.
8004
8005 template<bool big_endian>
8006 class Output_data_plt_arm_long : public Output_data_plt_arm_standard<big_endian>
8007 {
8008  public:
8009   Output_data_plt_arm_long(Layout* layout,
8010                            Arm_output_data_got<big_endian>* got,
8011                            Output_data_space* got_plt,
8012                            Output_data_space* got_irelative)
8013     : Output_data_plt_arm_standard<big_endian>(layout, got, got_plt, got_irelative)
8014   { }
8015
8016  protected:
8017   // Return the size of a PLT entry.
8018   virtual unsigned int
8019   do_get_plt_entry_size() const
8020   { return sizeof(plt_entry); }
8021
8022   virtual void
8023   do_fill_plt_entry(unsigned char* pov,
8024                     Arm_address got_address,
8025                     Arm_address plt_address,
8026                     unsigned int got_offset,
8027                     unsigned int plt_offset);
8028
8029  private:
8030   // Template for subsequent PLT entries.
8031   static const uint32_t plt_entry[4];
8032 };
8033
8034 template<bool big_endian>
8035 const uint32_t Output_data_plt_arm_long<big_endian>::plt_entry[4] =
8036 {
8037   0xe28fc200,   // add   ip, pc, #0xN0000000
8038   0xe28cc600,   // add   ip, ip, #0xNN00000
8039   0xe28cca00,   // add   ip, ip, #0xNN000
8040   0xe5bcf000,   // ldr   pc, [ip, #0xNNN]!
8041 };
8042
8043 template<bool big_endian>
8044 void
8045 Output_data_plt_arm_long<big_endian>::do_fill_plt_entry(
8046     unsigned char* pov,
8047     Arm_address got_address,
8048     Arm_address plt_address,
8049     unsigned int got_offset,
8050     unsigned int plt_offset)
8051 {
8052   int32_t offset = ((got_address + got_offset)
8053                     - (plt_address + plt_offset + 8));
8054
8055   uint32_t plt_insn0 = plt_entry[0] | (offset >> 28);
8056   uint32_t plt_insn1 = plt_entry[1] | ((offset >> 20) & 0xff);
8057   uint32_t plt_insn2 = plt_entry[2] | ((offset >> 12) & 0xff);
8058   uint32_t plt_insn3 = plt_entry[3] | (offset & 0xfff);
8059
8060   if (parameters->options().be8())
8061     {
8062       elfcpp::Swap<32, false>::writeval(pov, plt_insn0);
8063       elfcpp::Swap<32, false>::writeval(pov + 4, plt_insn1);
8064       elfcpp::Swap<32, false>::writeval(pov + 8, plt_insn2);
8065       elfcpp::Swap<32, false>::writeval(pov + 12, plt_insn3);
8066     }
8067   else
8068     {
8069       elfcpp::Swap<32, big_endian>::writeval(pov, plt_insn0);
8070       elfcpp::Swap<32, big_endian>::writeval(pov + 4, plt_insn1);
8071       elfcpp::Swap<32, big_endian>::writeval(pov + 8, plt_insn2);
8072       elfcpp::Swap<32, big_endian>::writeval(pov + 12, plt_insn3);
8073     }
8074 }
8075
8076 // Write out the PLT.  This uses the hand-coded instructions above,
8077 // and adjusts them as needed.  This is all specified by the arm ELF
8078 // Processor Supplement.
8079
8080 template<bool big_endian>
8081 void
8082 Output_data_plt_arm<big_endian>::do_write(Output_file* of)
8083 {
8084   const off_t offset = this->offset();
8085   const section_size_type oview_size =
8086     convert_to_section_size_type(this->data_size());
8087   unsigned char* const oview = of->get_output_view(offset, oview_size);
8088
8089   const off_t got_file_offset = this->got_plt_->offset();
8090   gold_assert(got_file_offset + this->got_plt_->data_size()
8091               == this->got_irelative_->offset());
8092   const section_size_type got_size =
8093     convert_to_section_size_type(this->got_plt_->data_size()
8094                                  + this->got_irelative_->data_size());
8095   unsigned char* const got_view = of->get_output_view(got_file_offset,
8096                                                       got_size);
8097   unsigned char* pov = oview;
8098
8099   Arm_address plt_address = this->address();
8100   Arm_address got_address = this->got_plt_->address();
8101
8102   // Write first PLT entry.
8103   this->fill_first_plt_entry(pov, got_address, plt_address);
8104   pov += this->first_plt_entry_offset();
8105
8106   unsigned char* got_pov = got_view;
8107
8108   memset(got_pov, 0, 12);
8109   got_pov += 12;
8110
8111   unsigned int plt_offset = this->first_plt_entry_offset();
8112   unsigned int got_offset = 12;
8113   const unsigned int count = this->count_ + this->irelative_count_;
8114   gold_assert(this->irelative_count_ == this->irelative_data_vec_.size());
8115   for (unsigned int i = 0;
8116        i < count;
8117        ++i,
8118          pov += this->get_plt_entry_size(),
8119          got_pov += 4,
8120          plt_offset += this->get_plt_entry_size(),
8121          got_offset += 4)
8122     {
8123       // Set and adjust the PLT entry itself.
8124       this->fill_plt_entry(pov, got_address, plt_address,
8125                            got_offset, plt_offset);
8126
8127       Arm_address value;
8128       if (i < this->count_)
8129         {
8130           // For non-irelative got entries, the value is the beginning of plt.
8131           value = plt_address;
8132         }
8133       else
8134         {
8135           // For irelative got entries, the value is the (global/local) symbol
8136           // address.
8137           const IRelative_data& idata =
8138               this->irelative_data_vec_[i - this->count_];
8139           if (idata.symbol_is_global_)
8140             {
8141               // Set the entry in the GOT for irelative symbols.  The content is
8142               // the address of the ifunc, not the address of plt start.
8143               const Sized_symbol<32>* sized_symbol = idata.u_.global;
8144               gold_assert(sized_symbol->type() == elfcpp::STT_GNU_IFUNC);
8145               value = sized_symbol->value();
8146             }
8147           else
8148             {
8149               value = idata.u_.local.relobj->local_symbol_value(
8150                   idata.u_.local.index, 0);
8151             }
8152         }
8153       elfcpp::Swap<32, big_endian>::writeval(got_pov, value);
8154     }
8155
8156   gold_assert(static_cast<section_size_type>(pov - oview) == oview_size);
8157   gold_assert(static_cast<section_size_type>(got_pov - got_view) == got_size);
8158
8159   of->write_output_view(offset, oview_size, oview);
8160   of->write_output_view(got_file_offset, got_size, got_view);
8161 }
8162
8163
8164 // Create a PLT entry for a global symbol.
8165
8166 template<bool big_endian>
8167 void
8168 Target_arm<big_endian>::make_plt_entry(Symbol_table* symtab, Layout* layout,
8169                                        Symbol* gsym)
8170 {
8171   if (gsym->has_plt_offset())
8172     return;
8173
8174   if (this->plt_ == NULL)
8175     this->make_plt_section(symtab, layout);
8176
8177   this->plt_->add_entry(symtab, layout, gsym);
8178 }
8179
8180
8181 // Create the PLT section.
8182 template<bool big_endian>
8183 void
8184 Target_arm<big_endian>::make_plt_section(
8185   Symbol_table* symtab, Layout* layout)
8186 {
8187   if (this->plt_ == NULL)
8188     {
8189       // Create the GOT section first.
8190       this->got_section(symtab, layout);
8191
8192       // GOT for irelatives is create along with got.plt.
8193       gold_assert(this->got_ != NULL
8194                   && this->got_plt_ != NULL
8195                   && this->got_irelative_ != NULL);
8196       this->plt_ = this->make_data_plt(layout, this->got_, this->got_plt_,
8197                                        this->got_irelative_);
8198
8199       layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS,
8200                                       (elfcpp::SHF_ALLOC
8201                                        | elfcpp::SHF_EXECINSTR),
8202                                       this->plt_, ORDER_PLT, false);
8203       symtab->define_in_output_data("$a", NULL,
8204                                     Symbol_table::PREDEFINED,
8205                                     this->plt_,
8206                                     0, 0, elfcpp::STT_NOTYPE,
8207                                     elfcpp::STB_LOCAL,
8208                                     elfcpp::STV_DEFAULT, 0,
8209                                     false, false);
8210     }
8211 }
8212
8213
8214 // Make a PLT entry for a local STT_GNU_IFUNC symbol.
8215
8216 template<bool big_endian>
8217 void
8218 Target_arm<big_endian>::make_local_ifunc_plt_entry(
8219     Symbol_table* symtab, Layout* layout,
8220     Sized_relobj_file<32, big_endian>* relobj,
8221     unsigned int local_sym_index)
8222 {
8223   if (relobj->local_has_plt_offset(local_sym_index))
8224     return;
8225   if (this->plt_ == NULL)
8226     this->make_plt_section(symtab, layout);
8227   unsigned int plt_offset = this->plt_->add_local_ifunc_entry(symtab, layout,
8228                                                               relobj,
8229                                                               local_sym_index);
8230   relobj->set_local_plt_offset(local_sym_index, plt_offset);
8231 }
8232
8233
8234 // Return the number of entries in the PLT.
8235
8236 template<bool big_endian>
8237 unsigned int
8238 Target_arm<big_endian>::plt_entry_count() const
8239 {
8240   if (this->plt_ == NULL)
8241     return 0;
8242   return this->plt_->entry_count();
8243 }
8244
8245 // Return the offset of the first non-reserved PLT entry.
8246
8247 template<bool big_endian>
8248 unsigned int
8249 Target_arm<big_endian>::first_plt_entry_offset() const
8250 {
8251   return this->plt_->first_plt_entry_offset();
8252 }
8253
8254 // Return the size of each PLT entry.
8255
8256 template<bool big_endian>
8257 unsigned int
8258 Target_arm<big_endian>::plt_entry_size() const
8259 {
8260   return this->plt_->get_plt_entry_size();
8261 }
8262
8263 // Get the section to use for TLS_DESC relocations.
8264
8265 template<bool big_endian>
8266 typename Target_arm<big_endian>::Reloc_section*
8267 Target_arm<big_endian>::rel_tls_desc_section(Layout* layout) const
8268 {
8269   return this->plt_section()->rel_tls_desc(layout);
8270 }
8271
8272 // Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
8273
8274 template<bool big_endian>
8275 void
8276 Target_arm<big_endian>::define_tls_base_symbol(
8277     Symbol_table* symtab,
8278     Layout* layout)
8279 {
8280   if (this->tls_base_symbol_defined_)
8281     return;
8282
8283   Output_segment* tls_segment = layout->tls_segment();
8284   if (tls_segment != NULL)
8285     {
8286       bool is_exec = parameters->options().output_is_executable();
8287       symtab->define_in_output_segment("_TLS_MODULE_BASE_", NULL,
8288                                        Symbol_table::PREDEFINED,
8289                                        tls_segment, 0, 0,
8290                                        elfcpp::STT_TLS,
8291                                        elfcpp::STB_LOCAL,
8292                                        elfcpp::STV_HIDDEN, 0,
8293                                        (is_exec
8294                                         ? Symbol::SEGMENT_END
8295                                         : Symbol::SEGMENT_START),
8296                                        true);
8297     }
8298   this->tls_base_symbol_defined_ = true;
8299 }
8300
8301 // Create a GOT entry for the TLS module index.
8302
8303 template<bool big_endian>
8304 unsigned int
8305 Target_arm<big_endian>::got_mod_index_entry(
8306     Symbol_table* symtab,
8307     Layout* layout,
8308     Sized_relobj_file<32, big_endian>* object)
8309 {
8310   if (this->got_mod_index_offset_ == -1U)
8311     {
8312       gold_assert(symtab != NULL && layout != NULL && object != NULL);
8313       Arm_output_data_got<big_endian>* got = this->got_section(symtab, layout);
8314       unsigned int got_offset;
8315       if (!parameters->doing_static_link())
8316         {
8317           got_offset = got->add_constant(0);
8318           Reloc_section* rel_dyn = this->rel_dyn_section(layout);
8319           rel_dyn->add_local(object, 0, elfcpp::R_ARM_TLS_DTPMOD32, got,
8320                              got_offset);
8321         }
8322       else
8323         {
8324           // We are doing a static link.  Just mark it as belong to module 1,
8325           // the executable.
8326           got_offset = got->add_constant(1);
8327         }
8328
8329       got->add_constant(0);
8330       this->got_mod_index_offset_ = got_offset;
8331     }
8332   return this->got_mod_index_offset_;
8333 }
8334
8335 // Optimize the TLS relocation type based on what we know about the
8336 // symbol.  IS_FINAL is true if the final address of this symbol is
8337 // known at link time.
8338
8339 template<bool big_endian>
8340 tls::Tls_optimization
8341 Target_arm<big_endian>::optimize_tls_reloc(bool, int)
8342 {
8343   // FIXME: Currently we do not do any TLS optimization.
8344   return tls::TLSOPT_NONE;
8345 }
8346
8347 // Get the Reference_flags for a particular relocation.
8348
8349 template<bool big_endian>
8350 int
8351 Target_arm<big_endian>::Scan::get_reference_flags(unsigned int r_type)
8352 {
8353   switch (r_type)
8354     {
8355     case elfcpp::R_ARM_NONE:
8356     case elfcpp::R_ARM_V4BX:
8357     case elfcpp::R_ARM_GNU_VTENTRY:
8358     case elfcpp::R_ARM_GNU_VTINHERIT:
8359       // No symbol reference.
8360       return 0;
8361
8362     case elfcpp::R_ARM_ABS32:
8363     case elfcpp::R_ARM_ABS16:
8364     case elfcpp::R_ARM_ABS12:
8365     case elfcpp::R_ARM_THM_ABS5:
8366     case elfcpp::R_ARM_ABS8:
8367     case elfcpp::R_ARM_BASE_ABS:
8368     case elfcpp::R_ARM_MOVW_ABS_NC:
8369     case elfcpp::R_ARM_MOVT_ABS:
8370     case elfcpp::R_ARM_THM_MOVW_ABS_NC:
8371     case elfcpp::R_ARM_THM_MOVT_ABS:
8372     case elfcpp::R_ARM_ABS32_NOI:
8373       return Symbol::ABSOLUTE_REF;
8374
8375     case elfcpp::R_ARM_REL32:
8376     case elfcpp::R_ARM_LDR_PC_G0:
8377     case elfcpp::R_ARM_SBREL32:
8378     case elfcpp::R_ARM_THM_PC8:
8379     case elfcpp::R_ARM_BASE_PREL:
8380     case elfcpp::R_ARM_MOVW_PREL_NC:
8381     case elfcpp::R_ARM_MOVT_PREL:
8382     case elfcpp::R_ARM_THM_MOVW_PREL_NC:
8383     case elfcpp::R_ARM_THM_MOVT_PREL:
8384     case elfcpp::R_ARM_THM_ALU_PREL_11_0:
8385     case elfcpp::R_ARM_THM_PC12:
8386     case elfcpp::R_ARM_REL32_NOI:
8387     case elfcpp::R_ARM_ALU_PC_G0_NC:
8388     case elfcpp::R_ARM_ALU_PC_G0:
8389     case elfcpp::R_ARM_ALU_PC_G1_NC:
8390     case elfcpp::R_ARM_ALU_PC_G1:
8391     case elfcpp::R_ARM_ALU_PC_G2:
8392     case elfcpp::R_ARM_LDR_PC_G1:
8393     case elfcpp::R_ARM_LDR_PC_G2:
8394     case elfcpp::R_ARM_LDRS_PC_G0:
8395     case elfcpp::R_ARM_LDRS_PC_G1:
8396     case elfcpp::R_ARM_LDRS_PC_G2:
8397     case elfcpp::R_ARM_LDC_PC_G0:
8398     case elfcpp::R_ARM_LDC_PC_G1:
8399     case elfcpp::R_ARM_LDC_PC_G2:
8400     case elfcpp::R_ARM_ALU_SB_G0_NC:
8401     case elfcpp::R_ARM_ALU_SB_G0:
8402     case elfcpp::R_ARM_ALU_SB_G1_NC:
8403     case elfcpp::R_ARM_ALU_SB_G1:
8404     case elfcpp::R_ARM_ALU_SB_G2:
8405     case elfcpp::R_ARM_LDR_SB_G0:
8406     case elfcpp::R_ARM_LDR_SB_G1:
8407     case elfcpp::R_ARM_LDR_SB_G2:
8408     case elfcpp::R_ARM_LDRS_SB_G0:
8409     case elfcpp::R_ARM_LDRS_SB_G1:
8410     case elfcpp::R_ARM_LDRS_SB_G2:
8411     case elfcpp::R_ARM_LDC_SB_G0:
8412     case elfcpp::R_ARM_LDC_SB_G1:
8413     case elfcpp::R_ARM_LDC_SB_G2:
8414     case elfcpp::R_ARM_MOVW_BREL_NC:
8415     case elfcpp::R_ARM_MOVT_BREL:
8416     case elfcpp::R_ARM_MOVW_BREL:
8417     case elfcpp::R_ARM_THM_MOVW_BREL_NC:
8418     case elfcpp::R_ARM_THM_MOVT_BREL:
8419     case elfcpp::R_ARM_THM_MOVW_BREL:
8420     case elfcpp::R_ARM_GOTOFF32:
8421     case elfcpp::R_ARM_GOTOFF12:
8422     case elfcpp::R_ARM_SBREL31:
8423       return Symbol::RELATIVE_REF;
8424
8425     case elfcpp::R_ARM_PLT32:
8426     case elfcpp::R_ARM_CALL:
8427     case elfcpp::R_ARM_JUMP24:
8428     case elfcpp::R_ARM_THM_CALL:
8429     case elfcpp::R_ARM_THM_JUMP24:
8430     case elfcpp::R_ARM_THM_JUMP19:
8431     case elfcpp::R_ARM_THM_JUMP6:
8432     case elfcpp::R_ARM_THM_JUMP11:
8433     case elfcpp::R_ARM_THM_JUMP8:
8434     // R_ARM_PREL31 is not used to relocate call/jump instructions but
8435     // in unwind tables. It may point to functions via PLTs.
8436     // So we treat it like call/jump relocations above.
8437     case elfcpp::R_ARM_PREL31:
8438       return Symbol::FUNCTION_CALL | Symbol::RELATIVE_REF;
8439
8440     case elfcpp::R_ARM_GOT_BREL:
8441     case elfcpp::R_ARM_GOT_ABS:
8442     case elfcpp::R_ARM_GOT_PREL:
8443       // Absolute in GOT.
8444       return Symbol::ABSOLUTE_REF;
8445
8446     case elfcpp::R_ARM_TLS_GD32:        // Global-dynamic
8447     case elfcpp::R_ARM_TLS_LDM32:       // Local-dynamic
8448     case elfcpp::R_ARM_TLS_LDO32:       // Alternate local-dynamic
8449     case elfcpp::R_ARM_TLS_IE32:        // Initial-exec
8450     case elfcpp::R_ARM_TLS_LE32:        // Local-exec
8451       return Symbol::TLS_REF;
8452
8453     case elfcpp::R_ARM_TARGET1:
8454     case elfcpp::R_ARM_TARGET2:
8455     case elfcpp::R_ARM_COPY:
8456     case elfcpp::R_ARM_GLOB_DAT:
8457     case elfcpp::R_ARM_JUMP_SLOT:
8458     case elfcpp::R_ARM_RELATIVE:
8459     case elfcpp::R_ARM_PC24:
8460     case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
8461     case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
8462     case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
8463     default:
8464       // Not expected.  We will give an error later.
8465       return 0;
8466     }
8467 }
8468
8469 // Report an unsupported relocation against a local symbol.
8470
8471 template<bool big_endian>
8472 void
8473 Target_arm<big_endian>::Scan::unsupported_reloc_local(
8474     Sized_relobj_file<32, big_endian>* object,
8475     unsigned int r_type)
8476 {
8477   gold_error(_("%s: unsupported reloc %u against local symbol"),
8478              object->name().c_str(), r_type);
8479 }
8480
8481 // We are about to emit a dynamic relocation of type R_TYPE.  If the
8482 // dynamic linker does not support it, issue an error.  The GNU linker
8483 // only issues a non-PIC error for an allocated read-only section.
8484 // Here we know the section is allocated, but we don't know that it is
8485 // read-only.  But we check for all the relocation types which the
8486 // glibc dynamic linker supports, so it seems appropriate to issue an
8487 // error even if the section is not read-only.
8488
8489 template<bool big_endian>
8490 void
8491 Target_arm<big_endian>::Scan::check_non_pic(Relobj* object,
8492                                             unsigned int r_type)
8493 {
8494   switch (r_type)
8495     {
8496     // These are the relocation types supported by glibc for ARM.
8497     case elfcpp::R_ARM_RELATIVE:
8498     case elfcpp::R_ARM_COPY:
8499     case elfcpp::R_ARM_GLOB_DAT:
8500     case elfcpp::R_ARM_JUMP_SLOT:
8501     case elfcpp::R_ARM_ABS32:
8502     case elfcpp::R_ARM_ABS32_NOI:
8503     case elfcpp::R_ARM_IRELATIVE:
8504     case elfcpp::R_ARM_PC24:
8505     // FIXME: The following 3 types are not supported by Android's dynamic
8506     // linker.
8507     case elfcpp::R_ARM_TLS_DTPMOD32:
8508     case elfcpp::R_ARM_TLS_DTPOFF32:
8509     case elfcpp::R_ARM_TLS_TPOFF32:
8510       return;
8511
8512     default:
8513       {
8514         // This prevents us from issuing more than one error per reloc
8515         // section.  But we can still wind up issuing more than one
8516         // error per object file.
8517         if (this->issued_non_pic_error_)
8518           return;
8519         const Arm_reloc_property* reloc_property =
8520           arm_reloc_property_table->get_reloc_property(r_type);
8521         gold_assert(reloc_property != NULL);
8522         object->error(_("requires unsupported dynamic reloc %s; "
8523                       "recompile with -fPIC"),
8524                       reloc_property->name().c_str());
8525         this->issued_non_pic_error_ = true;
8526         return;
8527       }
8528
8529     case elfcpp::R_ARM_NONE:
8530       gold_unreachable();
8531     }
8532 }
8533
8534
8535 // Return whether we need to make a PLT entry for a relocation of the
8536 // given type against a STT_GNU_IFUNC symbol.
8537
8538 template<bool big_endian>
8539 bool
8540 Target_arm<big_endian>::Scan::reloc_needs_plt_for_ifunc(
8541     Sized_relobj_file<32, big_endian>* object,
8542     unsigned int r_type)
8543 {
8544   int flags = Scan::get_reference_flags(r_type);
8545   if (flags & Symbol::TLS_REF)
8546     {
8547       gold_error(_("%s: unsupported TLS reloc %u for IFUNC symbol"),
8548                  object->name().c_str(), r_type);
8549       return false;
8550     }
8551   return flags != 0;
8552 }
8553
8554
8555 // Scan a relocation for a local symbol.
8556 // FIXME: This only handles a subset of relocation types used by Android
8557 // on ARM v5te devices.
8558
8559 template<bool big_endian>
8560 inline void
8561 Target_arm<big_endian>::Scan::local(Symbol_table* symtab,
8562                                     Layout* layout,
8563                                     Target_arm* target,
8564                                     Sized_relobj_file<32, big_endian>* object,
8565                                     unsigned int data_shndx,
8566                                     Output_section* output_section,
8567                                     const elfcpp::Rel<32, big_endian>& reloc,
8568                                     unsigned int r_type,
8569                                     const elfcpp::Sym<32, big_endian>& lsym,
8570                                     bool is_discarded)
8571 {
8572   if (is_discarded)
8573     return;
8574
8575   r_type = target->get_real_reloc_type(r_type);
8576
8577   // A local STT_GNU_IFUNC symbol may require a PLT entry.
8578   bool is_ifunc = lsym.get_st_type() == elfcpp::STT_GNU_IFUNC;
8579   if (is_ifunc && this->reloc_needs_plt_for_ifunc(object, r_type))
8580     {
8581       unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
8582       target->make_local_ifunc_plt_entry(symtab, layout, object, r_sym);
8583     }
8584
8585   switch (r_type)
8586     {
8587     case elfcpp::R_ARM_NONE:
8588     case elfcpp::R_ARM_V4BX:
8589     case elfcpp::R_ARM_GNU_VTENTRY:
8590     case elfcpp::R_ARM_GNU_VTINHERIT:
8591       break;
8592
8593     case elfcpp::R_ARM_ABS32:
8594     case elfcpp::R_ARM_ABS32_NOI:
8595       // If building a shared library (or a position-independent
8596       // executable), we need to create a dynamic relocation for
8597       // this location. The relocation applied at link time will
8598       // apply the link-time value, so we flag the location with
8599       // an R_ARM_RELATIVE relocation so the dynamic loader can
8600       // relocate it easily.
8601       if (parameters->options().output_is_position_independent())
8602         {
8603           Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8604           unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
8605           // If we are to add more other reloc types than R_ARM_ABS32,
8606           // we need to add check_non_pic(object, r_type) here.
8607           rel_dyn->add_local_relative(object, r_sym, elfcpp::R_ARM_RELATIVE,
8608                                       output_section, data_shndx,
8609                                       reloc.get_r_offset(), is_ifunc);
8610         }
8611       break;
8612
8613     case elfcpp::R_ARM_ABS16:
8614     case elfcpp::R_ARM_ABS12:
8615     case elfcpp::R_ARM_THM_ABS5:
8616     case elfcpp::R_ARM_ABS8:
8617     case elfcpp::R_ARM_BASE_ABS:
8618     case elfcpp::R_ARM_MOVW_ABS_NC:
8619     case elfcpp::R_ARM_MOVT_ABS:
8620     case elfcpp::R_ARM_THM_MOVW_ABS_NC:
8621     case elfcpp::R_ARM_THM_MOVT_ABS:
8622       // If building a shared library (or a position-independent
8623       // executable), we need to create a dynamic relocation for
8624       // this location. Because the addend needs to remain in the
8625       // data section, we need to be careful not to apply this
8626       // relocation statically.
8627       if (parameters->options().output_is_position_independent())
8628         {
8629           check_non_pic(object, r_type);
8630           Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8631           unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
8632           if (lsym.get_st_type() != elfcpp::STT_SECTION)
8633             rel_dyn->add_local(object, r_sym, r_type, output_section,
8634                                data_shndx, reloc.get_r_offset());
8635           else
8636             {
8637               gold_assert(lsym.get_st_value() == 0);
8638               unsigned int shndx = lsym.get_st_shndx();
8639               bool is_ordinary;
8640               shndx = object->adjust_sym_shndx(r_sym, shndx,
8641                                                &is_ordinary);
8642               if (!is_ordinary)
8643                 object->error(_("section symbol %u has bad shndx %u"),
8644                               r_sym, shndx);
8645               else
8646                 rel_dyn->add_local_section(object, shndx,
8647                                            r_type, output_section,
8648                                            data_shndx, reloc.get_r_offset());
8649             }
8650         }
8651       break;
8652
8653     case elfcpp::R_ARM_REL32:
8654     case elfcpp::R_ARM_LDR_PC_G0:
8655     case elfcpp::R_ARM_SBREL32:
8656     case elfcpp::R_ARM_THM_CALL:
8657     case elfcpp::R_ARM_THM_PC8:
8658     case elfcpp::R_ARM_BASE_PREL:
8659     case elfcpp::R_ARM_PLT32:
8660     case elfcpp::R_ARM_CALL:
8661     case elfcpp::R_ARM_JUMP24:
8662     case elfcpp::R_ARM_THM_JUMP24:
8663     case elfcpp::R_ARM_SBREL31:
8664     case elfcpp::R_ARM_PREL31:
8665     case elfcpp::R_ARM_MOVW_PREL_NC:
8666     case elfcpp::R_ARM_MOVT_PREL:
8667     case elfcpp::R_ARM_THM_MOVW_PREL_NC:
8668     case elfcpp::R_ARM_THM_MOVT_PREL:
8669     case elfcpp::R_ARM_THM_JUMP19:
8670     case elfcpp::R_ARM_THM_JUMP6:
8671     case elfcpp::R_ARM_THM_ALU_PREL_11_0:
8672     case elfcpp::R_ARM_THM_PC12:
8673     case elfcpp::R_ARM_REL32_NOI:
8674     case elfcpp::R_ARM_ALU_PC_G0_NC:
8675     case elfcpp::R_ARM_ALU_PC_G0:
8676     case elfcpp::R_ARM_ALU_PC_G1_NC:
8677     case elfcpp::R_ARM_ALU_PC_G1:
8678     case elfcpp::R_ARM_ALU_PC_G2:
8679     case elfcpp::R_ARM_LDR_PC_G1:
8680     case elfcpp::R_ARM_LDR_PC_G2:
8681     case elfcpp::R_ARM_LDRS_PC_G0:
8682     case elfcpp::R_ARM_LDRS_PC_G1:
8683     case elfcpp::R_ARM_LDRS_PC_G2:
8684     case elfcpp::R_ARM_LDC_PC_G0:
8685     case elfcpp::R_ARM_LDC_PC_G1:
8686     case elfcpp::R_ARM_LDC_PC_G2:
8687     case elfcpp::R_ARM_ALU_SB_G0_NC:
8688     case elfcpp::R_ARM_ALU_SB_G0:
8689     case elfcpp::R_ARM_ALU_SB_G1_NC:
8690     case elfcpp::R_ARM_ALU_SB_G1:
8691     case elfcpp::R_ARM_ALU_SB_G2:
8692     case elfcpp::R_ARM_LDR_SB_G0:
8693     case elfcpp::R_ARM_LDR_SB_G1:
8694     case elfcpp::R_ARM_LDR_SB_G2:
8695     case elfcpp::R_ARM_LDRS_SB_G0:
8696     case elfcpp::R_ARM_LDRS_SB_G1:
8697     case elfcpp::R_ARM_LDRS_SB_G2:
8698     case elfcpp::R_ARM_LDC_SB_G0:
8699     case elfcpp::R_ARM_LDC_SB_G1:
8700     case elfcpp::R_ARM_LDC_SB_G2:
8701     case elfcpp::R_ARM_MOVW_BREL_NC:
8702     case elfcpp::R_ARM_MOVT_BREL:
8703     case elfcpp::R_ARM_MOVW_BREL:
8704     case elfcpp::R_ARM_THM_MOVW_BREL_NC:
8705     case elfcpp::R_ARM_THM_MOVT_BREL:
8706     case elfcpp::R_ARM_THM_MOVW_BREL:
8707     case elfcpp::R_ARM_THM_JUMP11:
8708     case elfcpp::R_ARM_THM_JUMP8:
8709       // We don't need to do anything for a relative addressing relocation
8710       // against a local symbol if it does not reference the GOT.
8711       break;
8712
8713     case elfcpp::R_ARM_GOTOFF32:
8714     case elfcpp::R_ARM_GOTOFF12:
8715       // We need a GOT section:
8716       target->got_section(symtab, layout);
8717       break;
8718
8719     case elfcpp::R_ARM_GOT_BREL:
8720     case elfcpp::R_ARM_GOT_PREL:
8721       {
8722         // The symbol requires a GOT entry.
8723         Arm_output_data_got<big_endian>* got =
8724           target->got_section(symtab, layout);
8725         unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
8726         if (got->add_local(object, r_sym, GOT_TYPE_STANDARD))
8727           {
8728             // If we are generating a shared object, we need to add a
8729             // dynamic RELATIVE relocation for this symbol's GOT entry.
8730             if (parameters->options().output_is_position_independent())
8731               {
8732                 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8733                 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
8734                 rel_dyn->add_local_relative(
8735                     object, r_sym, elfcpp::R_ARM_RELATIVE, got,
8736                     object->local_got_offset(r_sym, GOT_TYPE_STANDARD));
8737               }
8738           }
8739       }
8740       break;
8741
8742     case elfcpp::R_ARM_TARGET1:
8743     case elfcpp::R_ARM_TARGET2:
8744       // This should have been mapped to another type already.
8745       // Fall through.
8746     case elfcpp::R_ARM_COPY:
8747     case elfcpp::R_ARM_GLOB_DAT:
8748     case elfcpp::R_ARM_JUMP_SLOT:
8749     case elfcpp::R_ARM_RELATIVE:
8750       // These are relocations which should only be seen by the
8751       // dynamic linker, and should never be seen here.
8752       gold_error(_("%s: unexpected reloc %u in object file"),
8753                  object->name().c_str(), r_type);
8754       break;
8755
8756
8757       // These are initial TLS relocs, which are expected when
8758       // linking.
8759     case elfcpp::R_ARM_TLS_GD32:        // Global-dynamic
8760     case elfcpp::R_ARM_TLS_LDM32:       // Local-dynamic
8761     case elfcpp::R_ARM_TLS_LDO32:       // Alternate local-dynamic
8762     case elfcpp::R_ARM_TLS_IE32:        // Initial-exec
8763     case elfcpp::R_ARM_TLS_LE32:        // Local-exec
8764       {
8765         bool output_is_shared = parameters->options().shared();
8766         const tls::Tls_optimization optimized_type
8767             = Target_arm<big_endian>::optimize_tls_reloc(!output_is_shared,
8768                                                          r_type);
8769         switch (r_type)
8770           {
8771           case elfcpp::R_ARM_TLS_GD32:          // Global-dynamic
8772             if (optimized_type == tls::TLSOPT_NONE)
8773               {
8774                 // Create a pair of GOT entries for the module index and
8775                 // dtv-relative offset.
8776                 Arm_output_data_got<big_endian>* got
8777                     = target->got_section(symtab, layout);
8778                 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
8779                 unsigned int shndx = lsym.get_st_shndx();
8780                 bool is_ordinary;
8781                 shndx = object->adjust_sym_shndx(r_sym, shndx, &is_ordinary);
8782                 if (!is_ordinary)
8783                   {
8784                     object->error(_("local symbol %u has bad shndx %u"),
8785                                   r_sym, shndx);
8786                     break;
8787                   }
8788
8789                 if (!parameters->doing_static_link())
8790                   got->add_local_pair_with_rel(object, r_sym, shndx,
8791                                                GOT_TYPE_TLS_PAIR,
8792                                                target->rel_dyn_section(layout),
8793                                                elfcpp::R_ARM_TLS_DTPMOD32);
8794                 else
8795                   got->add_tls_gd32_with_static_reloc(GOT_TYPE_TLS_PAIR,
8796                                                       object, r_sym);
8797               }
8798             else
8799               // FIXME: TLS optimization not supported yet.
8800               gold_unreachable();
8801             break;
8802
8803           case elfcpp::R_ARM_TLS_LDM32:         // Local-dynamic
8804             if (optimized_type == tls::TLSOPT_NONE)
8805               {
8806                 // Create a GOT entry for the module index.
8807                 target->got_mod_index_entry(symtab, layout, object);
8808               }
8809             else
8810               // FIXME: TLS optimization not supported yet.
8811               gold_unreachable();
8812             break;
8813
8814           case elfcpp::R_ARM_TLS_LDO32:         // Alternate local-dynamic
8815             break;
8816
8817           case elfcpp::R_ARM_TLS_IE32:          // Initial-exec
8818             layout->set_has_static_tls();
8819             if (optimized_type == tls::TLSOPT_NONE)
8820               {
8821                 // Create a GOT entry for the tp-relative offset.
8822                 Arm_output_data_got<big_endian>* got
8823                   = target->got_section(symtab, layout);
8824                 unsigned int r_sym =
8825                    elfcpp::elf_r_sym<32>(reloc.get_r_info());
8826                 if (!parameters->doing_static_link())
8827                     got->add_local_with_rel(object, r_sym, GOT_TYPE_TLS_OFFSET,
8828                                             target->rel_dyn_section(layout),
8829                                             elfcpp::R_ARM_TLS_TPOFF32);
8830                 else if (!object->local_has_got_offset(r_sym,
8831                                                        GOT_TYPE_TLS_OFFSET))
8832                   {
8833                     got->add_local(object, r_sym, GOT_TYPE_TLS_OFFSET);
8834                     unsigned int got_offset =
8835                       object->local_got_offset(r_sym, GOT_TYPE_TLS_OFFSET);
8836                     got->add_static_reloc(got_offset,
8837                                           elfcpp::R_ARM_TLS_TPOFF32, object,
8838                                           r_sym);
8839                   }
8840               }
8841             else
8842               // FIXME: TLS optimization not supported yet.
8843               gold_unreachable();
8844             break;
8845
8846           case elfcpp::R_ARM_TLS_LE32:          // Local-exec
8847             layout->set_has_static_tls();
8848             if (output_is_shared)
8849               {
8850                 // We need to create a dynamic relocation.
8851                 gold_assert(lsym.get_st_type() != elfcpp::STT_SECTION);
8852                 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
8853                 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8854                 rel_dyn->add_local(object, r_sym, elfcpp::R_ARM_TLS_TPOFF32,
8855                                    output_section, data_shndx,
8856                                    reloc.get_r_offset());
8857               }
8858             break;
8859
8860           default:
8861             gold_unreachable();
8862           }
8863       }
8864       break;
8865
8866     case elfcpp::R_ARM_PC24:
8867     case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
8868     case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
8869     case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
8870     default:
8871       unsupported_reloc_local(object, r_type);
8872       break;
8873     }
8874 }
8875
8876 // Report an unsupported relocation against a global symbol.
8877
8878 template<bool big_endian>
8879 void
8880 Target_arm<big_endian>::Scan::unsupported_reloc_global(
8881     Sized_relobj_file<32, big_endian>* object,
8882     unsigned int r_type,
8883     Symbol* gsym)
8884 {
8885   gold_error(_("%s: unsupported reloc %u against global symbol %s"),
8886              object->name().c_str(), r_type, gsym->demangled_name().c_str());
8887 }
8888
8889 template<bool big_endian>
8890 inline bool
8891 Target_arm<big_endian>::Scan::possible_function_pointer_reloc(
8892     unsigned int r_type)
8893 {
8894   switch (r_type)
8895     {
8896     case elfcpp::R_ARM_PC24:
8897     case elfcpp::R_ARM_THM_CALL:
8898     case elfcpp::R_ARM_PLT32:
8899     case elfcpp::R_ARM_CALL:
8900     case elfcpp::R_ARM_JUMP24:
8901     case elfcpp::R_ARM_THM_JUMP24:
8902     case elfcpp::R_ARM_SBREL31:
8903     case elfcpp::R_ARM_PREL31:
8904     case elfcpp::R_ARM_THM_JUMP19:
8905     case elfcpp::R_ARM_THM_JUMP6:
8906     case elfcpp::R_ARM_THM_JUMP11:
8907     case elfcpp::R_ARM_THM_JUMP8:
8908       // All the relocations above are branches except SBREL31 and PREL31.
8909       return false;
8910
8911     default:
8912       // Be conservative and assume this is a function pointer.
8913       return true;
8914     }
8915 }
8916
8917 template<bool big_endian>
8918 inline bool
8919 Target_arm<big_endian>::Scan::local_reloc_may_be_function_pointer(
8920   Symbol_table*,
8921   Layout*,
8922   Target_arm<big_endian>* target,
8923   Sized_relobj_file<32, big_endian>*,
8924   unsigned int,
8925   Output_section*,
8926   const elfcpp::Rel<32, big_endian>&,
8927   unsigned int r_type,
8928   const elfcpp::Sym<32, big_endian>&)
8929 {
8930   r_type = target->get_real_reloc_type(r_type);
8931   return possible_function_pointer_reloc(r_type);
8932 }
8933
8934 template<bool big_endian>
8935 inline bool
8936 Target_arm<big_endian>::Scan::global_reloc_may_be_function_pointer(
8937   Symbol_table*,
8938   Layout*,
8939   Target_arm<big_endian>* target,
8940   Sized_relobj_file<32, big_endian>*,
8941   unsigned int,
8942   Output_section*,
8943   const elfcpp::Rel<32, big_endian>&,
8944   unsigned int r_type,
8945   Symbol* gsym)
8946 {
8947   // GOT is not a function.
8948   if (strcmp(gsym->name(), "_GLOBAL_OFFSET_TABLE_") == 0)
8949     return false;
8950
8951   r_type = target->get_real_reloc_type(r_type);
8952   return possible_function_pointer_reloc(r_type);
8953 }
8954
8955 // Scan a relocation for a global symbol.
8956
8957 template<bool big_endian>
8958 inline void
8959 Target_arm<big_endian>::Scan::global(Symbol_table* symtab,
8960                                      Layout* layout,
8961                                      Target_arm* target,
8962                                      Sized_relobj_file<32, big_endian>* object,
8963                                      unsigned int data_shndx,
8964                                      Output_section* output_section,
8965                                      const elfcpp::Rel<32, big_endian>& reloc,
8966                                      unsigned int r_type,
8967                                      Symbol* gsym)
8968 {
8969   // A reference to _GLOBAL_OFFSET_TABLE_ implies that we need a got
8970   // section.  We check here to avoid creating a dynamic reloc against
8971   // _GLOBAL_OFFSET_TABLE_.
8972   if (!target->has_got_section()
8973       && strcmp(gsym->name(), "_GLOBAL_OFFSET_TABLE_") == 0)
8974     target->got_section(symtab, layout);
8975
8976   // A STT_GNU_IFUNC symbol may require a PLT entry.
8977   if (gsym->type() == elfcpp::STT_GNU_IFUNC
8978       && this->reloc_needs_plt_for_ifunc(object, r_type))
8979     target->make_plt_entry(symtab, layout, gsym);
8980
8981   r_type = target->get_real_reloc_type(r_type);
8982   switch (r_type)
8983     {
8984     case elfcpp::R_ARM_NONE:
8985     case elfcpp::R_ARM_V4BX:
8986     case elfcpp::R_ARM_GNU_VTENTRY:
8987     case elfcpp::R_ARM_GNU_VTINHERIT:
8988       break;
8989
8990     case elfcpp::R_ARM_ABS32:
8991     case elfcpp::R_ARM_ABS16:
8992     case elfcpp::R_ARM_ABS12:
8993     case elfcpp::R_ARM_THM_ABS5:
8994     case elfcpp::R_ARM_ABS8:
8995     case elfcpp::R_ARM_BASE_ABS:
8996     case elfcpp::R_ARM_MOVW_ABS_NC:
8997     case elfcpp::R_ARM_MOVT_ABS:
8998     case elfcpp::R_ARM_THM_MOVW_ABS_NC:
8999     case elfcpp::R_ARM_THM_MOVT_ABS:
9000     case elfcpp::R_ARM_ABS32_NOI:
9001       // Absolute addressing relocations.
9002       {
9003         // Make a PLT entry if necessary.
9004         if (this->symbol_needs_plt_entry(gsym))
9005           {
9006             target->make_plt_entry(symtab, layout, gsym);
9007             // Since this is not a PC-relative relocation, we may be
9008             // taking the address of a function. In that case we need to
9009             // set the entry in the dynamic symbol table to the address of
9010             // the PLT entry.
9011             if (gsym->is_from_dynobj() && !parameters->options().shared())
9012               gsym->set_needs_dynsym_value();
9013           }
9014         // Make a dynamic relocation if necessary.
9015         if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type)))
9016           {
9017             if (!parameters->options().output_is_position_independent()
9018                 && gsym->may_need_copy_reloc())
9019               {
9020                 target->copy_reloc(symtab, layout, object,
9021                                    data_shndx, output_section, gsym, reloc);
9022               }
9023             else if ((r_type == elfcpp::R_ARM_ABS32
9024                       || r_type == elfcpp::R_ARM_ABS32_NOI)
9025                      && gsym->type() == elfcpp::STT_GNU_IFUNC
9026                      && gsym->can_use_relative_reloc(false)
9027                      && !gsym->is_from_dynobj()
9028                      && !gsym->is_undefined()
9029                      && !gsym->is_preemptible())
9030               {
9031                 // Use an IRELATIVE reloc for a locally defined STT_GNU_IFUNC
9032                 // symbol. This makes a function address in a PIE executable
9033                 // match the address in a shared library that it links against.
9034                 Reloc_section* rel_irelative =
9035                     target->rel_irelative_section(layout);
9036                 unsigned int r_type = elfcpp::R_ARM_IRELATIVE;
9037                 rel_irelative->add_symbolless_global_addend(
9038                     gsym, r_type, output_section, object,
9039                     data_shndx, reloc.get_r_offset());
9040               }
9041             else if ((r_type == elfcpp::R_ARM_ABS32
9042                       || r_type == elfcpp::R_ARM_ABS32_NOI)
9043                      && gsym->can_use_relative_reloc(false))
9044               {
9045                 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
9046                 rel_dyn->add_global_relative(gsym, elfcpp::R_ARM_RELATIVE,
9047                                              output_section, object,
9048                                              data_shndx, reloc.get_r_offset());
9049               }
9050             else
9051               {
9052                 check_non_pic(object, r_type);
9053                 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
9054                 rel_dyn->add_global(gsym, r_type, output_section, object,
9055                                     data_shndx, reloc.get_r_offset());
9056               }
9057           }
9058       }
9059       break;
9060
9061     case elfcpp::R_ARM_GOTOFF32:
9062     case elfcpp::R_ARM_GOTOFF12:
9063       // We need a GOT section.
9064       target->got_section(symtab, layout);
9065       break;
9066
9067     case elfcpp::R_ARM_REL32:
9068     case elfcpp::R_ARM_LDR_PC_G0:
9069     case elfcpp::R_ARM_SBREL32:
9070     case elfcpp::R_ARM_THM_PC8:
9071     case elfcpp::R_ARM_BASE_PREL:
9072     case elfcpp::R_ARM_MOVW_PREL_NC:
9073     case elfcpp::R_ARM_MOVT_PREL:
9074     case elfcpp::R_ARM_THM_MOVW_PREL_NC:
9075     case elfcpp::R_ARM_THM_MOVT_PREL:
9076     case elfcpp::R_ARM_THM_ALU_PREL_11_0:
9077     case elfcpp::R_ARM_THM_PC12:
9078     case elfcpp::R_ARM_REL32_NOI:
9079     case elfcpp::R_ARM_ALU_PC_G0_NC:
9080     case elfcpp::R_ARM_ALU_PC_G0:
9081     case elfcpp::R_ARM_ALU_PC_G1_NC:
9082     case elfcpp::R_ARM_ALU_PC_G1:
9083     case elfcpp::R_ARM_ALU_PC_G2:
9084     case elfcpp::R_ARM_LDR_PC_G1:
9085     case elfcpp::R_ARM_LDR_PC_G2:
9086     case elfcpp::R_ARM_LDRS_PC_G0:
9087     case elfcpp::R_ARM_LDRS_PC_G1:
9088     case elfcpp::R_ARM_LDRS_PC_G2:
9089     case elfcpp::R_ARM_LDC_PC_G0:
9090     case elfcpp::R_ARM_LDC_PC_G1:
9091     case elfcpp::R_ARM_LDC_PC_G2:
9092     case elfcpp::R_ARM_ALU_SB_G0_NC:
9093     case elfcpp::R_ARM_ALU_SB_G0:
9094     case elfcpp::R_ARM_ALU_SB_G1_NC:
9095     case elfcpp::R_ARM_ALU_SB_G1:
9096     case elfcpp::R_ARM_ALU_SB_G2:
9097     case elfcpp::R_ARM_LDR_SB_G0:
9098     case elfcpp::R_ARM_LDR_SB_G1:
9099     case elfcpp::R_ARM_LDR_SB_G2:
9100     case elfcpp::R_ARM_LDRS_SB_G0:
9101     case elfcpp::R_ARM_LDRS_SB_G1:
9102     case elfcpp::R_ARM_LDRS_SB_G2:
9103     case elfcpp::R_ARM_LDC_SB_G0:
9104     case elfcpp::R_ARM_LDC_SB_G1:
9105     case elfcpp::R_ARM_LDC_SB_G2:
9106     case elfcpp::R_ARM_MOVW_BREL_NC:
9107     case elfcpp::R_ARM_MOVT_BREL:
9108     case elfcpp::R_ARM_MOVW_BREL:
9109     case elfcpp::R_ARM_THM_MOVW_BREL_NC:
9110     case elfcpp::R_ARM_THM_MOVT_BREL:
9111     case elfcpp::R_ARM_THM_MOVW_BREL:
9112       // Relative addressing relocations.
9113       {
9114         // Make a dynamic relocation if necessary.
9115         if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type)))
9116           {
9117             if (parameters->options().output_is_executable()
9118                 && target->may_need_copy_reloc(gsym))
9119               {
9120                 target->copy_reloc(symtab, layout, object,
9121                                    data_shndx, output_section, gsym, reloc);
9122               }
9123             else
9124               {
9125                 check_non_pic(object, r_type);
9126                 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
9127                 rel_dyn->add_global(gsym, r_type, output_section, object,
9128                                     data_shndx, reloc.get_r_offset());
9129               }
9130           }
9131       }
9132       break;
9133
9134     case elfcpp::R_ARM_THM_CALL:
9135     case elfcpp::R_ARM_PLT32:
9136     case elfcpp::R_ARM_CALL:
9137     case elfcpp::R_ARM_JUMP24:
9138     case elfcpp::R_ARM_THM_JUMP24:
9139     case elfcpp::R_ARM_SBREL31:
9140     case elfcpp::R_ARM_PREL31:
9141     case elfcpp::R_ARM_THM_JUMP19:
9142     case elfcpp::R_ARM_THM_JUMP6:
9143     case elfcpp::R_ARM_THM_JUMP11:
9144     case elfcpp::R_ARM_THM_JUMP8:
9145       // All the relocation above are branches except for the PREL31 ones.
9146       // A PREL31 relocation can point to a personality function in a shared
9147       // library.  In that case we want to use a PLT because we want to
9148       // call the personality routine and the dynamic linkers we care about
9149       // do not support dynamic PREL31 relocations. An REL31 relocation may
9150       // point to a function whose unwinding behaviour is being described but
9151       // we will not mistakenly generate a PLT for that because we should use
9152       // a local section symbol.
9153
9154       // If the symbol is fully resolved, this is just a relative
9155       // local reloc.  Otherwise we need a PLT entry.
9156       if (gsym->final_value_is_known())
9157         break;
9158       // If building a shared library, we can also skip the PLT entry
9159       // if the symbol is defined in the output file and is protected
9160       // or hidden.
9161       if (gsym->is_defined()
9162           && !gsym->is_from_dynobj()
9163           && !gsym->is_preemptible())
9164         break;
9165       target->make_plt_entry(symtab, layout, gsym);
9166       break;
9167
9168     case elfcpp::R_ARM_GOT_BREL:
9169     case elfcpp::R_ARM_GOT_ABS:
9170     case elfcpp::R_ARM_GOT_PREL:
9171       {
9172         // The symbol requires a GOT entry.
9173         Arm_output_data_got<big_endian>* got =
9174           target->got_section(symtab, layout);
9175         if (gsym->final_value_is_known())
9176           {
9177             // For a STT_GNU_IFUNC symbol we want the PLT address.
9178             if (gsym->type() == elfcpp::STT_GNU_IFUNC)
9179               got->add_global_plt(gsym, GOT_TYPE_STANDARD);
9180             else
9181               got->add_global(gsym, GOT_TYPE_STANDARD);
9182           }
9183         else
9184           {
9185             // If this symbol is not fully resolved, we need to add a
9186             // GOT entry with a dynamic relocation.
9187             Reloc_section* rel_dyn = target->rel_dyn_section(layout);
9188             if (gsym->is_from_dynobj()
9189                 || gsym->is_undefined()
9190                 || gsym->is_preemptible()
9191                 || (gsym->visibility() == elfcpp::STV_PROTECTED
9192                     && parameters->options().shared())
9193                 || (gsym->type() == elfcpp::STT_GNU_IFUNC
9194                     && parameters->options().output_is_position_independent()))
9195               got->add_global_with_rel(gsym, GOT_TYPE_STANDARD,
9196                                        rel_dyn, elfcpp::R_ARM_GLOB_DAT);
9197             else
9198               {
9199                 // For a STT_GNU_IFUNC symbol we want to write the PLT
9200                 // offset into the GOT, so that function pointer
9201                 // comparisons work correctly.
9202                 bool is_new;
9203                 if (gsym->type() != elfcpp::STT_GNU_IFUNC)
9204                   is_new = got->add_global(gsym, GOT_TYPE_STANDARD);
9205                 else
9206                   {
9207                     is_new = got->add_global_plt(gsym, GOT_TYPE_STANDARD);
9208                     // Tell the dynamic linker to use the PLT address
9209                     // when resolving relocations.
9210                     if (gsym->is_from_dynobj()
9211                         && !parameters->options().shared())
9212                       gsym->set_needs_dynsym_value();
9213                   }
9214                 if (is_new)
9215                   rel_dyn->add_global_relative(
9216                       gsym, elfcpp::R_ARM_RELATIVE, got,
9217                       gsym->got_offset(GOT_TYPE_STANDARD));
9218               }
9219           }
9220       }
9221       break;
9222
9223     case elfcpp::R_ARM_TARGET1:
9224     case elfcpp::R_ARM_TARGET2:
9225       // These should have been mapped to other types already.
9226       // Fall through.
9227     case elfcpp::R_ARM_COPY:
9228     case elfcpp::R_ARM_GLOB_DAT:
9229     case elfcpp::R_ARM_JUMP_SLOT:
9230     case elfcpp::R_ARM_RELATIVE:
9231       // These are relocations which should only be seen by the
9232       // dynamic linker, and should never be seen here.
9233       gold_error(_("%s: unexpected reloc %u in object file"),
9234                  object->name().c_str(), r_type);
9235       break;
9236
9237       // These are initial tls relocs, which are expected when
9238       // linking.
9239     case elfcpp::R_ARM_TLS_GD32:        // Global-dynamic
9240     case elfcpp::R_ARM_TLS_LDM32:       // Local-dynamic
9241     case elfcpp::R_ARM_TLS_LDO32:       // Alternate local-dynamic
9242     case elfcpp::R_ARM_TLS_IE32:        // Initial-exec
9243     case elfcpp::R_ARM_TLS_LE32:        // Local-exec
9244       {
9245         const bool is_final = gsym->final_value_is_known();
9246         const tls::Tls_optimization optimized_type
9247             = Target_arm<big_endian>::optimize_tls_reloc(is_final, r_type);
9248         switch (r_type)
9249           {
9250           case elfcpp::R_ARM_TLS_GD32:          // Global-dynamic
9251             if (optimized_type == tls::TLSOPT_NONE)
9252               {
9253                 // Create a pair of GOT entries for the module index and
9254                 // dtv-relative offset.
9255                 Arm_output_data_got<big_endian>* got
9256                     = target->got_section(symtab, layout);
9257                 if (!parameters->doing_static_link())
9258                   got->add_global_pair_with_rel(gsym, GOT_TYPE_TLS_PAIR,
9259                                                 target->rel_dyn_section(layout),
9260                                                 elfcpp::R_ARM_TLS_DTPMOD32,
9261                                                 elfcpp::R_ARM_TLS_DTPOFF32);
9262                 else
9263                   got->add_tls_gd32_with_static_reloc(GOT_TYPE_TLS_PAIR, gsym);
9264               }
9265             else
9266               // FIXME: TLS optimization not supported yet.
9267               gold_unreachable();
9268             break;
9269
9270           case elfcpp::R_ARM_TLS_LDM32:         // Local-dynamic
9271             if (optimized_type == tls::TLSOPT_NONE)
9272               {
9273                 // Create a GOT entry for the module index.
9274                 target->got_mod_index_entry(symtab, layout, object);
9275               }
9276             else
9277               // FIXME: TLS optimization not supported yet.
9278               gold_unreachable();
9279             break;
9280
9281           case elfcpp::R_ARM_TLS_LDO32:         // Alternate local-dynamic
9282             break;
9283
9284           case elfcpp::R_ARM_TLS_IE32:          // Initial-exec
9285             layout->set_has_static_tls();
9286             if (optimized_type == tls::TLSOPT_NONE)
9287               {
9288                 // Create a GOT entry for the tp-relative offset.
9289                 Arm_output_data_got<big_endian>* got
9290                   = target->got_section(symtab, layout);
9291                 if (!parameters->doing_static_link())
9292                   got->add_global_with_rel(gsym, GOT_TYPE_TLS_OFFSET,
9293                                            target->rel_dyn_section(layout),
9294                                            elfcpp::R_ARM_TLS_TPOFF32);
9295                 else if (!gsym->has_got_offset(GOT_TYPE_TLS_OFFSET))
9296                   {
9297                     got->add_global(gsym, GOT_TYPE_TLS_OFFSET);
9298                     unsigned int got_offset =
9299                        gsym->got_offset(GOT_TYPE_TLS_OFFSET);
9300                     got->add_static_reloc(got_offset,
9301                                           elfcpp::R_ARM_TLS_TPOFF32, gsym);
9302                   }
9303               }
9304             else
9305               // FIXME: TLS optimization not supported yet.
9306               gold_unreachable();
9307             break;
9308
9309           case elfcpp::R_ARM_TLS_LE32:  // Local-exec
9310             layout->set_has_static_tls();
9311             if (parameters->options().shared())
9312               {
9313                 // We need to create a dynamic relocation.
9314                 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
9315                 rel_dyn->add_global(gsym, elfcpp::R_ARM_TLS_TPOFF32,
9316                                     output_section, object,
9317                                     data_shndx, reloc.get_r_offset());
9318               }
9319             break;
9320
9321           default:
9322             gold_unreachable();
9323           }
9324       }
9325       break;
9326
9327     case elfcpp::R_ARM_PC24:
9328     case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
9329     case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
9330     case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
9331     default:
9332       unsupported_reloc_global(object, r_type, gsym);
9333       break;
9334     }
9335 }
9336
9337 // Process relocations for gc.
9338
9339 template<bool big_endian>
9340 void
9341 Target_arm<big_endian>::gc_process_relocs(
9342     Symbol_table* symtab,
9343     Layout* layout,
9344     Sized_relobj_file<32, big_endian>* object,
9345     unsigned int data_shndx,
9346     unsigned int,
9347     const unsigned char* prelocs,
9348     size_t reloc_count,
9349     Output_section* output_section,
9350     bool needs_special_offset_handling,
9351     size_t local_symbol_count,
9352     const unsigned char* plocal_symbols)
9353 {
9354   typedef Target_arm<big_endian> Arm;
9355   typedef typename Target_arm<big_endian>::Scan Scan;
9356
9357   gold::gc_process_relocs<32, big_endian, Arm, Scan, Classify_reloc>(
9358     symtab,
9359     layout,
9360     this,
9361     object,
9362     data_shndx,
9363     prelocs,
9364     reloc_count,
9365     output_section,
9366     needs_special_offset_handling,
9367     local_symbol_count,
9368     plocal_symbols);
9369 }
9370
9371 // Scan relocations for a section.
9372
9373 template<bool big_endian>
9374 void
9375 Target_arm<big_endian>::scan_relocs(Symbol_table* symtab,
9376                                     Layout* layout,
9377                                     Sized_relobj_file<32, big_endian>* object,
9378                                     unsigned int data_shndx,
9379                                     unsigned int sh_type,
9380                                     const unsigned char* prelocs,
9381                                     size_t reloc_count,
9382                                     Output_section* output_section,
9383                                     bool needs_special_offset_handling,
9384                                     size_t local_symbol_count,
9385                                     const unsigned char* plocal_symbols)
9386 {
9387   if (sh_type == elfcpp::SHT_RELA)
9388     {
9389       gold_error(_("%s: unsupported RELA reloc section"),
9390                  object->name().c_str());
9391       return;
9392     }
9393
9394   gold::scan_relocs<32, big_endian, Target_arm, Scan, Classify_reloc>(
9395     symtab,
9396     layout,
9397     this,
9398     object,
9399     data_shndx,
9400     prelocs,
9401     reloc_count,
9402     output_section,
9403     needs_special_offset_handling,
9404     local_symbol_count,
9405     plocal_symbols);
9406 }
9407
9408 // Finalize the sections.
9409
9410 template<bool big_endian>
9411 void
9412 Target_arm<big_endian>::do_finalize_sections(
9413     Layout* layout,
9414     const Input_objects* input_objects,
9415     Symbol_table*)
9416 {
9417   bool merged_any_attributes = false;
9418   // Merge processor-specific flags.
9419   for (Input_objects::Relobj_iterator p = input_objects->relobj_begin();
9420        p != input_objects->relobj_end();
9421        ++p)
9422     {
9423       Arm_relobj<big_endian>* arm_relobj =
9424         Arm_relobj<big_endian>::as_arm_relobj(*p);
9425       if (arm_relobj->merge_flags_and_attributes())
9426         {
9427           this->merge_processor_specific_flags(
9428               arm_relobj->name(),
9429               arm_relobj->processor_specific_flags());
9430           this->merge_object_attributes(arm_relobj->name().c_str(),
9431                                         arm_relobj->attributes_section_data());
9432           merged_any_attributes = true;
9433         }
9434     }
9435
9436   for (Input_objects::Dynobj_iterator p = input_objects->dynobj_begin();
9437        p != input_objects->dynobj_end();
9438        ++p)
9439     {
9440       Arm_dynobj<big_endian>* arm_dynobj =
9441         Arm_dynobj<big_endian>::as_arm_dynobj(*p);
9442       this->merge_processor_specific_flags(
9443           arm_dynobj->name(),
9444           arm_dynobj->processor_specific_flags());
9445       this->merge_object_attributes(arm_dynobj->name().c_str(),
9446                                     arm_dynobj->attributes_section_data());
9447       merged_any_attributes = true;
9448     }
9449
9450   // Create an empty uninitialized attribute section if we still don't have it
9451   // at this moment.  This happens if there is no attributes sections in all
9452   // inputs.
9453   if (this->attributes_section_data_ == NULL)
9454     this->attributes_section_data_ = new Attributes_section_data(NULL, 0);
9455
9456   const Object_attribute* cpu_arch_attr =
9457     this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
9458   // Check if we need to use Cortex-A8 workaround.
9459   if (parameters->options().user_set_fix_cortex_a8())
9460     this->fix_cortex_a8_ = parameters->options().fix_cortex_a8();
9461   else
9462     {
9463       // If neither --fix-cortex-a8 nor --no-fix-cortex-a8 is used, turn on
9464       // Cortex-A8 erratum workaround for ARMv7-A or ARMv7 with unknown
9465       // profile.
9466       const Object_attribute* cpu_arch_profile_attr =
9467         this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch_profile);
9468       this->fix_cortex_a8_ =
9469         (cpu_arch_attr->int_value() == elfcpp::TAG_CPU_ARCH_V7
9470          && (cpu_arch_profile_attr->int_value() == 'A'
9471              || cpu_arch_profile_attr->int_value() == 0));
9472     }
9473
9474   // Check if we can use V4BX interworking.
9475   // The V4BX interworking stub contains BX instruction,
9476   // which is not specified for some profiles.
9477   if (this->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING
9478       && !this->may_use_v4t_interworking())
9479     gold_error(_("unable to provide V4BX reloc interworking fix up; "
9480                  "the target profile does not support BX instruction"));
9481
9482   // Fill in some more dynamic tags.
9483   const Reloc_section* rel_plt = (this->plt_ == NULL
9484                                   ? NULL
9485                                   : this->plt_->rel_plt());
9486   layout->add_target_dynamic_tags(true, this->got_plt_, rel_plt,
9487                                   this->rel_dyn_, true, false);
9488
9489   // Emit any relocs we saved in an attempt to avoid generating COPY
9490   // relocs.
9491   if (this->copy_relocs_.any_saved_relocs())
9492     this->copy_relocs_.emit(this->rel_dyn_section(layout));
9493
9494   // Handle the .ARM.exidx section.
9495   Output_section* exidx_section = layout->find_output_section(".ARM.exidx");
9496
9497   if (!parameters->options().relocatable())
9498     {
9499       if (exidx_section != NULL
9500           && exidx_section->type() == elfcpp::SHT_ARM_EXIDX)
9501         {
9502           // For the ARM target, we need to add a PT_ARM_EXIDX segment for
9503           // the .ARM.exidx section.
9504           if (!layout->script_options()->saw_phdrs_clause())
9505             {
9506               gold_assert(layout->find_output_segment(elfcpp::PT_ARM_EXIDX, 0,
9507                                                       0)
9508                           == NULL);
9509               Output_segment*  exidx_segment =
9510                 layout->make_output_segment(elfcpp::PT_ARM_EXIDX, elfcpp::PF_R);
9511               exidx_segment->add_output_section_to_nonload(exidx_section,
9512                                                            elfcpp::PF_R);
9513             }
9514         }
9515     }
9516
9517   // Create an .ARM.attributes section if we have merged any attributes
9518   // from inputs.
9519   if (merged_any_attributes)
9520     {
9521       Output_attributes_section_data* attributes_section =
9522       new Output_attributes_section_data(*this->attributes_section_data_);
9523       layout->add_output_section_data(".ARM.attributes",
9524                                       elfcpp::SHT_ARM_ATTRIBUTES, 0,
9525                                       attributes_section, ORDER_INVALID,
9526                                       false);
9527     }
9528
9529   // Fix up links in section EXIDX headers.
9530   for (Layout::Section_list::const_iterator p = layout->section_list().begin();
9531        p != layout->section_list().end();
9532        ++p)
9533     if ((*p)->type() == elfcpp::SHT_ARM_EXIDX)
9534       {
9535         Arm_output_section<big_endian>* os =
9536           Arm_output_section<big_endian>::as_arm_output_section(*p);
9537         os->set_exidx_section_link();
9538       }
9539 }
9540
9541 // Return whether a direct absolute static relocation needs to be applied.
9542 // In cases where Scan::local() or Scan::global() has created
9543 // a dynamic relocation other than R_ARM_RELATIVE, the addend
9544 // of the relocation is carried in the data, and we must not
9545 // apply the static relocation.
9546
9547 template<bool big_endian>
9548 inline bool
9549 Target_arm<big_endian>::Relocate::should_apply_static_reloc(
9550     const Sized_symbol<32>* gsym,
9551     unsigned int r_type,
9552     bool is_32bit,
9553     Output_section* output_section)
9554 {
9555   // If the output section is not allocated, then we didn't call
9556   // scan_relocs, we didn't create a dynamic reloc, and we must apply
9557   // the reloc here.
9558   if ((output_section->flags() & elfcpp::SHF_ALLOC) == 0)
9559       return true;
9560
9561   int ref_flags = Scan::get_reference_flags(r_type);
9562
9563   // For local symbols, we will have created a non-RELATIVE dynamic
9564   // relocation only if (a) the output is position independent,
9565   // (b) the relocation is absolute (not pc- or segment-relative), and
9566   // (c) the relocation is not 32 bits wide.
9567   if (gsym == NULL)
9568     return !(parameters->options().output_is_position_independent()
9569              && (ref_flags & Symbol::ABSOLUTE_REF)
9570              && !is_32bit);
9571
9572   // For global symbols, we use the same helper routines used in the
9573   // scan pass.  If we did not create a dynamic relocation, or if we
9574   // created a RELATIVE dynamic relocation, we should apply the static
9575   // relocation.
9576   bool has_dyn = gsym->needs_dynamic_reloc(ref_flags);
9577   bool is_rel = (ref_flags & Symbol::ABSOLUTE_REF)
9578                  && gsym->can_use_relative_reloc(ref_flags
9579                                                  & Symbol::FUNCTION_CALL);
9580   return !has_dyn || is_rel;
9581 }
9582
9583 // Perform a relocation.
9584
9585 template<bool big_endian>
9586 inline bool
9587 Target_arm<big_endian>::Relocate::relocate(
9588     const Relocate_info<32, big_endian>* relinfo,
9589     unsigned int,
9590     Target_arm* target,
9591     Output_section* output_section,
9592     size_t relnum,
9593     const unsigned char* preloc,
9594     const Sized_symbol<32>* gsym,
9595     const Symbol_value<32>* psymval,
9596     unsigned char* view,
9597     Arm_address address,
9598     section_size_type view_size)
9599 {
9600   if (view == NULL)
9601     return true;
9602
9603   typedef Arm_relocate_functions<big_endian> Arm_relocate_functions;
9604
9605   const elfcpp::Rel<32, big_endian> rel(preloc);
9606   unsigned int r_type = elfcpp::elf_r_type<32>(rel.get_r_info());
9607   r_type = target->get_real_reloc_type(r_type);
9608   const Arm_reloc_property* reloc_property =
9609     arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
9610   if (reloc_property == NULL)
9611     {
9612       std::string reloc_name =
9613         arm_reloc_property_table->reloc_name_in_error_message(r_type);
9614       gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
9615                              _("cannot relocate %s in object file"),
9616                              reloc_name.c_str());
9617       return true;
9618     }
9619
9620   const Arm_relobj<big_endian>* object =
9621     Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
9622
9623   // If the final branch target of a relocation is THUMB instruction, this
9624   // is 1.  Otherwise it is 0.
9625   Arm_address thumb_bit = 0;
9626   Symbol_value<32> symval;
9627   bool is_weakly_undefined_without_plt = false;
9628   bool have_got_offset = false;
9629   unsigned int got_offset = 0;
9630
9631   // If the relocation uses the GOT entry of a symbol instead of the symbol
9632   // itself, we don't care about whether the symbol is defined or what kind
9633   // of symbol it is.
9634   if (reloc_property->uses_got_entry())
9635     {
9636       // Get the GOT offset.
9637       // The GOT pointer points to the end of the GOT section.
9638       // We need to subtract the size of the GOT section to get
9639       // the actual offset to use in the relocation.
9640       // TODO: We should move GOT offset computing code in TLS relocations
9641       // to here.
9642       switch (r_type)
9643         {
9644         case elfcpp::R_ARM_GOT_BREL:
9645         case elfcpp::R_ARM_GOT_PREL:
9646           if (gsym != NULL)
9647             {
9648               gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD));
9649               got_offset = (gsym->got_offset(GOT_TYPE_STANDARD)
9650                             - target->got_size());
9651             }
9652           else
9653             {
9654               unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
9655               gold_assert(object->local_has_got_offset(r_sym,
9656                                                        GOT_TYPE_STANDARD));
9657               got_offset = (object->local_got_offset(r_sym, GOT_TYPE_STANDARD)
9658                             - target->got_size());
9659             }
9660           have_got_offset = true;
9661           break;
9662
9663         default:
9664           break;
9665         }
9666     }
9667   else if (relnum != Target_arm<big_endian>::fake_relnum_for_stubs)
9668     {
9669       if (gsym != NULL)
9670         {
9671           // This is a global symbol.  Determine if we use PLT and if the
9672           // final target is THUMB.
9673           if (gsym->use_plt_offset(Scan::get_reference_flags(r_type)))
9674             {
9675               // This uses a PLT, change the symbol value.
9676               symval.set_output_value(target->plt_address_for_global(gsym));
9677               psymval = &symval;
9678             }
9679           else if (gsym->is_weak_undefined())
9680             {
9681               // This is a weakly undefined symbol and we do not use PLT
9682               // for this relocation.  A branch targeting this symbol will
9683               // be converted into an NOP.
9684               is_weakly_undefined_without_plt = true;
9685             }
9686           else if (gsym->is_undefined() && reloc_property->uses_symbol())
9687             {
9688               // This relocation uses the symbol value but the symbol is
9689               // undefined.  Exit early and have the caller reporting an
9690               // error.
9691               return true;
9692             }
9693           else
9694             {
9695               // Set thumb bit if symbol:
9696               // -Has type STT_ARM_TFUNC or
9697               // -Has type STT_FUNC, is defined and with LSB in value set.
9698               thumb_bit =
9699                 (((gsym->type() == elfcpp::STT_ARM_TFUNC)
9700                  || (gsym->type() == elfcpp::STT_FUNC
9701                      && !gsym->is_undefined()
9702                      && ((psymval->value(object, 0) & 1) != 0)))
9703                 ? 1
9704                 : 0);
9705             }
9706         }
9707       else
9708         {
9709           // This is a local symbol.  Determine if the final target is THUMB.
9710           // We saved this information when all the local symbols were read.
9711           elfcpp::Elf_types<32>::Elf_WXword r_info = rel.get_r_info();
9712           unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
9713           thumb_bit = object->local_symbol_is_thumb_function(r_sym) ? 1 : 0;
9714
9715           if (psymval->is_ifunc_symbol() && object->local_has_plt_offset(r_sym))
9716             {
9717               symval.set_output_value(
9718                   target->plt_address_for_local(object, r_sym));
9719               psymval = &symval;
9720             }
9721         }
9722     }
9723   else
9724     {
9725       // This is a fake relocation synthesized for a stub.  It does not have
9726       // a real symbol.  We just look at the LSB of the symbol value to
9727       // determine if the target is THUMB or not.
9728       thumb_bit = ((psymval->value(object, 0) & 1) != 0);
9729     }
9730
9731   // Strip LSB if this points to a THUMB target.
9732   if (thumb_bit != 0
9733       && reloc_property->uses_thumb_bit()
9734       && ((psymval->value(object, 0) & 1) != 0))
9735     {
9736       Arm_address stripped_value =
9737         psymval->value(object, 0) & ~static_cast<Arm_address>(1);
9738       symval.set_output_value(stripped_value);
9739       psymval = &symval;
9740     }
9741
9742   // To look up relocation stubs, we need to pass the symbol table index of
9743   // a local symbol.
9744   unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
9745
9746   // Get the addressing origin of the output segment defining the
9747   // symbol gsym if needed (AAELF 4.6.1.2 Relocation types).
9748   Arm_address sym_origin = 0;
9749   if (reloc_property->uses_symbol_base())
9750     {
9751       if (r_type == elfcpp::R_ARM_BASE_ABS && gsym == NULL)
9752         // R_ARM_BASE_ABS with the NULL symbol will give the
9753         // absolute address of the GOT origin (GOT_ORG) (see ARM IHI
9754         // 0044C (AAELF): 4.6.1.8 Proxy generating relocations).
9755         sym_origin = target->got_plt_section()->address();
9756       else if (gsym == NULL)
9757         sym_origin = 0;
9758       else if (gsym->source() == Symbol::IN_OUTPUT_SEGMENT)
9759         sym_origin = gsym->output_segment()->vaddr();
9760       else if (gsym->source() == Symbol::IN_OUTPUT_DATA)
9761         sym_origin = gsym->output_data()->address();
9762
9763       // TODO: Assumes the segment base to be zero for the global symbols
9764       // till the proper support for the segment-base-relative addressing
9765       // will be implemented.  This is consistent with GNU ld.
9766     }
9767
9768   // For relative addressing relocation, find out the relative address base.
9769   Arm_address relative_address_base = 0;
9770   switch(reloc_property->relative_address_base())
9771     {
9772     case Arm_reloc_property::RAB_NONE:
9773     // Relocations with relative address bases RAB_TLS and RAB_tp are
9774     // handled by relocate_tls.  So we do not need to do anything here.
9775     case Arm_reloc_property::RAB_TLS:
9776     case Arm_reloc_property::RAB_tp:
9777       break;
9778     case Arm_reloc_property::RAB_B_S:
9779       relative_address_base = sym_origin;
9780       break;
9781     case Arm_reloc_property::RAB_GOT_ORG:
9782       relative_address_base = target->got_plt_section()->address();
9783       break;
9784     case Arm_reloc_property::RAB_P:
9785       relative_address_base = address;
9786       break;
9787     case Arm_reloc_property::RAB_Pa:
9788       relative_address_base = address & 0xfffffffcU;
9789       break;
9790     default:
9791       gold_unreachable();
9792     }
9793
9794   typename Arm_relocate_functions::Status reloc_status =
9795         Arm_relocate_functions::STATUS_OKAY;
9796   bool check_overflow = reloc_property->checks_overflow();
9797   switch (r_type)
9798     {
9799     case elfcpp::R_ARM_NONE:
9800       break;
9801
9802     case elfcpp::R_ARM_ABS8:
9803       if (should_apply_static_reloc(gsym, r_type, false, output_section))
9804         reloc_status = Arm_relocate_functions::abs8(view, object, psymval);
9805       break;
9806
9807     case elfcpp::R_ARM_ABS12:
9808       if (should_apply_static_reloc(gsym, r_type, false, output_section))
9809         reloc_status = Arm_relocate_functions::abs12(view, object, psymval);
9810       break;
9811
9812     case elfcpp::R_ARM_ABS16:
9813       if (should_apply_static_reloc(gsym, r_type, false, output_section))
9814         reloc_status = Arm_relocate_functions::abs16(view, object, psymval);
9815       break;
9816
9817     case elfcpp::R_ARM_ABS32:
9818       if (should_apply_static_reloc(gsym, r_type, true, output_section))
9819         reloc_status = Arm_relocate_functions::abs32(view, object, psymval,
9820                                                      thumb_bit);
9821       break;
9822
9823     case elfcpp::R_ARM_ABS32_NOI:
9824       if (should_apply_static_reloc(gsym, r_type, true, output_section))
9825         // No thumb bit for this relocation: (S + A)
9826         reloc_status = Arm_relocate_functions::abs32(view, object, psymval,
9827                                                      0);
9828       break;
9829
9830     case elfcpp::R_ARM_MOVW_ABS_NC:
9831       if (should_apply_static_reloc(gsym, r_type, false, output_section))
9832         reloc_status = Arm_relocate_functions::movw(view, object, psymval,
9833                                                     0, thumb_bit,
9834                                                     check_overflow);
9835       break;
9836
9837     case elfcpp::R_ARM_MOVT_ABS:
9838       if (should_apply_static_reloc(gsym, r_type, false, output_section))
9839         reloc_status = Arm_relocate_functions::movt(view, object, psymval, 0);
9840       break;
9841
9842     case elfcpp::R_ARM_THM_MOVW_ABS_NC:
9843       if (should_apply_static_reloc(gsym, r_type, false, output_section))
9844         reloc_status = Arm_relocate_functions::thm_movw(view, object, psymval,
9845                                                         0, thumb_bit, false);
9846       break;
9847
9848     case elfcpp::R_ARM_THM_MOVT_ABS:
9849       if (should_apply_static_reloc(gsym, r_type, false, output_section))
9850         reloc_status = Arm_relocate_functions::thm_movt(view, object,
9851                                                         psymval, 0);
9852       break;
9853
9854     case elfcpp::R_ARM_MOVW_PREL_NC:
9855     case elfcpp::R_ARM_MOVW_BREL_NC:
9856     case elfcpp::R_ARM_MOVW_BREL:
9857       reloc_status =
9858         Arm_relocate_functions::movw(view, object, psymval,
9859                                      relative_address_base, thumb_bit,
9860                                      check_overflow);
9861       break;
9862
9863     case elfcpp::R_ARM_MOVT_PREL:
9864     case elfcpp::R_ARM_MOVT_BREL:
9865       reloc_status =
9866         Arm_relocate_functions::movt(view, object, psymval,
9867                                      relative_address_base);
9868       break;
9869
9870     case elfcpp::R_ARM_THM_MOVW_PREL_NC:
9871     case elfcpp::R_ARM_THM_MOVW_BREL_NC:
9872     case elfcpp::R_ARM_THM_MOVW_BREL:
9873       reloc_status =
9874         Arm_relocate_functions::thm_movw(view, object, psymval,
9875                                          relative_address_base,
9876                                          thumb_bit, check_overflow);
9877       break;
9878
9879     case elfcpp::R_ARM_THM_MOVT_PREL:
9880     case elfcpp::R_ARM_THM_MOVT_BREL:
9881       reloc_status =
9882         Arm_relocate_functions::thm_movt(view, object, psymval,
9883                                          relative_address_base);
9884       break;
9885
9886     case elfcpp::R_ARM_REL32:
9887       reloc_status = Arm_relocate_functions::rel32(view, object, psymval,
9888                                                    address, thumb_bit);
9889       break;
9890
9891     case elfcpp::R_ARM_THM_ABS5:
9892       if (should_apply_static_reloc(gsym, r_type, false, output_section))
9893         reloc_status = Arm_relocate_functions::thm_abs5(view, object, psymval);
9894       break;
9895
9896     // Thumb long branches.
9897     case elfcpp::R_ARM_THM_CALL:
9898     case elfcpp::R_ARM_THM_XPC22:
9899     case elfcpp::R_ARM_THM_JUMP24:
9900       reloc_status =
9901         Arm_relocate_functions::thumb_branch_common(
9902             r_type, relinfo, view, gsym, object, r_sym, psymval, address,
9903             thumb_bit, is_weakly_undefined_without_plt);
9904       break;
9905
9906     case elfcpp::R_ARM_GOTOFF32:
9907       {
9908         Arm_address got_origin;
9909         got_origin = target->got_plt_section()->address();
9910         reloc_status = Arm_relocate_functions::rel32(view, object, psymval,
9911                                                      got_origin, thumb_bit);
9912       }
9913       break;
9914
9915     case elfcpp::R_ARM_BASE_PREL:
9916       gold_assert(gsym != NULL);
9917       reloc_status =
9918           Arm_relocate_functions::base_prel(view, sym_origin, address);
9919       break;
9920
9921     case elfcpp::R_ARM_BASE_ABS:
9922       if (should_apply_static_reloc(gsym, r_type, false, output_section))
9923         reloc_status = Arm_relocate_functions::base_abs(view, sym_origin);
9924       break;
9925
9926     case elfcpp::R_ARM_GOT_BREL:
9927       gold_assert(have_got_offset);
9928       reloc_status = Arm_relocate_functions::got_brel(view, got_offset);
9929       break;
9930
9931     case elfcpp::R_ARM_GOT_PREL:
9932       gold_assert(have_got_offset);
9933       // Get the address origin for GOT PLT, which is allocated right
9934       // after the GOT section, to calculate an absolute address of
9935       // the symbol GOT entry (got_origin + got_offset).
9936       Arm_address got_origin;
9937       got_origin = target->got_plt_section()->address();
9938       reloc_status = Arm_relocate_functions::got_prel(view,
9939                                                       got_origin + got_offset,
9940                                                       address);
9941       break;
9942
9943     case elfcpp::R_ARM_PLT32:
9944     case elfcpp::R_ARM_CALL:
9945     case elfcpp::R_ARM_JUMP24:
9946     case elfcpp::R_ARM_XPC25:
9947       gold_assert(gsym == NULL
9948                   || gsym->has_plt_offset()
9949                   || gsym->final_value_is_known()
9950                   || (gsym->is_defined()
9951                       && !gsym->is_from_dynobj()
9952                       && !gsym->is_preemptible()));
9953       reloc_status =
9954         Arm_relocate_functions::arm_branch_common(
9955             r_type, relinfo, view, gsym, object, r_sym, psymval, address,
9956             thumb_bit, is_weakly_undefined_without_plt);
9957       break;
9958
9959     case elfcpp::R_ARM_THM_JUMP19:
9960       reloc_status =
9961         Arm_relocate_functions::thm_jump19(view, object, psymval, address,
9962                                            thumb_bit);
9963       break;
9964
9965     case elfcpp::R_ARM_THM_JUMP6:
9966       reloc_status =
9967         Arm_relocate_functions::thm_jump6(view, object, psymval, address);
9968       break;
9969
9970     case elfcpp::R_ARM_THM_JUMP8:
9971       reloc_status =
9972         Arm_relocate_functions::thm_jump8(view, object, psymval, address);
9973       break;
9974
9975     case elfcpp::R_ARM_THM_JUMP11:
9976       reloc_status =
9977         Arm_relocate_functions::thm_jump11(view, object, psymval, address);
9978       break;
9979
9980     case elfcpp::R_ARM_PREL31:
9981       reloc_status = Arm_relocate_functions::prel31(view, object, psymval,
9982                                                     address, thumb_bit);
9983       break;
9984
9985     case elfcpp::R_ARM_V4BX:
9986       if (target->fix_v4bx() > General_options::FIX_V4BX_NONE)
9987         {
9988           const bool is_v4bx_interworking =
9989               (target->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING);
9990           reloc_status =
9991             Arm_relocate_functions::v4bx(relinfo, view, object, address,
9992                                          is_v4bx_interworking);
9993         }
9994       break;
9995
9996     case elfcpp::R_ARM_THM_PC8:
9997       reloc_status =
9998         Arm_relocate_functions::thm_pc8(view, object, psymval, address);
9999       break;
10000
10001     case elfcpp::R_ARM_THM_PC12:
10002       reloc_status =
10003         Arm_relocate_functions::thm_pc12(view, object, psymval, address);
10004       break;
10005
10006     case elfcpp::R_ARM_THM_ALU_PREL_11_0:
10007       reloc_status =
10008         Arm_relocate_functions::thm_alu11(view, object, psymval, address,
10009                                           thumb_bit);
10010       break;
10011
10012     case elfcpp::R_ARM_ALU_PC_G0_NC:
10013     case elfcpp::R_ARM_ALU_PC_G0:
10014     case elfcpp::R_ARM_ALU_PC_G1_NC:
10015     case elfcpp::R_ARM_ALU_PC_G1:
10016     case elfcpp::R_ARM_ALU_PC_G2:
10017     case elfcpp::R_ARM_ALU_SB_G0_NC:
10018     case elfcpp::R_ARM_ALU_SB_G0:
10019     case elfcpp::R_ARM_ALU_SB_G1_NC:
10020     case elfcpp::R_ARM_ALU_SB_G1:
10021     case elfcpp::R_ARM_ALU_SB_G2:
10022       reloc_status =
10023         Arm_relocate_functions::arm_grp_alu(view, object, psymval,
10024                                             reloc_property->group_index(),
10025                                             relative_address_base,
10026                                             thumb_bit, check_overflow);
10027       break;
10028
10029     case elfcpp::R_ARM_LDR_PC_G0:
10030     case elfcpp::R_ARM_LDR_PC_G1:
10031     case elfcpp::R_ARM_LDR_PC_G2:
10032     case elfcpp::R_ARM_LDR_SB_G0:
10033     case elfcpp::R_ARM_LDR_SB_G1:
10034     case elfcpp::R_ARM_LDR_SB_G2:
10035       reloc_status =
10036           Arm_relocate_functions::arm_grp_ldr(view, object, psymval,
10037                                               reloc_property->group_index(),
10038                                               relative_address_base);
10039       break;
10040
10041     case elfcpp::R_ARM_LDRS_PC_G0:
10042     case elfcpp::R_ARM_LDRS_PC_G1:
10043     case elfcpp::R_ARM_LDRS_PC_G2:
10044     case elfcpp::R_ARM_LDRS_SB_G0:
10045     case elfcpp::R_ARM_LDRS_SB_G1:
10046     case elfcpp::R_ARM_LDRS_SB_G2:
10047       reloc_status =
10048           Arm_relocate_functions::arm_grp_ldrs(view, object, psymval,
10049                                                reloc_property->group_index(),
10050                                                relative_address_base);
10051       break;
10052
10053     case elfcpp::R_ARM_LDC_PC_G0:
10054     case elfcpp::R_ARM_LDC_PC_G1:
10055     case elfcpp::R_ARM_LDC_PC_G2:
10056     case elfcpp::R_ARM_LDC_SB_G0:
10057     case elfcpp::R_ARM_LDC_SB_G1:
10058     case elfcpp::R_ARM_LDC_SB_G2:
10059       reloc_status =
10060           Arm_relocate_functions::arm_grp_ldc(view, object, psymval,
10061                                               reloc_property->group_index(),
10062                                               relative_address_base);
10063       break;
10064
10065       // These are initial tls relocs, which are expected when
10066       // linking.
10067     case elfcpp::R_ARM_TLS_GD32:        // Global-dynamic
10068     case elfcpp::R_ARM_TLS_LDM32:       // Local-dynamic
10069     case elfcpp::R_ARM_TLS_LDO32:       // Alternate local-dynamic
10070     case elfcpp::R_ARM_TLS_IE32:        // Initial-exec
10071     case elfcpp::R_ARM_TLS_LE32:        // Local-exec
10072       reloc_status =
10073         this->relocate_tls(relinfo, target, relnum, rel, r_type, gsym, psymval,
10074                            view, address, view_size);
10075       break;
10076
10077     // The known and unknown unsupported and/or deprecated relocations.
10078     case elfcpp::R_ARM_PC24:
10079     case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
10080     case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
10081     case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
10082     default:
10083       // Just silently leave the method. We should get an appropriate error
10084       // message in the scan methods.
10085       break;
10086     }
10087
10088   // Report any errors.
10089   switch (reloc_status)
10090     {
10091     case Arm_relocate_functions::STATUS_OKAY:
10092       break;
10093     case Arm_relocate_functions::STATUS_OVERFLOW:
10094       gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
10095                              _("relocation overflow in %s"),
10096                              reloc_property->name().c_str());
10097       break;
10098     case Arm_relocate_functions::STATUS_BAD_RELOC:
10099       gold_error_at_location(
10100         relinfo,
10101         relnum,
10102         rel.get_r_offset(),
10103         _("unexpected opcode while processing relocation %s"),
10104         reloc_property->name().c_str());
10105       break;
10106     default:
10107       gold_unreachable();
10108     }
10109
10110   return true;
10111 }
10112
10113 // Perform a TLS relocation.
10114
10115 template<bool big_endian>
10116 inline typename Arm_relocate_functions<big_endian>::Status
10117 Target_arm<big_endian>::Relocate::relocate_tls(
10118     const Relocate_info<32, big_endian>* relinfo,
10119     Target_arm<big_endian>* target,
10120     size_t relnum,
10121     const elfcpp::Rel<32, big_endian>& rel,
10122     unsigned int r_type,
10123     const Sized_symbol<32>* gsym,
10124     const Symbol_value<32>* psymval,
10125     unsigned char* view,
10126     elfcpp::Elf_types<32>::Elf_Addr address,
10127     section_size_type /*view_size*/ )
10128 {
10129   typedef Arm_relocate_functions<big_endian> ArmRelocFuncs;
10130   typedef Relocate_functions<32, big_endian> RelocFuncs;
10131   Output_segment* tls_segment = relinfo->layout->tls_segment();
10132
10133   const Sized_relobj_file<32, big_endian>* object = relinfo->object;
10134
10135   elfcpp::Elf_types<32>::Elf_Addr value = psymval->value(object, 0);
10136
10137   const bool is_final = (gsym == NULL
10138                          ? !parameters->options().shared()
10139                          : gsym->final_value_is_known());
10140   const tls::Tls_optimization optimized_type
10141       = Target_arm<big_endian>::optimize_tls_reloc(is_final, r_type);
10142   switch (r_type)
10143     {
10144     case elfcpp::R_ARM_TLS_GD32:        // Global-dynamic
10145         {
10146           unsigned int got_type = GOT_TYPE_TLS_PAIR;
10147           unsigned int got_offset;
10148           if (gsym != NULL)
10149             {
10150               gold_assert(gsym->has_got_offset(got_type));
10151               got_offset = gsym->got_offset(got_type) - target->got_size();
10152             }
10153           else
10154             {
10155               unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
10156               gold_assert(object->local_has_got_offset(r_sym, got_type));
10157               got_offset = (object->local_got_offset(r_sym, got_type)
10158                             - target->got_size());
10159             }
10160           if (optimized_type == tls::TLSOPT_NONE)
10161             {
10162               Arm_address got_entry =
10163                 target->got_plt_section()->address() + got_offset;
10164
10165               // Relocate the field with the PC relative offset of the pair of
10166               // GOT entries.
10167               RelocFuncs::pcrel32_unaligned(view, got_entry, address);
10168               return ArmRelocFuncs::STATUS_OKAY;
10169             }
10170         }
10171       break;
10172
10173     case elfcpp::R_ARM_TLS_LDM32:       // Local-dynamic
10174       if (optimized_type == tls::TLSOPT_NONE)
10175         {
10176           // Relocate the field with the offset of the GOT entry for
10177           // the module index.
10178           unsigned int got_offset;
10179           got_offset = (target->got_mod_index_entry(NULL, NULL, NULL)
10180                         - target->got_size());
10181           Arm_address got_entry =
10182             target->got_plt_section()->address() + got_offset;
10183
10184           // Relocate the field with the PC relative offset of the pair of
10185           // GOT entries.
10186           RelocFuncs::pcrel32_unaligned(view, got_entry, address);
10187           return ArmRelocFuncs::STATUS_OKAY;
10188         }
10189       break;
10190
10191     case elfcpp::R_ARM_TLS_LDO32:       // Alternate local-dynamic
10192       RelocFuncs::rel32_unaligned(view, value);
10193       return ArmRelocFuncs::STATUS_OKAY;
10194
10195     case elfcpp::R_ARM_TLS_IE32:        // Initial-exec
10196       if (optimized_type == tls::TLSOPT_NONE)
10197         {
10198           // Relocate the field with the offset of the GOT entry for
10199           // the tp-relative offset of the symbol.
10200           unsigned int got_type = GOT_TYPE_TLS_OFFSET;
10201           unsigned int got_offset;
10202           if (gsym != NULL)
10203             {
10204               gold_assert(gsym->has_got_offset(got_type));
10205               got_offset = gsym->got_offset(got_type);
10206             }
10207           else
10208             {
10209               unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
10210               gold_assert(object->local_has_got_offset(r_sym, got_type));
10211               got_offset = object->local_got_offset(r_sym, got_type);
10212             }
10213
10214           // All GOT offsets are relative to the end of the GOT.
10215           got_offset -= target->got_size();
10216
10217           Arm_address got_entry =
10218             target->got_plt_section()->address() + got_offset;
10219
10220           // Relocate the field with the PC relative offset of the GOT entry.
10221           RelocFuncs::pcrel32_unaligned(view, got_entry, address);
10222           return ArmRelocFuncs::STATUS_OKAY;
10223         }
10224       break;
10225
10226     case elfcpp::R_ARM_TLS_LE32:        // Local-exec
10227       // If we're creating a shared library, a dynamic relocation will
10228       // have been created for this location, so do not apply it now.
10229       if (!parameters->options().shared())
10230         {
10231           gold_assert(tls_segment != NULL);
10232
10233           // $tp points to the TCB, which is followed by the TLS, so we
10234           // need to add TCB size to the offset.
10235           Arm_address aligned_tcb_size =
10236             align_address(ARM_TCB_SIZE, tls_segment->maximum_alignment());
10237           RelocFuncs::rel32_unaligned(view, value + aligned_tcb_size);
10238
10239         }
10240       return ArmRelocFuncs::STATUS_OKAY;
10241
10242     default:
10243       gold_unreachable();
10244     }
10245
10246   gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
10247                          _("unsupported reloc %u"),
10248                          r_type);
10249   return ArmRelocFuncs::STATUS_BAD_RELOC;
10250 }
10251
10252 // Relocate section data.
10253
10254 template<bool big_endian>
10255 void
10256 Target_arm<big_endian>::relocate_section(
10257     const Relocate_info<32, big_endian>* relinfo,
10258     unsigned int sh_type,
10259     const unsigned char* prelocs,
10260     size_t reloc_count,
10261     Output_section* output_section,
10262     bool needs_special_offset_handling,
10263     unsigned char* view,
10264     Arm_address address,
10265     section_size_type view_size,
10266     const Reloc_symbol_changes* reloc_symbol_changes)
10267 {
10268   typedef typename Target_arm<big_endian>::Relocate Arm_relocate;
10269   gold_assert(sh_type == elfcpp::SHT_REL);
10270
10271   // See if we are relocating a relaxed input section.  If so, the view
10272   // covers the whole output section and we need to adjust accordingly.
10273   if (needs_special_offset_handling)
10274     {
10275       const Output_relaxed_input_section* poris =
10276         output_section->find_relaxed_input_section(relinfo->object,
10277                                                    relinfo->data_shndx);
10278       if (poris != NULL)
10279         {
10280           Arm_address section_address = poris->address();
10281           section_size_type section_size = poris->data_size();
10282
10283           gold_assert((section_address >= address)
10284                       && ((section_address + section_size)
10285                           <= (address + view_size)));
10286
10287           off_t offset = section_address - address;
10288           view += offset;
10289           address += offset;
10290           view_size = section_size;
10291         }
10292     }
10293
10294   gold::relocate_section<32, big_endian, Target_arm, Arm_relocate,
10295                          gold::Default_comdat_behavior, Classify_reloc>(
10296     relinfo,
10297     this,
10298     prelocs,
10299     reloc_count,
10300     output_section,
10301     needs_special_offset_handling,
10302     view,
10303     address,
10304     view_size,
10305     reloc_symbol_changes);
10306 }
10307
10308 // Return the size of a relocation while scanning during a relocatable
10309 // link.
10310
10311 template<bool big_endian>
10312 unsigned int
10313 Target_arm<big_endian>::Classify_reloc::get_size_for_reloc(
10314     unsigned int r_type,
10315     Relobj* object)
10316 {
10317   Target_arm<big_endian>* arm_target =
10318       Target_arm<big_endian>::default_target();
10319   r_type = arm_target->get_real_reloc_type(r_type);
10320   const Arm_reloc_property* arp =
10321       arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
10322   if (arp != NULL)
10323     return arp->size();
10324   else
10325     {
10326       std::string reloc_name =
10327         arm_reloc_property_table->reloc_name_in_error_message(r_type);
10328       gold_error(_("%s: unexpected %s in object file"),
10329                  object->name().c_str(), reloc_name.c_str());
10330       return 0;
10331     }
10332 }
10333
10334 // Scan the relocs during a relocatable link.
10335
10336 template<bool big_endian>
10337 void
10338 Target_arm<big_endian>::scan_relocatable_relocs(
10339     Symbol_table* symtab,
10340     Layout* layout,
10341     Sized_relobj_file<32, big_endian>* object,
10342     unsigned int data_shndx,
10343     unsigned int sh_type,
10344     const unsigned char* prelocs,
10345     size_t reloc_count,
10346     Output_section* output_section,
10347     bool needs_special_offset_handling,
10348     size_t local_symbol_count,
10349     const unsigned char* plocal_symbols,
10350     Relocatable_relocs* rr)
10351 {
10352   typedef Arm_scan_relocatable_relocs<big_endian, Classify_reloc>
10353       Scan_relocatable_relocs;
10354
10355   gold_assert(sh_type == elfcpp::SHT_REL);
10356
10357   gold::scan_relocatable_relocs<32, big_endian, Scan_relocatable_relocs>(
10358     symtab,
10359     layout,
10360     object,
10361     data_shndx,
10362     prelocs,
10363     reloc_count,
10364     output_section,
10365     needs_special_offset_handling,
10366     local_symbol_count,
10367     plocal_symbols,
10368     rr);
10369 }
10370
10371 // Scan the relocs for --emit-relocs.
10372
10373 template<bool big_endian>
10374 void
10375 Target_arm<big_endian>::emit_relocs_scan(Symbol_table* symtab,
10376     Layout* layout,
10377     Sized_relobj_file<32, big_endian>* object,
10378     unsigned int data_shndx,
10379     unsigned int sh_type,
10380     const unsigned char* prelocs,
10381     size_t reloc_count,
10382     Output_section* output_section,
10383     bool needs_special_offset_handling,
10384     size_t local_symbol_count,
10385     const unsigned char* plocal_syms,
10386     Relocatable_relocs* rr)
10387 {
10388   typedef gold::Default_classify_reloc<elfcpp::SHT_REL, 32, big_endian>
10389       Classify_reloc;
10390   typedef gold::Default_emit_relocs_strategy<Classify_reloc>
10391       Emit_relocs_strategy;
10392
10393   gold_assert(sh_type == elfcpp::SHT_REL);
10394
10395   gold::scan_relocatable_relocs<32, big_endian, Emit_relocs_strategy>(
10396     symtab,
10397     layout,
10398     object,
10399     data_shndx,
10400     prelocs,
10401     reloc_count,
10402     output_section,
10403     needs_special_offset_handling,
10404     local_symbol_count,
10405     plocal_syms,
10406     rr);
10407 }
10408
10409 // Emit relocations for a section.
10410
10411 template<bool big_endian>
10412 void
10413 Target_arm<big_endian>::relocate_relocs(
10414     const Relocate_info<32, big_endian>* relinfo,
10415     unsigned int sh_type,
10416     const unsigned char* prelocs,
10417     size_t reloc_count,
10418     Output_section* output_section,
10419     typename elfcpp::Elf_types<32>::Elf_Off offset_in_output_section,
10420     unsigned char* view,
10421     Arm_address view_address,
10422     section_size_type view_size,
10423     unsigned char* reloc_view,
10424     section_size_type reloc_view_size)
10425 {
10426   gold_assert(sh_type == elfcpp::SHT_REL);
10427
10428   gold::relocate_relocs<32, big_endian, Classify_reloc>(
10429     relinfo,
10430     prelocs,
10431     reloc_count,
10432     output_section,
10433     offset_in_output_section,
10434     view,
10435     view_address,
10436     view_size,
10437     reloc_view,
10438     reloc_view_size);
10439 }
10440
10441 // Perform target-specific processing in a relocatable link.  This is
10442 // only used if we use the relocation strategy RELOC_SPECIAL.
10443
10444 template<bool big_endian>
10445 void
10446 Target_arm<big_endian>::relocate_special_relocatable(
10447     const Relocate_info<32, big_endian>* relinfo,
10448     unsigned int sh_type,
10449     const unsigned char* preloc_in,
10450     size_t relnum,
10451     Output_section* output_section,
10452     typename elfcpp::Elf_types<32>::Elf_Off offset_in_output_section,
10453     unsigned char* view,
10454     elfcpp::Elf_types<32>::Elf_Addr view_address,
10455     section_size_type,
10456     unsigned char* preloc_out)
10457 {
10458   // We can only handle REL type relocation sections.
10459   gold_assert(sh_type == elfcpp::SHT_REL);
10460
10461   typedef typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc Reltype;
10462   typedef typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc_write
10463     Reltype_write;
10464   const Arm_address invalid_address = static_cast<Arm_address>(0) - 1;
10465
10466   const Arm_relobj<big_endian>* object =
10467     Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
10468   const unsigned int local_count = object->local_symbol_count();
10469
10470   Reltype reloc(preloc_in);
10471   Reltype_write reloc_write(preloc_out);
10472
10473   elfcpp::Elf_types<32>::Elf_WXword r_info = reloc.get_r_info();
10474   const unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
10475   const unsigned int r_type = elfcpp::elf_r_type<32>(r_info);
10476
10477   const Arm_reloc_property* arp =
10478     arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
10479   gold_assert(arp != NULL);
10480
10481   // Get the new symbol index.
10482   // We only use RELOC_SPECIAL strategy in local relocations.
10483   gold_assert(r_sym < local_count);
10484
10485   // We are adjusting a section symbol.  We need to find
10486   // the symbol table index of the section symbol for
10487   // the output section corresponding to input section
10488   // in which this symbol is defined.
10489   bool is_ordinary;
10490   unsigned int shndx = object->local_symbol_input_shndx(r_sym, &is_ordinary);
10491   gold_assert(is_ordinary);
10492   Output_section* os = object->output_section(shndx);
10493   gold_assert(os != NULL);
10494   gold_assert(os->needs_symtab_index());
10495   unsigned int new_symndx = os->symtab_index();
10496
10497   // Get the new offset--the location in the output section where
10498   // this relocation should be applied.
10499
10500   Arm_address offset = reloc.get_r_offset();
10501   Arm_address new_offset;
10502   if (offset_in_output_section != invalid_address)
10503     new_offset = offset + offset_in_output_section;
10504   else
10505     {
10506       section_offset_type sot_offset =
10507           convert_types<section_offset_type, Arm_address>(offset);
10508       section_offset_type new_sot_offset =
10509           output_section->output_offset(object, relinfo->data_shndx,
10510                                         sot_offset);
10511       gold_assert(new_sot_offset != -1);
10512       new_offset = new_sot_offset;
10513     }
10514
10515   // In an object file, r_offset is an offset within the section.
10516   // In an executable or dynamic object, generated by
10517   // --emit-relocs, r_offset is an absolute address.
10518   if (!parameters->options().relocatable())
10519     {
10520       new_offset += view_address;
10521       if (offset_in_output_section != invalid_address)
10522         new_offset -= offset_in_output_section;
10523     }
10524
10525   reloc_write.put_r_offset(new_offset);
10526   reloc_write.put_r_info(elfcpp::elf_r_info<32>(new_symndx, r_type));
10527
10528   // Handle the reloc addend.
10529   // The relocation uses a section symbol in the input file.
10530   // We are adjusting it to use a section symbol in the output
10531   // file.  The input section symbol refers to some address in
10532   // the input section.  We need the relocation in the output
10533   // file to refer to that same address.  This adjustment to
10534   // the addend is the same calculation we use for a simple
10535   // absolute relocation for the input section symbol.
10536
10537   const Symbol_value<32>* psymval = object->local_symbol(r_sym);
10538
10539   // Handle THUMB bit.
10540   Symbol_value<32> symval;
10541   Arm_address thumb_bit =
10542      object->local_symbol_is_thumb_function(r_sym) ? 1 : 0;
10543   if (thumb_bit != 0
10544       && arp->uses_thumb_bit()
10545       && ((psymval->value(object, 0) & 1) != 0))
10546     {
10547       Arm_address stripped_value =
10548         psymval->value(object, 0) & ~static_cast<Arm_address>(1);
10549       symval.set_output_value(stripped_value);
10550       psymval = &symval;
10551     }
10552
10553   unsigned char* paddend = view + offset;
10554   typename Arm_relocate_functions<big_endian>::Status reloc_status =
10555         Arm_relocate_functions<big_endian>::STATUS_OKAY;
10556   switch (r_type)
10557     {
10558     case elfcpp::R_ARM_ABS8:
10559       reloc_status = Arm_relocate_functions<big_endian>::abs8(paddend, object,
10560                                                               psymval);
10561       break;
10562
10563     case elfcpp::R_ARM_ABS12:
10564       reloc_status = Arm_relocate_functions<big_endian>::abs12(paddend, object,
10565                                                                psymval);
10566       break;
10567
10568     case elfcpp::R_ARM_ABS16:
10569       reloc_status = Arm_relocate_functions<big_endian>::abs16(paddend, object,
10570                                                                psymval);
10571       break;
10572
10573     case elfcpp::R_ARM_THM_ABS5:
10574       reloc_status = Arm_relocate_functions<big_endian>::thm_abs5(paddend,
10575                                                                   object,
10576                                                                   psymval);
10577       break;
10578
10579     case elfcpp::R_ARM_MOVW_ABS_NC:
10580     case elfcpp::R_ARM_MOVW_PREL_NC:
10581     case elfcpp::R_ARM_MOVW_BREL_NC:
10582     case elfcpp::R_ARM_MOVW_BREL:
10583       reloc_status = Arm_relocate_functions<big_endian>::movw(
10584           paddend, object, psymval, 0, thumb_bit, arp->checks_overflow());
10585       break;
10586
10587     case elfcpp::R_ARM_THM_MOVW_ABS_NC:
10588     case elfcpp::R_ARM_THM_MOVW_PREL_NC:
10589     case elfcpp::R_ARM_THM_MOVW_BREL_NC:
10590     case elfcpp::R_ARM_THM_MOVW_BREL:
10591       reloc_status = Arm_relocate_functions<big_endian>::thm_movw(
10592           paddend, object, psymval, 0, thumb_bit, arp->checks_overflow());
10593       break;
10594
10595     case elfcpp::R_ARM_THM_CALL:
10596     case elfcpp::R_ARM_THM_XPC22:
10597     case elfcpp::R_ARM_THM_JUMP24:
10598       reloc_status =
10599         Arm_relocate_functions<big_endian>::thumb_branch_common(
10600             r_type, relinfo, paddend, NULL, object, 0, psymval, 0, thumb_bit,
10601             false);
10602       break;
10603
10604     case elfcpp::R_ARM_PLT32:
10605     case elfcpp::R_ARM_CALL:
10606     case elfcpp::R_ARM_JUMP24:
10607     case elfcpp::R_ARM_XPC25:
10608       reloc_status =
10609         Arm_relocate_functions<big_endian>::arm_branch_common(
10610             r_type, relinfo, paddend, NULL, object, 0, psymval, 0, thumb_bit,
10611             false);
10612       break;
10613
10614     case elfcpp::R_ARM_THM_JUMP19:
10615       reloc_status =
10616         Arm_relocate_functions<big_endian>::thm_jump19(paddend, object,
10617                                                        psymval, 0, thumb_bit);
10618       break;
10619
10620     case elfcpp::R_ARM_THM_JUMP6:
10621       reloc_status =
10622         Arm_relocate_functions<big_endian>::thm_jump6(paddend, object, psymval,
10623                                                       0);
10624       break;
10625
10626     case elfcpp::R_ARM_THM_JUMP8:
10627       reloc_status =
10628         Arm_relocate_functions<big_endian>::thm_jump8(paddend, object, psymval,
10629                                                       0);
10630       break;
10631
10632     case elfcpp::R_ARM_THM_JUMP11:
10633       reloc_status =
10634         Arm_relocate_functions<big_endian>::thm_jump11(paddend, object, psymval,
10635                                                        0);
10636       break;
10637
10638     case elfcpp::R_ARM_PREL31:
10639       reloc_status =
10640         Arm_relocate_functions<big_endian>::prel31(paddend, object, psymval, 0,
10641                                                    thumb_bit);
10642       break;
10643
10644     case elfcpp::R_ARM_THM_PC8:
10645       reloc_status =
10646         Arm_relocate_functions<big_endian>::thm_pc8(paddend, object, psymval,
10647                                                     0);
10648       break;
10649
10650     case elfcpp::R_ARM_THM_PC12:
10651       reloc_status =
10652         Arm_relocate_functions<big_endian>::thm_pc12(paddend, object, psymval,
10653                                                      0);
10654       break;
10655
10656     case elfcpp::R_ARM_THM_ALU_PREL_11_0:
10657       reloc_status =
10658         Arm_relocate_functions<big_endian>::thm_alu11(paddend, object, psymval,
10659                                                       0, thumb_bit);
10660       break;
10661
10662     // These relocation truncate relocation results so we cannot handle them
10663     // in a relocatable link.
10664     case elfcpp::R_ARM_MOVT_ABS:
10665     case elfcpp::R_ARM_THM_MOVT_ABS:
10666     case elfcpp::R_ARM_MOVT_PREL:
10667     case elfcpp::R_ARM_MOVT_BREL:
10668     case elfcpp::R_ARM_THM_MOVT_PREL:
10669     case elfcpp::R_ARM_THM_MOVT_BREL:
10670     case elfcpp::R_ARM_ALU_PC_G0_NC:
10671     case elfcpp::R_ARM_ALU_PC_G0:
10672     case elfcpp::R_ARM_ALU_PC_G1_NC:
10673     case elfcpp::R_ARM_ALU_PC_G1:
10674     case elfcpp::R_ARM_ALU_PC_G2:
10675     case elfcpp::R_ARM_ALU_SB_G0_NC:
10676     case elfcpp::R_ARM_ALU_SB_G0:
10677     case elfcpp::R_ARM_ALU_SB_G1_NC:
10678     case elfcpp::R_ARM_ALU_SB_G1:
10679     case elfcpp::R_ARM_ALU_SB_G2:
10680     case elfcpp::R_ARM_LDR_PC_G0:
10681     case elfcpp::R_ARM_LDR_PC_G1:
10682     case elfcpp::R_ARM_LDR_PC_G2:
10683     case elfcpp::R_ARM_LDR_SB_G0:
10684     case elfcpp::R_ARM_LDR_SB_G1:
10685     case elfcpp::R_ARM_LDR_SB_G2:
10686     case elfcpp::R_ARM_LDRS_PC_G0:
10687     case elfcpp::R_ARM_LDRS_PC_G1:
10688     case elfcpp::R_ARM_LDRS_PC_G2:
10689     case elfcpp::R_ARM_LDRS_SB_G0:
10690     case elfcpp::R_ARM_LDRS_SB_G1:
10691     case elfcpp::R_ARM_LDRS_SB_G2:
10692     case elfcpp::R_ARM_LDC_PC_G0:
10693     case elfcpp::R_ARM_LDC_PC_G1:
10694     case elfcpp::R_ARM_LDC_PC_G2:
10695     case elfcpp::R_ARM_LDC_SB_G0:
10696     case elfcpp::R_ARM_LDC_SB_G1:
10697     case elfcpp::R_ARM_LDC_SB_G2:
10698       gold_error(_("cannot handle %s in a relocatable link"),
10699                  arp->name().c_str());
10700       break;
10701
10702     default:
10703       gold_unreachable();
10704     }
10705
10706   // Report any errors.
10707   switch (reloc_status)
10708     {
10709     case Arm_relocate_functions<big_endian>::STATUS_OKAY:
10710       break;
10711     case Arm_relocate_functions<big_endian>::STATUS_OVERFLOW:
10712       gold_error_at_location(relinfo, relnum, reloc.get_r_offset(),
10713                              _("relocation overflow in %s"),
10714                              arp->name().c_str());
10715       break;
10716     case Arm_relocate_functions<big_endian>::STATUS_BAD_RELOC:
10717       gold_error_at_location(relinfo, relnum, reloc.get_r_offset(),
10718         _("unexpected opcode while processing relocation %s"),
10719         arp->name().c_str());
10720       break;
10721     default:
10722       gold_unreachable();
10723     }
10724 }
10725
10726 // Return the value to use for a dynamic symbol which requires special
10727 // treatment.  This is how we support equality comparisons of function
10728 // pointers across shared library boundaries, as described in the
10729 // processor specific ABI supplement.
10730
10731 template<bool big_endian>
10732 uint64_t
10733 Target_arm<big_endian>::do_dynsym_value(const Symbol* gsym) const
10734 {
10735   gold_assert(gsym->is_from_dynobj() && gsym->has_plt_offset());
10736   return this->plt_address_for_global(gsym);
10737 }
10738
10739 // Map platform-specific relocs to real relocs
10740 //
10741 template<bool big_endian>
10742 unsigned int
10743 Target_arm<big_endian>::get_real_reloc_type(unsigned int r_type) const
10744 {
10745   switch (r_type)
10746     {
10747     case elfcpp::R_ARM_TARGET1:
10748       return this->target1_reloc_;
10749
10750     case elfcpp::R_ARM_TARGET2:
10751       return this->target2_reloc_;
10752
10753     default:
10754       return r_type;
10755     }
10756 }
10757
10758 // Whether if two EABI versions V1 and V2 are compatible.
10759
10760 template<bool big_endian>
10761 bool
10762 Target_arm<big_endian>::are_eabi_versions_compatible(
10763     elfcpp::Elf_Word v1,
10764     elfcpp::Elf_Word v2)
10765 {
10766   // v4 and v5 are the same spec before and after it was released,
10767   // so allow mixing them.
10768   if ((v1 == elfcpp::EF_ARM_EABI_UNKNOWN || v2 == elfcpp::EF_ARM_EABI_UNKNOWN)
10769       || (v1 == elfcpp::EF_ARM_EABI_VER4 && v2 == elfcpp::EF_ARM_EABI_VER5)
10770       || (v1 == elfcpp::EF_ARM_EABI_VER5 && v2 == elfcpp::EF_ARM_EABI_VER4))
10771     return true;
10772
10773   return v1 == v2;
10774 }
10775
10776 // Combine FLAGS from an input object called NAME and the processor-specific
10777 // flags in the ELF header of the output.  Much of this is adapted from the
10778 // processor-specific flags merging code in elf32_arm_merge_private_bfd_data
10779 // in bfd/elf32-arm.c.
10780
10781 template<bool big_endian>
10782 void
10783 Target_arm<big_endian>::merge_processor_specific_flags(
10784     const std::string& name,
10785     elfcpp::Elf_Word flags)
10786 {
10787   if (this->are_processor_specific_flags_set())
10788     {
10789       elfcpp::Elf_Word out_flags = this->processor_specific_flags();
10790
10791       // Nothing to merge if flags equal to those in output.
10792       if (flags == out_flags)
10793         return;
10794
10795       // Complain about various flag mismatches.
10796       elfcpp::Elf_Word version1 = elfcpp::arm_eabi_version(flags);
10797       elfcpp::Elf_Word version2 = elfcpp::arm_eabi_version(out_flags);
10798       if (!this->are_eabi_versions_compatible(version1, version2)
10799           && parameters->options().warn_mismatch())
10800         gold_error(_("Source object %s has EABI version %d but output has "
10801                      "EABI version %d."),
10802                    name.c_str(),
10803                    (flags & elfcpp::EF_ARM_EABIMASK) >> 24,
10804                    (out_flags & elfcpp::EF_ARM_EABIMASK) >> 24);
10805     }
10806   else
10807     {
10808       // If the input is the default architecture and had the default
10809       // flags then do not bother setting the flags for the output
10810       // architecture, instead allow future merges to do this.  If no
10811       // future merges ever set these flags then they will retain their
10812       // uninitialised values, which surprise surprise, correspond
10813       // to the default values.
10814       if (flags == 0)
10815         return;
10816
10817       // This is the first time, just copy the flags.
10818       // We only copy the EABI version for now.
10819       this->set_processor_specific_flags(flags & elfcpp::EF_ARM_EABIMASK);
10820     }
10821 }
10822
10823 // Adjust ELF file header.
10824 template<bool big_endian>
10825 void
10826 Target_arm<big_endian>::do_adjust_elf_header(
10827     unsigned char* view,
10828     int len)
10829 {
10830   gold_assert(len == elfcpp::Elf_sizes<32>::ehdr_size);
10831
10832   elfcpp::Ehdr<32, big_endian> ehdr(view);
10833   elfcpp::Elf_Word flags = this->processor_specific_flags();
10834   unsigned char e_ident[elfcpp::EI_NIDENT];
10835   memcpy(e_ident, ehdr.get_e_ident(), elfcpp::EI_NIDENT);
10836
10837   if (elfcpp::arm_eabi_version(flags)
10838       == elfcpp::EF_ARM_EABI_UNKNOWN)
10839     e_ident[elfcpp::EI_OSABI] = elfcpp::ELFOSABI_ARM;
10840   else
10841     e_ident[elfcpp::EI_OSABI] = 0;
10842   e_ident[elfcpp::EI_ABIVERSION] = 0;
10843
10844   // Do EF_ARM_BE8 adjustment.
10845   if (parameters->options().be8() && !big_endian)
10846     gold_error("BE8 images only valid in big-endian mode.");
10847   if (parameters->options().be8())
10848     {
10849       flags |= elfcpp::EF_ARM_BE8;
10850       this->set_processor_specific_flags(flags);
10851     }
10852
10853   // If we're working in EABI_VER5, set the hard/soft float ABI flags
10854   // as appropriate.
10855   if (elfcpp::arm_eabi_version(flags) == elfcpp::EF_ARM_EABI_VER5)
10856   {
10857     elfcpp::Elf_Half type = ehdr.get_e_type();
10858     if (type == elfcpp::ET_EXEC || type == elfcpp::ET_DYN)
10859       {
10860         Object_attribute* attr = this->get_aeabi_object_attribute(elfcpp::Tag_ABI_VFP_args);
10861         if (attr->int_value() == elfcpp::AEABI_VFP_args_vfp)
10862           flags |= elfcpp::EF_ARM_ABI_FLOAT_HARD;
10863         else
10864           flags |= elfcpp::EF_ARM_ABI_FLOAT_SOFT;
10865         this->set_processor_specific_flags(flags);
10866       }
10867   }
10868   elfcpp::Ehdr_write<32, big_endian> oehdr(view);
10869   oehdr.put_e_ident(e_ident);
10870   oehdr.put_e_flags(this->processor_specific_flags());
10871 }
10872
10873 // do_make_elf_object to override the same function in the base class.
10874 // We need to use a target-specific sub-class of
10875 // Sized_relobj_file<32, big_endian> to store ARM specific information.
10876 // Hence we need to have our own ELF object creation.
10877
10878 template<bool big_endian>
10879 Object*
10880 Target_arm<big_endian>::do_make_elf_object(
10881     const std::string& name,
10882     Input_file* input_file,
10883     off_t offset, const elfcpp::Ehdr<32, big_endian>& ehdr)
10884 {
10885   int et = ehdr.get_e_type();
10886   // ET_EXEC files are valid input for --just-symbols/-R,
10887   // and we treat them as relocatable objects.
10888   if (et == elfcpp::ET_REL
10889       || (et == elfcpp::ET_EXEC && input_file->just_symbols()))
10890     {
10891       Arm_relobj<big_endian>* obj =
10892         new Arm_relobj<big_endian>(name, input_file, offset, ehdr);
10893       obj->setup();
10894       return obj;
10895     }
10896   else if (et == elfcpp::ET_DYN)
10897     {
10898       Sized_dynobj<32, big_endian>* obj =
10899         new Arm_dynobj<big_endian>(name, input_file, offset, ehdr);
10900       obj->setup();
10901       return obj;
10902     }
10903   else
10904     {
10905       gold_error(_("%s: unsupported ELF file type %d"),
10906                  name.c_str(), et);
10907       return NULL;
10908     }
10909 }
10910
10911 // Read the architecture from the Tag_also_compatible_with attribute, if any.
10912 // Returns -1 if no architecture could be read.
10913 // This is adapted from get_secondary_compatible_arch() in bfd/elf32-arm.c.
10914
10915 template<bool big_endian>
10916 int
10917 Target_arm<big_endian>::get_secondary_compatible_arch(
10918     const Attributes_section_data* pasd)
10919 {
10920   const Object_attribute* known_attributes =
10921     pasd->known_attributes(Object_attribute::OBJ_ATTR_PROC);
10922
10923   // Note: the tag and its argument below are uleb128 values, though
10924   // currently-defined values fit in one byte for each.
10925   const std::string& sv =
10926     known_attributes[elfcpp::Tag_also_compatible_with].string_value();
10927   if (sv.size() == 2
10928       && sv.data()[0] == elfcpp::Tag_CPU_arch
10929       && (sv.data()[1] & 128) != 128)
10930    return sv.data()[1];
10931
10932   // This tag is "safely ignorable", so don't complain if it looks funny.
10933   return -1;
10934 }
10935
10936 // Set, or unset, the architecture of the Tag_also_compatible_with attribute.
10937 // The tag is removed if ARCH is -1.
10938 // This is adapted from set_secondary_compatible_arch() in bfd/elf32-arm.c.
10939
10940 template<bool big_endian>
10941 void
10942 Target_arm<big_endian>::set_secondary_compatible_arch(
10943     Attributes_section_data* pasd,
10944     int arch)
10945 {
10946   Object_attribute* known_attributes =
10947     pasd->known_attributes(Object_attribute::OBJ_ATTR_PROC);
10948
10949   if (arch == -1)
10950     {
10951       known_attributes[elfcpp::Tag_also_compatible_with].set_string_value("");
10952       return;
10953     }
10954
10955   // Note: the tag and its argument below are uleb128 values, though
10956   // currently-defined values fit in one byte for each.
10957   char sv[3];
10958   sv[0] = elfcpp::Tag_CPU_arch;
10959   gold_assert(arch != 0);
10960   sv[1] = arch;
10961   sv[2] = '\0';
10962
10963   known_attributes[elfcpp::Tag_also_compatible_with].set_string_value(sv);
10964 }
10965
10966 // Combine two values for Tag_CPU_arch, taking secondary compatibility tags
10967 // into account.
10968 // This is adapted from tag_cpu_arch_combine() in bfd/elf32-arm.c.
10969
10970 template<bool big_endian>
10971 int
10972 Target_arm<big_endian>::tag_cpu_arch_combine(
10973     const char* name,
10974     int oldtag,
10975     int* secondary_compat_out,
10976     int newtag,
10977     int secondary_compat)
10978 {
10979 #define T(X) elfcpp::TAG_CPU_ARCH_##X
10980   static const int v6t2[] =
10981     {
10982       T(V6T2),   // PRE_V4.
10983       T(V6T2),   // V4.
10984       T(V6T2),   // V4T.
10985       T(V6T2),   // V5T.
10986       T(V6T2),   // V5TE.
10987       T(V6T2),   // V5TEJ.
10988       T(V6T2),   // V6.
10989       T(V7),     // V6KZ.
10990       T(V6T2)    // V6T2.
10991     };
10992   static const int v6k[] =
10993     {
10994       T(V6K),    // PRE_V4.
10995       T(V6K),    // V4.
10996       T(V6K),    // V4T.
10997       T(V6K),    // V5T.
10998       T(V6K),    // V5TE.
10999       T(V6K),    // V5TEJ.
11000       T(V6K),    // V6.
11001       T(V6KZ),   // V6KZ.
11002       T(V7),     // V6T2.
11003       T(V6K)     // V6K.
11004     };
11005   static const int v7[] =
11006     {
11007       T(V7),     // PRE_V4.
11008       T(V7),     // V4.
11009       T(V7),     // V4T.
11010       T(V7),     // V5T.
11011       T(V7),     // V5TE.
11012       T(V7),     // V5TEJ.
11013       T(V7),     // V6.
11014       T(V7),     // V6KZ.
11015       T(V7),     // V6T2.
11016       T(V7),     // V6K.
11017       T(V7)      // V7.
11018     };
11019   static const int v6_m[] =
11020     {
11021       -1,        // PRE_V4.
11022       -1,        // V4.
11023       T(V6K),    // V4T.
11024       T(V6K),    // V5T.
11025       T(V6K),    // V5TE.
11026       T(V6K),    // V5TEJ.
11027       T(V6K),    // V6.
11028       T(V6KZ),   // V6KZ.
11029       T(V7),     // V6T2.
11030       T(V6K),    // V6K.
11031       T(V7),     // V7.
11032       T(V6_M)    // V6_M.
11033     };
11034   static const int v6s_m[] =
11035     {
11036       -1,        // PRE_V4.
11037       -1,        // V4.
11038       T(V6K),    // V4T.
11039       T(V6K),    // V5T.
11040       T(V6K),    // V5TE.
11041       T(V6K),    // V5TEJ.
11042       T(V6K),    // V6.
11043       T(V6KZ),   // V6KZ.
11044       T(V7),     // V6T2.
11045       T(V6K),    // V6K.
11046       T(V7),     // V7.
11047       T(V6S_M),  // V6_M.
11048       T(V6S_M)   // V6S_M.
11049     };
11050   static const int v7e_m[] =
11051     {
11052       -1,       // PRE_V4.
11053       -1,       // V4.
11054       T(V7E_M), // V4T.
11055       T(V7E_M), // V5T.
11056       T(V7E_M), // V5TE.
11057       T(V7E_M), // V5TEJ.
11058       T(V7E_M), // V6.
11059       T(V7E_M), // V6KZ.
11060       T(V7E_M), // V6T2.
11061       T(V7E_M), // V6K.
11062       T(V7E_M), // V7.
11063       T(V7E_M), // V6_M.
11064       T(V7E_M), // V6S_M.
11065       T(V7E_M)  // V7E_M.
11066     };
11067   static const int v8[] =
11068     {
11069       T(V8),   // PRE_V4.
11070       T(V8),   // V4.
11071       T(V8),   // V4T.
11072       T(V8),   // V5T.
11073       T(V8),   // V5TE.
11074       T(V8),   // V5TEJ.
11075       T(V8),   // V6.
11076       T(V8),   // V6KZ.
11077       T(V8),   // V6T2.
11078       T(V8),   // V6K.
11079       T(V8),   // V7.
11080       T(V8),   // V6_M.
11081       T(V8),   // V6S_M.
11082       T(V8),   // V7E_M.
11083       T(V8)    // V8.
11084     };
11085   static const int v4t_plus_v6_m[] =
11086     {
11087       -1,               // PRE_V4.
11088       -1,               // V4.
11089       T(V4T),           // V4T.
11090       T(V5T),           // V5T.
11091       T(V5TE),          // V5TE.
11092       T(V5TEJ),         // V5TEJ.
11093       T(V6),            // V6.
11094       T(V6KZ),          // V6KZ.
11095       T(V6T2),          // V6T2.
11096       T(V6K),           // V6K.
11097       T(V7),            // V7.
11098       T(V6_M),          // V6_M.
11099       T(V6S_M),         // V6S_M.
11100       T(V7E_M),         // V7E_M.
11101       T(V8),            // V8.
11102       T(V4T_PLUS_V6_M)  // V4T plus V6_M.
11103     };
11104   static const int* comb[] =
11105     {
11106       v6t2,
11107       v6k,
11108       v7,
11109       v6_m,
11110       v6s_m,
11111       v7e_m,
11112       v8,
11113       // Pseudo-architecture.
11114       v4t_plus_v6_m
11115     };
11116
11117   // Check we've not got a higher architecture than we know about.
11118
11119   if (oldtag > elfcpp::MAX_TAG_CPU_ARCH || newtag > elfcpp::MAX_TAG_CPU_ARCH)
11120     {
11121       gold_error(_("%s: unknown CPU architecture"), name);
11122       return -1;
11123     }
11124
11125   // Override old tag if we have a Tag_also_compatible_with on the output.
11126
11127   if ((oldtag == T(V6_M) && *secondary_compat_out == T(V4T))
11128       || (oldtag == T(V4T) && *secondary_compat_out == T(V6_M)))
11129     oldtag = T(V4T_PLUS_V6_M);
11130
11131   // And override the new tag if we have a Tag_also_compatible_with on the
11132   // input.
11133
11134   if ((newtag == T(V6_M) && secondary_compat == T(V4T))
11135       || (newtag == T(V4T) && secondary_compat == T(V6_M)))
11136     newtag = T(V4T_PLUS_V6_M);
11137
11138   // Architectures before V6KZ add features monotonically.
11139   int tagh = std::max(oldtag, newtag);
11140   if (tagh <= elfcpp::TAG_CPU_ARCH_V6KZ)
11141     return tagh;
11142
11143   int tagl = std::min(oldtag, newtag);
11144   int result = comb[tagh - T(V6T2)][tagl];
11145
11146   // Use Tag_CPU_arch == V4T and Tag_also_compatible_with (Tag_CPU_arch V6_M)
11147   // as the canonical version.
11148   if (result == T(V4T_PLUS_V6_M))
11149     {
11150       result = T(V4T);
11151       *secondary_compat_out = T(V6_M);
11152     }
11153   else
11154     *secondary_compat_out = -1;
11155
11156   if (result == -1)
11157     {
11158       gold_error(_("%s: conflicting CPU architectures %d/%d"),
11159                  name, oldtag, newtag);
11160       return -1;
11161     }
11162
11163   return result;
11164 #undef T
11165 }
11166
11167 // Helper to print AEABI enum tag value.
11168
11169 template<bool big_endian>
11170 std::string
11171 Target_arm<big_endian>::aeabi_enum_name(unsigned int value)
11172 {
11173   static const char* aeabi_enum_names[] =
11174     { "", "variable-size", "32-bit", "" };
11175   const size_t aeabi_enum_names_size =
11176     sizeof(aeabi_enum_names) / sizeof(aeabi_enum_names[0]);
11177
11178   if (value < aeabi_enum_names_size)
11179     return std::string(aeabi_enum_names[value]);
11180   else
11181     {
11182       char buffer[100];
11183       sprintf(buffer, "<unknown value %u>", value);
11184       return std::string(buffer);
11185     }
11186 }
11187
11188 // Return the string value to store in TAG_CPU_name.
11189
11190 template<bool big_endian>
11191 std::string
11192 Target_arm<big_endian>::tag_cpu_name_value(unsigned int value)
11193 {
11194   static const char* name_table[] = {
11195     // These aren't real CPU names, but we can't guess
11196     // that from the architecture version alone.
11197    "Pre v4",
11198    "ARM v4",
11199    "ARM v4T",
11200    "ARM v5T",
11201    "ARM v5TE",
11202    "ARM v5TEJ",
11203    "ARM v6",
11204    "ARM v6KZ",
11205    "ARM v6T2",
11206    "ARM v6K",
11207    "ARM v7",
11208    "ARM v6-M",
11209    "ARM v6S-M",
11210    "ARM v7E-M",
11211    "ARM v8"
11212  };
11213  const size_t name_table_size = sizeof(name_table) / sizeof(name_table[0]);
11214
11215   if (value < name_table_size)
11216     return std::string(name_table[value]);
11217   else
11218     {
11219       char buffer[100];
11220       sprintf(buffer, "<unknown CPU value %u>", value);
11221       return std::string(buffer);
11222     }
11223 }
11224
11225 // Query attributes object to see if integer divide instructions may be
11226 // present in an object.
11227
11228 template<bool big_endian>
11229 bool
11230 Target_arm<big_endian>::attributes_accept_div(int arch, int profile,
11231     const Object_attribute* div_attr)
11232 {
11233   switch (div_attr->int_value())
11234     {
11235     case 0:
11236       // Integer divide allowed if instruction contained in
11237       // architecture.
11238       if (arch == elfcpp::TAG_CPU_ARCH_V7 && (profile == 'R' || profile == 'M'))
11239         return true;
11240       else if (arch >= elfcpp::TAG_CPU_ARCH_V7E_M)
11241         return true;
11242       else
11243         return false;
11244
11245     case 1:
11246       // Integer divide explicitly prohibited.
11247       return false;
11248
11249     default:
11250       // Unrecognised case - treat as allowing divide everywhere.
11251     case 2:
11252       // Integer divide allowed in ARM state.
11253       return true;
11254     }
11255 }
11256
11257 // Query attributes object to see if integer divide instructions are
11258 // forbidden to be in the object.  This is not the inverse of
11259 // attributes_accept_div.
11260
11261 template<bool big_endian>
11262 bool
11263 Target_arm<big_endian>::attributes_forbid_div(const Object_attribute* div_attr)
11264 {
11265   return div_attr->int_value() == 1;
11266 }
11267
11268 // Merge object attributes from input file called NAME with those of the
11269 // output.  The input object attributes are in the object pointed by PASD.
11270
11271 template<bool big_endian>
11272 void
11273 Target_arm<big_endian>::merge_object_attributes(
11274     const char* name,
11275     const Attributes_section_data* pasd)
11276 {
11277   // Return if there is no attributes section data.
11278   if (pasd == NULL)
11279     return;
11280
11281   // If output has no object attributes, just copy.
11282   const int vendor = Object_attribute::OBJ_ATTR_PROC;
11283   if (this->attributes_section_data_ == NULL)
11284     {
11285       this->attributes_section_data_ = new Attributes_section_data(*pasd);
11286       Object_attribute* out_attr =
11287         this->attributes_section_data_->known_attributes(vendor);
11288
11289       // We do not output objects with Tag_MPextension_use_legacy - we move
11290       //  the attribute's value to Tag_MPextension_use.  */
11291       if (out_attr[elfcpp::Tag_MPextension_use_legacy].int_value() != 0)
11292         {
11293           if (out_attr[elfcpp::Tag_MPextension_use].int_value() != 0
11294               && out_attr[elfcpp::Tag_MPextension_use_legacy].int_value()
11295                 != out_attr[elfcpp::Tag_MPextension_use].int_value())
11296             {
11297               gold_error(_("%s has both the current and legacy "
11298                            "Tag_MPextension_use attributes"),
11299                          name);
11300             }
11301
11302           out_attr[elfcpp::Tag_MPextension_use] =
11303             out_attr[elfcpp::Tag_MPextension_use_legacy];
11304           out_attr[elfcpp::Tag_MPextension_use_legacy].set_type(0);
11305           out_attr[elfcpp::Tag_MPextension_use_legacy].set_int_value(0);
11306         }
11307
11308       return;
11309     }
11310
11311   const Object_attribute* in_attr = pasd->known_attributes(vendor);
11312   Object_attribute* out_attr =
11313     this->attributes_section_data_->known_attributes(vendor);
11314
11315   // This needs to happen before Tag_ABI_FP_number_model is merged.  */
11316   if (in_attr[elfcpp::Tag_ABI_VFP_args].int_value()
11317       != out_attr[elfcpp::Tag_ABI_VFP_args].int_value())
11318     {
11319       // Ignore mismatches if the object doesn't use floating point.  */
11320       if (out_attr[elfcpp::Tag_ABI_FP_number_model].int_value()
11321           == elfcpp::AEABI_FP_number_model_none
11322           || (in_attr[elfcpp::Tag_ABI_FP_number_model].int_value()
11323               != elfcpp::AEABI_FP_number_model_none
11324               && out_attr[elfcpp::Tag_ABI_VFP_args].int_value()
11325                  == elfcpp::AEABI_VFP_args_compatible))
11326         out_attr[elfcpp::Tag_ABI_VFP_args].set_int_value(
11327             in_attr[elfcpp::Tag_ABI_VFP_args].int_value());
11328       else if (in_attr[elfcpp::Tag_ABI_FP_number_model].int_value()
11329                != elfcpp::AEABI_FP_number_model_none
11330                && in_attr[elfcpp::Tag_ABI_VFP_args].int_value()
11331                   != elfcpp::AEABI_VFP_args_compatible
11332                && parameters->options().warn_mismatch())
11333         gold_error(_("%s uses VFP register arguments, output does not"),
11334                    name);
11335     }
11336
11337   for (int i = 4; i < Vendor_object_attributes::NUM_KNOWN_ATTRIBUTES; ++i)
11338     {
11339       // Merge this attribute with existing attributes.
11340       switch (i)
11341         {
11342         case elfcpp::Tag_CPU_raw_name:
11343         case elfcpp::Tag_CPU_name:
11344           // These are merged after Tag_CPU_arch.
11345           break;
11346
11347         case elfcpp::Tag_ABI_optimization_goals:
11348         case elfcpp::Tag_ABI_FP_optimization_goals:
11349           // Use the first value seen.
11350           break;
11351
11352         case elfcpp::Tag_CPU_arch:
11353           {
11354             unsigned int saved_out_attr = out_attr->int_value();
11355             // Merge Tag_CPU_arch and Tag_also_compatible_with.
11356             int secondary_compat =
11357               this->get_secondary_compatible_arch(pasd);
11358             int secondary_compat_out =
11359               this->get_secondary_compatible_arch(
11360                   this->attributes_section_data_);
11361             out_attr[i].set_int_value(
11362                 tag_cpu_arch_combine(name, out_attr[i].int_value(),
11363                                      &secondary_compat_out,
11364                                      in_attr[i].int_value(),
11365                                      secondary_compat));
11366             this->set_secondary_compatible_arch(this->attributes_section_data_,
11367                                                 secondary_compat_out);
11368
11369             // Merge Tag_CPU_name and Tag_CPU_raw_name.
11370             if (out_attr[i].int_value() == saved_out_attr)
11371               ; // Leave the names alone.
11372             else if (out_attr[i].int_value() == in_attr[i].int_value())
11373               {
11374                 // The output architecture has been changed to match the
11375                 // input architecture.  Use the input names.
11376                 out_attr[elfcpp::Tag_CPU_name].set_string_value(
11377                     in_attr[elfcpp::Tag_CPU_name].string_value());
11378                 out_attr[elfcpp::Tag_CPU_raw_name].set_string_value(
11379                     in_attr[elfcpp::Tag_CPU_raw_name].string_value());
11380               }
11381             else
11382               {
11383                 out_attr[elfcpp::Tag_CPU_name].set_string_value("");
11384                 out_attr[elfcpp::Tag_CPU_raw_name].set_string_value("");
11385               }
11386
11387             // If we still don't have a value for Tag_CPU_name,
11388             // make one up now.  Tag_CPU_raw_name remains blank.
11389             if (out_attr[elfcpp::Tag_CPU_name].string_value() == "")
11390               {
11391                 const std::string cpu_name =
11392                   this->tag_cpu_name_value(out_attr[i].int_value());
11393                 // FIXME:  If we see an unknown CPU, this will be set
11394                 // to "<unknown CPU n>", where n is the attribute value.
11395                 // This is different from BFD, which leaves the name alone.
11396                 out_attr[elfcpp::Tag_CPU_name].set_string_value(cpu_name);
11397               }
11398           }
11399           break;
11400
11401         case elfcpp::Tag_ARM_ISA_use:
11402         case elfcpp::Tag_THUMB_ISA_use:
11403         case elfcpp::Tag_WMMX_arch:
11404         case elfcpp::Tag_Advanced_SIMD_arch:
11405           // ??? Do Advanced_SIMD (NEON) and WMMX conflict?
11406         case elfcpp::Tag_ABI_FP_rounding:
11407         case elfcpp::Tag_ABI_FP_exceptions:
11408         case elfcpp::Tag_ABI_FP_user_exceptions:
11409         case elfcpp::Tag_ABI_FP_number_model:
11410         case elfcpp::Tag_VFP_HP_extension:
11411         case elfcpp::Tag_CPU_unaligned_access:
11412         case elfcpp::Tag_T2EE_use:
11413         case elfcpp::Tag_Virtualization_use:
11414         case elfcpp::Tag_MPextension_use:
11415           // Use the largest value specified.
11416           if (in_attr[i].int_value() > out_attr[i].int_value())
11417             out_attr[i].set_int_value(in_attr[i].int_value());
11418           break;
11419
11420         case elfcpp::Tag_ABI_align8_preserved:
11421         case elfcpp::Tag_ABI_PCS_RO_data:
11422           // Use the smallest value specified.
11423           if (in_attr[i].int_value() < out_attr[i].int_value())
11424             out_attr[i].set_int_value(in_attr[i].int_value());
11425           break;
11426
11427         case elfcpp::Tag_ABI_align8_needed:
11428           if ((in_attr[i].int_value() > 0 || out_attr[i].int_value() > 0)
11429               && (in_attr[elfcpp::Tag_ABI_align8_preserved].int_value() == 0
11430                   || (out_attr[elfcpp::Tag_ABI_align8_preserved].int_value()
11431                       == 0)))
11432             {
11433               // This error message should be enabled once all non-conforming
11434               // binaries in the toolchain have had the attributes set
11435               // properly.
11436               // gold_error(_("output 8-byte data alignment conflicts with %s"),
11437               //            name);
11438             }
11439           // Fall through.
11440         case elfcpp::Tag_ABI_FP_denormal:
11441         case elfcpp::Tag_ABI_PCS_GOT_use:
11442           {
11443             // These tags have 0 = don't care, 1 = strong requirement,
11444             // 2 = weak requirement.
11445             static const int order_021[3] = {0, 2, 1};
11446
11447             // Use the "greatest" from the sequence 0, 2, 1, or the largest
11448             // value if greater than 2 (for future-proofing).
11449             if ((in_attr[i].int_value() > 2
11450                  && in_attr[i].int_value() > out_attr[i].int_value())
11451                 || (in_attr[i].int_value() <= 2
11452                     && out_attr[i].int_value() <= 2
11453                     && (order_021[in_attr[i].int_value()]
11454                         > order_021[out_attr[i].int_value()])))
11455               out_attr[i].set_int_value(in_attr[i].int_value());
11456           }
11457           break;
11458
11459         case elfcpp::Tag_CPU_arch_profile:
11460           if (out_attr[i].int_value() != in_attr[i].int_value())
11461             {
11462               // 0 will merge with anything.
11463               // 'A' and 'S' merge to 'A'.
11464               // 'R' and 'S' merge to 'R'.
11465               // 'M' and 'A|R|S' is an error.
11466               if (out_attr[i].int_value() == 0
11467                   || (out_attr[i].int_value() == 'S'
11468                       && (in_attr[i].int_value() == 'A'
11469                           || in_attr[i].int_value() == 'R')))
11470                 out_attr[i].set_int_value(in_attr[i].int_value());
11471               else if (in_attr[i].int_value() == 0
11472                        || (in_attr[i].int_value() == 'S'
11473                            && (out_attr[i].int_value() == 'A'
11474                                || out_attr[i].int_value() == 'R')))
11475                 ; // Do nothing.
11476               else if (parameters->options().warn_mismatch())
11477                 {
11478                   gold_error
11479                     (_("conflicting architecture profiles %c/%c"),
11480                      in_attr[i].int_value() ? in_attr[i].int_value() : '0',
11481                      out_attr[i].int_value() ? out_attr[i].int_value() : '0');
11482                 }
11483             }
11484           break;
11485         case elfcpp::Tag_VFP_arch:
11486             {
11487               static const struct
11488               {
11489                   int ver;
11490                   int regs;
11491               } vfp_versions[7] =
11492                 {
11493                   {0, 0},
11494                   {1, 16},
11495                   {2, 16},
11496                   {3, 32},
11497                   {3, 16},
11498                   {4, 32},
11499                   {4, 16}
11500                 };
11501
11502               // Values greater than 6 aren't defined, so just pick the
11503               // biggest.
11504               if (in_attr[i].int_value() > 6
11505                   && in_attr[i].int_value() > out_attr[i].int_value())
11506                 {
11507                   *out_attr = *in_attr;
11508                   break;
11509                 }
11510               // The output uses the superset of input features
11511               // (ISA version) and registers.
11512               int ver = std::max(vfp_versions[in_attr[i].int_value()].ver,
11513                                  vfp_versions[out_attr[i].int_value()].ver);
11514               int regs = std::max(vfp_versions[in_attr[i].int_value()].regs,
11515                                   vfp_versions[out_attr[i].int_value()].regs);
11516               // This assumes all possible supersets are also a valid
11517               // options.
11518               int newval;
11519               for (newval = 6; newval > 0; newval--)
11520                 {
11521                   if (regs == vfp_versions[newval].regs
11522                       && ver == vfp_versions[newval].ver)
11523                     break;
11524                 }
11525               out_attr[i].set_int_value(newval);
11526             }
11527           break;
11528         case elfcpp::Tag_PCS_config:
11529           if (out_attr[i].int_value() == 0)
11530             out_attr[i].set_int_value(in_attr[i].int_value());
11531           else if (in_attr[i].int_value() != 0
11532                    && out_attr[i].int_value() != 0
11533                    && parameters->options().warn_mismatch())
11534             {
11535               // It's sometimes ok to mix different configs, so this is only
11536               // a warning.
11537               gold_warning(_("%s: conflicting platform configuration"), name);
11538             }
11539           break;
11540         case elfcpp::Tag_ABI_PCS_R9_use:
11541           if (in_attr[i].int_value() != out_attr[i].int_value()
11542               && out_attr[i].int_value() != elfcpp::AEABI_R9_unused
11543               && in_attr[i].int_value() != elfcpp::AEABI_R9_unused
11544               && parameters->options().warn_mismatch())
11545             {
11546               gold_error(_("%s: conflicting use of R9"), name);
11547             }
11548           if (out_attr[i].int_value() == elfcpp::AEABI_R9_unused)
11549             out_attr[i].set_int_value(in_attr[i].int_value());
11550           break;
11551         case elfcpp::Tag_ABI_PCS_RW_data:
11552           if (in_attr[i].int_value() == elfcpp::AEABI_PCS_RW_data_SBrel
11553               && (in_attr[elfcpp::Tag_ABI_PCS_R9_use].int_value()
11554                   != elfcpp::AEABI_R9_SB)
11555               && (out_attr[elfcpp::Tag_ABI_PCS_R9_use].int_value()
11556                   != elfcpp::AEABI_R9_unused)
11557               && parameters->options().warn_mismatch())
11558             {
11559               gold_error(_("%s: SB relative addressing conflicts with use "
11560                            "of R9"),
11561                            name);
11562             }
11563           // Use the smallest value specified.
11564           if (in_attr[i].int_value() < out_attr[i].int_value())
11565             out_attr[i].set_int_value(in_attr[i].int_value());
11566           break;
11567         case elfcpp::Tag_ABI_PCS_wchar_t:
11568           if (out_attr[i].int_value()
11569               && in_attr[i].int_value()
11570               && out_attr[i].int_value() != in_attr[i].int_value()
11571               && parameters->options().warn_mismatch()
11572               && parameters->options().wchar_size_warning())
11573             {
11574               gold_warning(_("%s uses %u-byte wchar_t yet the output is to "
11575                              "use %u-byte wchar_t; use of wchar_t values "
11576                              "across objects may fail"),
11577                            name, in_attr[i].int_value(),
11578                            out_attr[i].int_value());
11579             }
11580           else if (in_attr[i].int_value() && !out_attr[i].int_value())
11581             out_attr[i].set_int_value(in_attr[i].int_value());
11582           break;
11583         case elfcpp::Tag_ABI_enum_size:
11584           if (in_attr[i].int_value() != elfcpp::AEABI_enum_unused)
11585             {
11586               if (out_attr[i].int_value() == elfcpp::AEABI_enum_unused
11587                   || out_attr[i].int_value() == elfcpp::AEABI_enum_forced_wide)
11588                 {
11589                   // The existing object is compatible with anything.
11590                   // Use whatever requirements the new object has.
11591                   out_attr[i].set_int_value(in_attr[i].int_value());
11592                 }
11593               else if (in_attr[i].int_value() != elfcpp::AEABI_enum_forced_wide
11594                        && out_attr[i].int_value() != in_attr[i].int_value()
11595                        && parameters->options().warn_mismatch()
11596                        && parameters->options().enum_size_warning())
11597                 {
11598                   unsigned int in_value = in_attr[i].int_value();
11599                   unsigned int out_value = out_attr[i].int_value();
11600                   gold_warning(_("%s uses %s enums yet the output is to use "
11601                                  "%s enums; use of enum values across objects "
11602                                  "may fail"),
11603                                name,
11604                                this->aeabi_enum_name(in_value).c_str(),
11605                                this->aeabi_enum_name(out_value).c_str());
11606                 }
11607             }
11608           break;
11609         case elfcpp::Tag_ABI_VFP_args:
11610           // Already done.
11611           break;
11612         case elfcpp::Tag_ABI_WMMX_args:
11613           if (in_attr[i].int_value() != out_attr[i].int_value()
11614               && parameters->options().warn_mismatch())
11615             {
11616               gold_error(_("%s uses iWMMXt register arguments, output does "
11617                            "not"),
11618                          name);
11619             }
11620           break;
11621         case Object_attribute::Tag_compatibility:
11622           // Merged in target-independent code.
11623           break;
11624         case elfcpp::Tag_ABI_HardFP_use:
11625           // 1 (SP) and 2 (DP) conflict, so combine to 3 (SP & DP).
11626           if ((in_attr[i].int_value() == 1 && out_attr[i].int_value() == 2)
11627               || (in_attr[i].int_value() == 2 && out_attr[i].int_value() == 1))
11628             out_attr[i].set_int_value(3);
11629           else if (in_attr[i].int_value() > out_attr[i].int_value())
11630             out_attr[i].set_int_value(in_attr[i].int_value());
11631           break;
11632         case elfcpp::Tag_ABI_FP_16bit_format:
11633           if (in_attr[i].int_value() != 0 && out_attr[i].int_value() != 0)
11634             {
11635               if (in_attr[i].int_value() != out_attr[i].int_value()
11636                   && parameters->options().warn_mismatch())
11637                 gold_error(_("fp16 format mismatch between %s and output"),
11638                            name);
11639             }
11640           if (in_attr[i].int_value() != 0)
11641             out_attr[i].set_int_value(in_attr[i].int_value());
11642           break;
11643
11644         case elfcpp::Tag_DIV_use:
11645           {
11646             // A value of zero on input means that the divide
11647             // instruction may be used if available in the base
11648             // architecture as specified via Tag_CPU_arch and
11649             // Tag_CPU_arch_profile.  A value of 1 means that the user
11650             // did not want divide instructions.  A value of 2
11651             // explicitly means that divide instructions were allowed
11652             // in ARM and Thumb state.
11653             int arch = this->
11654               get_aeabi_object_attribute(elfcpp::Tag_CPU_arch)->
11655               int_value();
11656             int profile = this->
11657               get_aeabi_object_attribute(elfcpp::Tag_CPU_arch_profile)->
11658               int_value();
11659             if (in_attr[i].int_value() == out_attr[i].int_value())
11660               {
11661                 // Do nothing.
11662               }
11663             else if (attributes_forbid_div(&in_attr[i])
11664                      && !attributes_accept_div(arch, profile, &out_attr[i]))
11665               out_attr[i].set_int_value(1);
11666             else if (attributes_forbid_div(&out_attr[i])
11667                      && attributes_accept_div(arch, profile, &in_attr[i]))
11668               out_attr[i].set_int_value(in_attr[i].int_value());
11669             else if (in_attr[i].int_value() == 2)
11670               out_attr[i].set_int_value(in_attr[i].int_value());
11671           }
11672           break;
11673
11674         case elfcpp::Tag_MPextension_use_legacy:
11675           // We don't output objects with Tag_MPextension_use_legacy - we
11676           // move the value to Tag_MPextension_use.
11677           if (in_attr[i].int_value() != 0
11678               && in_attr[elfcpp::Tag_MPextension_use].int_value() != 0)
11679             {
11680               if (in_attr[elfcpp::Tag_MPextension_use].int_value()
11681                   != in_attr[i].int_value())
11682                 {
11683                   gold_error(_("%s has both the current and legacy "
11684                                "Tag_MPextension_use attributes"),
11685                              name);
11686                 }
11687             }
11688
11689           if (in_attr[i].int_value()
11690               > out_attr[elfcpp::Tag_MPextension_use].int_value())
11691             out_attr[elfcpp::Tag_MPextension_use] = in_attr[i];
11692
11693           break;
11694
11695         case elfcpp::Tag_nodefaults:
11696           // This tag is set if it exists, but the value is unused (and is
11697           // typically zero).  We don't actually need to do anything here -
11698           // the merge happens automatically when the type flags are merged
11699           // below.
11700           break;
11701         case elfcpp::Tag_also_compatible_with:
11702           // Already done in Tag_CPU_arch.
11703           break;
11704         case elfcpp::Tag_conformance:
11705           // Keep the attribute if it matches.  Throw it away otherwise.
11706           // No attribute means no claim to conform.
11707           if (in_attr[i].string_value() != out_attr[i].string_value())
11708             out_attr[i].set_string_value("");
11709           break;
11710
11711         default:
11712           {
11713             const char* err_object = NULL;
11714
11715             // The "known_obj_attributes" table does contain some undefined
11716             // attributes.  Ensure that there are unused.
11717             if (out_attr[i].int_value() != 0
11718                 || out_attr[i].string_value() != "")
11719               err_object = "output";
11720             else if (in_attr[i].int_value() != 0
11721                      || in_attr[i].string_value() != "")
11722               err_object = name;
11723
11724             if (err_object != NULL
11725                 && parameters->options().warn_mismatch())
11726               {
11727                 // Attribute numbers >=64 (mod 128) can be safely ignored.
11728                 if ((i & 127) < 64)
11729                   gold_error(_("%s: unknown mandatory EABI object attribute "
11730                                "%d"),
11731                              err_object, i);
11732                 else
11733                   gold_warning(_("%s: unknown EABI object attribute %d"),
11734                                err_object, i);
11735               }
11736
11737             // Only pass on attributes that match in both inputs.
11738             if (!in_attr[i].matches(out_attr[i]))
11739               {
11740                 out_attr[i].set_int_value(0);
11741                 out_attr[i].set_string_value("");
11742               }
11743           }
11744         }
11745
11746       // If out_attr was copied from in_attr then it won't have a type yet.
11747       if (in_attr[i].type() && !out_attr[i].type())
11748         out_attr[i].set_type(in_attr[i].type());
11749     }
11750
11751   // Merge Tag_compatibility attributes and any common GNU ones.
11752   this->attributes_section_data_->merge(name, pasd);
11753
11754   // Check for any attributes not known on ARM.
11755   typedef Vendor_object_attributes::Other_attributes Other_attributes;
11756   const Other_attributes* in_other_attributes = pasd->other_attributes(vendor);
11757   Other_attributes::const_iterator in_iter = in_other_attributes->begin();
11758   Other_attributes* out_other_attributes =
11759     this->attributes_section_data_->other_attributes(vendor);
11760   Other_attributes::iterator out_iter = out_other_attributes->begin();
11761
11762   while (in_iter != in_other_attributes->end()
11763          || out_iter != out_other_attributes->end())
11764     {
11765       const char* err_object = NULL;
11766       int err_tag = 0;
11767
11768       // The tags for each list are in numerical order.
11769       // If the tags are equal, then merge.
11770       if (out_iter != out_other_attributes->end()
11771           && (in_iter == in_other_attributes->end()
11772               || in_iter->first > out_iter->first))
11773         {
11774           // This attribute only exists in output.  We can't merge, and we
11775           // don't know what the tag means, so delete it.
11776           err_object = "output";
11777           err_tag = out_iter->first;
11778           int saved_tag = out_iter->first;
11779           delete out_iter->second;
11780           out_other_attributes->erase(out_iter);
11781           out_iter = out_other_attributes->upper_bound(saved_tag);
11782         }
11783       else if (in_iter != in_other_attributes->end()
11784                && (out_iter != out_other_attributes->end()
11785                    || in_iter->first < out_iter->first))
11786         {
11787           // This attribute only exists in input. We can't merge, and we
11788           // don't know what the tag means, so ignore it.
11789           err_object = name;
11790           err_tag = in_iter->first;
11791           ++in_iter;
11792         }
11793       else // The tags are equal.
11794         {
11795           // As present, all attributes in the list are unknown, and
11796           // therefore can't be merged meaningfully.
11797           err_object = "output";
11798           err_tag = out_iter->first;
11799
11800           //  Only pass on attributes that match in both inputs.
11801           if (!in_iter->second->matches(*(out_iter->second)))
11802             {
11803               // No match.  Delete the attribute.
11804               int saved_tag = out_iter->first;
11805               delete out_iter->second;
11806               out_other_attributes->erase(out_iter);
11807               out_iter = out_other_attributes->upper_bound(saved_tag);
11808             }
11809           else
11810             {
11811               // Matched.  Keep the attribute and move to the next.
11812               ++out_iter;
11813               ++in_iter;
11814             }
11815         }
11816
11817       if (err_object && parameters->options().warn_mismatch())
11818         {
11819           // Attribute numbers >=64 (mod 128) can be safely ignored.  */
11820           if ((err_tag & 127) < 64)
11821             {
11822               gold_error(_("%s: unknown mandatory EABI object attribute %d"),
11823                          err_object, err_tag);
11824             }
11825           else
11826             {
11827               gold_warning(_("%s: unknown EABI object attribute %d"),
11828                            err_object, err_tag);
11829             }
11830         }
11831     }
11832 }
11833
11834 // Stub-generation methods for Target_arm.
11835
11836 // Make a new Arm_input_section object.
11837
11838 template<bool big_endian>
11839 Arm_input_section<big_endian>*
11840 Target_arm<big_endian>::new_arm_input_section(
11841     Relobj* relobj,
11842     unsigned int shndx)
11843 {
11844   Section_id sid(relobj, shndx);
11845
11846   Arm_input_section<big_endian>* arm_input_section =
11847     new Arm_input_section<big_endian>(relobj, shndx);
11848   arm_input_section->init();
11849
11850   // Register new Arm_input_section in map for look-up.
11851   std::pair<typename Arm_input_section_map::iterator, bool> ins =
11852     this->arm_input_section_map_.insert(std::make_pair(sid, arm_input_section));
11853
11854   // Make sure that it we have not created another Arm_input_section
11855   // for this input section already.
11856   gold_assert(ins.second);
11857
11858   return arm_input_section;
11859 }
11860
11861 // Find the Arm_input_section object corresponding to the SHNDX-th input
11862 // section of RELOBJ.
11863
11864 template<bool big_endian>
11865 Arm_input_section<big_endian>*
11866 Target_arm<big_endian>::find_arm_input_section(
11867     Relobj* relobj,
11868     unsigned int shndx) const
11869 {
11870   Section_id sid(relobj, shndx);
11871   typename Arm_input_section_map::const_iterator p =
11872     this->arm_input_section_map_.find(sid);
11873   return (p != this->arm_input_section_map_.end()) ? p->second : NULL;
11874 }
11875
11876 // Make a new stub table.
11877
11878 template<bool big_endian>
11879 Stub_table<big_endian>*
11880 Target_arm<big_endian>::new_stub_table(Arm_input_section<big_endian>* owner)
11881 {
11882   Stub_table<big_endian>* stub_table =
11883     new Stub_table<big_endian>(owner);
11884   this->stub_tables_.push_back(stub_table);
11885
11886   stub_table->set_address(owner->address() + owner->data_size());
11887   stub_table->set_file_offset(owner->offset() + owner->data_size());
11888   stub_table->finalize_data_size();
11889
11890   return stub_table;
11891 }
11892
11893 // Scan a relocation for stub generation.
11894
11895 template<bool big_endian>
11896 void
11897 Target_arm<big_endian>::scan_reloc_for_stub(
11898     const Relocate_info<32, big_endian>* relinfo,
11899     unsigned int r_type,
11900     const Sized_symbol<32>* gsym,
11901     unsigned int r_sym,
11902     const Symbol_value<32>* psymval,
11903     elfcpp::Elf_types<32>::Elf_Swxword addend,
11904     Arm_address address)
11905 {
11906   const Arm_relobj<big_endian>* arm_relobj =
11907     Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
11908
11909   bool target_is_thumb;
11910   Symbol_value<32> symval;
11911   if (gsym != NULL)
11912     {
11913       // This is a global symbol.  Determine if we use PLT and if the
11914       // final target is THUMB.
11915       if (gsym->use_plt_offset(Scan::get_reference_flags(r_type)))
11916         {
11917           // This uses a PLT, change the symbol value.
11918           symval.set_output_value(this->plt_address_for_global(gsym));
11919           psymval = &symval;
11920           target_is_thumb = false;
11921         }
11922       else if (gsym->is_undefined())
11923         // There is no need to generate a stub symbol is undefined.
11924         return;
11925       else
11926         {
11927           target_is_thumb =
11928             ((gsym->type() == elfcpp::STT_ARM_TFUNC)
11929              || (gsym->type() == elfcpp::STT_FUNC
11930                  && !gsym->is_undefined()
11931                  && ((psymval->value(arm_relobj, 0) & 1) != 0)));
11932         }
11933     }
11934   else
11935     {
11936       // This is a local symbol.  Determine if the final target is THUMB.
11937       target_is_thumb = arm_relobj->local_symbol_is_thumb_function(r_sym);
11938     }
11939
11940   // Strip LSB if this points to a THUMB target.
11941   const Arm_reloc_property* reloc_property =
11942     arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
11943   gold_assert(reloc_property != NULL);
11944   if (target_is_thumb
11945       && reloc_property->uses_thumb_bit()
11946       && ((psymval->value(arm_relobj, 0) & 1) != 0))
11947     {
11948       Arm_address stripped_value =
11949         psymval->value(arm_relobj, 0) & ~static_cast<Arm_address>(1);
11950       symval.set_output_value(stripped_value);
11951       psymval = &symval;
11952     }
11953
11954   // Get the symbol value.
11955   Symbol_value<32>::Value value = psymval->value(arm_relobj, 0);
11956
11957   // Owing to pipelining, the PC relative branches below actually skip
11958   // two instructions when the branch offset is 0.
11959   Arm_address destination;
11960   switch (r_type)
11961     {
11962     case elfcpp::R_ARM_CALL:
11963     case elfcpp::R_ARM_JUMP24:
11964     case elfcpp::R_ARM_PLT32:
11965       // ARM branches.
11966       destination = value + addend + 8;
11967       break;
11968     case elfcpp::R_ARM_THM_CALL:
11969     case elfcpp::R_ARM_THM_XPC22:
11970     case elfcpp::R_ARM_THM_JUMP24:
11971     case elfcpp::R_ARM_THM_JUMP19:
11972       // THUMB branches.
11973       destination = value + addend + 4;
11974       break;
11975     default:
11976       gold_unreachable();
11977     }
11978
11979   Reloc_stub* stub = NULL;
11980   Stub_type stub_type =
11981     Reloc_stub::stub_type_for_reloc(r_type, address, destination,
11982                                     target_is_thumb);
11983   if (stub_type != arm_stub_none)
11984     {
11985       // Try looking up an existing stub from a stub table.
11986       Stub_table<big_endian>* stub_table =
11987         arm_relobj->stub_table(relinfo->data_shndx);
11988       gold_assert(stub_table != NULL);
11989
11990       // Locate stub by destination.
11991       Reloc_stub::Key stub_key(stub_type, gsym, arm_relobj, r_sym, addend);
11992
11993       // Create a stub if there is not one already
11994       stub = stub_table->find_reloc_stub(stub_key);
11995       if (stub == NULL)
11996         {
11997           // create a new stub and add it to stub table.
11998           stub = this->stub_factory().make_reloc_stub(stub_type);
11999           stub_table->add_reloc_stub(stub, stub_key);
12000         }
12001
12002       // Record the destination address.
12003       stub->set_destination_address(destination
12004                                     | (target_is_thumb ? 1 : 0));
12005     }
12006
12007   // For Cortex-A8, we need to record a relocation at 4K page boundary.
12008   if (this->fix_cortex_a8_
12009       && (r_type == elfcpp::R_ARM_THM_JUMP24
12010           || r_type == elfcpp::R_ARM_THM_JUMP19
12011           || r_type == elfcpp::R_ARM_THM_CALL
12012           || r_type == elfcpp::R_ARM_THM_XPC22)
12013       && (address & 0xfffU) == 0xffeU)
12014     {
12015       // Found a candidate.  Note we haven't checked the destination is
12016       // within 4K here: if we do so (and don't create a record) we can't
12017       // tell that a branch should have been relocated when scanning later.
12018       this->cortex_a8_relocs_info_[address] =
12019         new Cortex_a8_reloc(stub, r_type,
12020                             destination | (target_is_thumb ? 1 : 0));
12021     }
12022 }
12023
12024 // This function scans a relocation sections for stub generation.
12025 // The template parameter Relocate must be a class type which provides
12026 // a single function, relocate(), which implements the machine
12027 // specific part of a relocation.
12028
12029 // BIG_ENDIAN is the endianness of the data.  SH_TYPE is the section type:
12030 // SHT_REL or SHT_RELA.
12031
12032 // PRELOCS points to the relocation data.  RELOC_COUNT is the number
12033 // of relocs.  OUTPUT_SECTION is the output section.
12034 // NEEDS_SPECIAL_OFFSET_HANDLING is true if input offsets need to be
12035 // mapped to output offsets.
12036
12037 // VIEW is the section data, VIEW_ADDRESS is its memory address, and
12038 // VIEW_SIZE is the size.  These refer to the input section, unless
12039 // NEEDS_SPECIAL_OFFSET_HANDLING is true, in which case they refer to
12040 // the output section.
12041
12042 template<bool big_endian>
12043 template<int sh_type>
12044 void inline
12045 Target_arm<big_endian>::scan_reloc_section_for_stubs(
12046     const Relocate_info<32, big_endian>* relinfo,
12047     const unsigned char* prelocs,
12048     size_t reloc_count,
12049     Output_section* output_section,
12050     bool needs_special_offset_handling,
12051     const unsigned char* view,
12052     elfcpp::Elf_types<32>::Elf_Addr view_address,
12053     section_size_type)
12054 {
12055   typedef typename Reloc_types<sh_type, 32, big_endian>::Reloc Reltype;
12056   const int reloc_size =
12057     Reloc_types<sh_type, 32, big_endian>::reloc_size;
12058
12059   Arm_relobj<big_endian>* arm_object =
12060     Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
12061   unsigned int local_count = arm_object->local_symbol_count();
12062
12063   gold::Default_comdat_behavior default_comdat_behavior;
12064   Comdat_behavior comdat_behavior = CB_UNDETERMINED;
12065
12066   for (size_t i = 0; i < reloc_count; ++i, prelocs += reloc_size)
12067     {
12068       Reltype reloc(prelocs);
12069
12070       typename elfcpp::Elf_types<32>::Elf_WXword r_info = reloc.get_r_info();
12071       unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
12072       unsigned int r_type = elfcpp::elf_r_type<32>(r_info);
12073
12074       r_type = this->get_real_reloc_type(r_type);
12075
12076       // Only a few relocation types need stubs.
12077       if ((r_type != elfcpp::R_ARM_CALL)
12078          && (r_type != elfcpp::R_ARM_JUMP24)
12079          && (r_type != elfcpp::R_ARM_PLT32)
12080          && (r_type != elfcpp::R_ARM_THM_CALL)
12081          && (r_type != elfcpp::R_ARM_THM_XPC22)
12082          && (r_type != elfcpp::R_ARM_THM_JUMP24)
12083          && (r_type != elfcpp::R_ARM_THM_JUMP19)
12084          && (r_type != elfcpp::R_ARM_V4BX))
12085         continue;
12086
12087       section_offset_type offset =
12088         convert_to_section_size_type(reloc.get_r_offset());
12089
12090       if (needs_special_offset_handling)
12091         {
12092           offset = output_section->output_offset(relinfo->object,
12093                                                  relinfo->data_shndx,
12094                                                  offset);
12095           if (offset == -1)
12096             continue;
12097         }
12098
12099       // Create a v4bx stub if --fix-v4bx-interworking is used.
12100       if (r_type == elfcpp::R_ARM_V4BX)
12101         {
12102           if (this->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING)
12103             {
12104               // Get the BX instruction.
12105               typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
12106               const Valtype* wv =
12107                 reinterpret_cast<const Valtype*>(view + offset);
12108               elfcpp::Elf_types<32>::Elf_Swxword insn =
12109                 elfcpp::Swap<32, big_endian>::readval(wv);
12110               const uint32_t reg = (insn & 0xf);
12111
12112               if (reg < 0xf)
12113                 {
12114                   // Try looking up an existing stub from a stub table.
12115                   Stub_table<big_endian>* stub_table =
12116                     arm_object->stub_table(relinfo->data_shndx);
12117                   gold_assert(stub_table != NULL);
12118
12119                   if (stub_table->find_arm_v4bx_stub(reg) == NULL)
12120                     {
12121                       // create a new stub and add it to stub table.
12122                       Arm_v4bx_stub* stub =
12123                         this->stub_factory().make_arm_v4bx_stub(reg);
12124                       gold_assert(stub != NULL);
12125                       stub_table->add_arm_v4bx_stub(stub);
12126                     }
12127                 }
12128             }
12129           continue;
12130         }
12131
12132       // Get the addend.
12133       Stub_addend_reader<sh_type, big_endian> stub_addend_reader;
12134       elfcpp::Elf_types<32>::Elf_Swxword addend =
12135         stub_addend_reader(r_type, view + offset, reloc);
12136
12137       const Sized_symbol<32>* sym;
12138
12139       Symbol_value<32> symval;
12140       const Symbol_value<32> *psymval;
12141       bool is_defined_in_discarded_section;
12142       unsigned int shndx;
12143       const Symbol* gsym = NULL;
12144       if (r_sym < local_count)
12145         {
12146           sym = NULL;
12147           psymval = arm_object->local_symbol(r_sym);
12148
12149           // If the local symbol belongs to a section we are discarding,
12150           // and that section is a debug section, try to find the
12151           // corresponding kept section and map this symbol to its
12152           // counterpart in the kept section.  The symbol must not
12153           // correspond to a section we are folding.
12154           bool is_ordinary;
12155           shndx = psymval->input_shndx(&is_ordinary);
12156           is_defined_in_discarded_section =
12157             (is_ordinary
12158              && shndx != elfcpp::SHN_UNDEF
12159              && !arm_object->is_section_included(shndx)
12160              && !relinfo->symtab->is_section_folded(arm_object, shndx));
12161
12162           // We need to compute the would-be final value of this local
12163           // symbol.
12164           if (!is_defined_in_discarded_section)
12165             {
12166               typedef Sized_relobj_file<32, big_endian> ObjType;
12167               if (psymval->is_section_symbol())
12168                 symval.set_is_section_symbol();
12169               typename ObjType::Compute_final_local_value_status status =
12170                 arm_object->compute_final_local_value(r_sym, psymval, &symval,
12171                                                       relinfo->symtab);
12172               if (status == ObjType::CFLV_OK)
12173                 {
12174                   // Currently we cannot handle a branch to a target in
12175                   // a merged section.  If this is the case, issue an error
12176                   // and also free the merge symbol value.
12177                   if (!symval.has_output_value())
12178                     {
12179                       const std::string& section_name =
12180                         arm_object->section_name(shndx);
12181                       arm_object->error(_("cannot handle branch to local %u "
12182                                           "in a merged section %s"),
12183                                         r_sym, section_name.c_str());
12184                     }
12185                   psymval = &symval;
12186                 }
12187               else
12188                 {
12189                   // We cannot determine the final value.
12190                   continue;
12191                 }
12192             }
12193         }
12194       else
12195         {
12196           gsym = arm_object->global_symbol(r_sym);
12197           gold_assert(gsym != NULL);
12198           if (gsym->is_forwarder())
12199             gsym = relinfo->symtab->resolve_forwards(gsym);
12200
12201           sym = static_cast<const Sized_symbol<32>*>(gsym);
12202           if (sym->has_symtab_index() && sym->symtab_index() != -1U)
12203             symval.set_output_symtab_index(sym->symtab_index());
12204           else
12205             symval.set_no_output_symtab_entry();
12206
12207           // We need to compute the would-be final value of this global
12208           // symbol.
12209           const Symbol_table* symtab = relinfo->symtab;
12210           const Sized_symbol<32>* sized_symbol =
12211             symtab->get_sized_symbol<32>(gsym);
12212           Symbol_table::Compute_final_value_status status;
12213           Arm_address value =
12214             symtab->compute_final_value<32>(sized_symbol, &status);
12215
12216           // Skip this if the symbol has not output section.
12217           if (status == Symbol_table::CFVS_NO_OUTPUT_SECTION)
12218             continue;
12219           symval.set_output_value(value);
12220
12221           if (gsym->type() == elfcpp::STT_TLS)
12222             symval.set_is_tls_symbol();
12223           else if (gsym->type() == elfcpp::STT_GNU_IFUNC)
12224             symval.set_is_ifunc_symbol();
12225           psymval = &symval;
12226
12227           is_defined_in_discarded_section =
12228             (gsym->is_defined_in_discarded_section()
12229              && gsym->is_undefined());
12230           shndx = 0;
12231         }
12232
12233       Symbol_value<32> symval2;
12234       if (is_defined_in_discarded_section)
12235         {
12236           std::string name = arm_object->section_name(relinfo->data_shndx);
12237
12238           if (comdat_behavior == CB_UNDETERMINED)
12239               comdat_behavior = default_comdat_behavior.get(name.c_str());
12240
12241           if (comdat_behavior == CB_PRETEND)
12242             {
12243               // FIXME: This case does not work for global symbols.
12244               // We have no place to store the original section index.
12245               // Fortunately this does not matter for comdat sections,
12246               // only for sections explicitly discarded by a linker
12247               // script.
12248               bool found;
12249               typename elfcpp::Elf_types<32>::Elf_Addr value =
12250                 arm_object->map_to_kept_section(shndx, name, &found);
12251               if (found)
12252                 symval2.set_output_value(value + psymval->input_value());
12253               else
12254                 symval2.set_output_value(0);
12255             }
12256           else
12257             {
12258               if (comdat_behavior == CB_ERROR)
12259                 issue_discarded_error(relinfo, i, offset, r_sym, gsym);
12260               symval2.set_output_value(0);
12261             }
12262           symval2.set_no_output_symtab_entry();
12263           psymval = &symval2;
12264         }
12265
12266       // If symbol is a section symbol, we don't know the actual type of
12267       // destination.  Give up.
12268       if (psymval->is_section_symbol())
12269         continue;
12270
12271       this->scan_reloc_for_stub(relinfo, r_type, sym, r_sym, psymval,
12272                                 addend, view_address + offset);
12273     }
12274 }
12275
12276 // Scan an input section for stub generation.
12277
12278 template<bool big_endian>
12279 void
12280 Target_arm<big_endian>::scan_section_for_stubs(
12281     const Relocate_info<32, big_endian>* relinfo,
12282     unsigned int sh_type,
12283     const unsigned char* prelocs,
12284     size_t reloc_count,
12285     Output_section* output_section,
12286     bool needs_special_offset_handling,
12287     const unsigned char* view,
12288     Arm_address view_address,
12289     section_size_type view_size)
12290 {
12291   if (sh_type == elfcpp::SHT_REL)
12292     this->scan_reloc_section_for_stubs<elfcpp::SHT_REL>(
12293         relinfo,
12294         prelocs,
12295         reloc_count,
12296         output_section,
12297         needs_special_offset_handling,
12298         view,
12299         view_address,
12300         view_size);
12301   else if (sh_type == elfcpp::SHT_RELA)
12302     // We do not support RELA type relocations yet.  This is provided for
12303     // completeness.
12304     this->scan_reloc_section_for_stubs<elfcpp::SHT_RELA>(
12305         relinfo,
12306         prelocs,
12307         reloc_count,
12308         output_section,
12309         needs_special_offset_handling,
12310         view,
12311         view_address,
12312         view_size);
12313   else
12314     gold_unreachable();
12315 }
12316
12317 // Group input sections for stub generation.
12318 //
12319 // We group input sections in an output section so that the total size,
12320 // including any padding space due to alignment is smaller than GROUP_SIZE
12321 // unless the only input section in group is bigger than GROUP_SIZE already.
12322 // Then an ARM stub table is created to follow the last input section
12323 // in group.  For each group an ARM stub table is created an is placed
12324 // after the last group.  If STUB_ALWAYS_AFTER_BRANCH is false, we further
12325 // extend the group after the stub table.
12326
12327 template<bool big_endian>
12328 void
12329 Target_arm<big_endian>::group_sections(
12330     Layout* layout,
12331     section_size_type group_size,
12332     bool stubs_always_after_branch,
12333     const Task* task)
12334 {
12335   // Group input sections and insert stub table
12336   Layout::Section_list section_list;
12337   layout->get_executable_sections(&section_list);
12338   for (Layout::Section_list::const_iterator p = section_list.begin();
12339        p != section_list.end();
12340        ++p)
12341     {
12342       Arm_output_section<big_endian>* output_section =
12343         Arm_output_section<big_endian>::as_arm_output_section(*p);
12344       output_section->group_sections(group_size, stubs_always_after_branch,
12345                                      this, task);
12346     }
12347 }
12348
12349 // Relaxation hook.  This is where we do stub generation.
12350
12351 template<bool big_endian>
12352 bool
12353 Target_arm<big_endian>::do_relax(
12354     int pass,
12355     const Input_objects* input_objects,
12356     Symbol_table* symtab,
12357     Layout* layout,
12358     const Task* task)
12359 {
12360   // No need to generate stubs if this is a relocatable link.
12361   gold_assert(!parameters->options().relocatable());
12362
12363   // If this is the first pass, we need to group input sections into
12364   // stub groups.
12365   bool done_exidx_fixup = false;
12366   typedef typename Stub_table_list::iterator Stub_table_iterator;
12367   if (pass == 1)
12368     {
12369       // Determine the stub group size.  The group size is the absolute
12370       // value of the parameter --stub-group-size.  If --stub-group-size
12371       // is passed a negative value, we restrict stubs to be always after
12372       // the stubbed branches.
12373       int32_t stub_group_size_param =
12374         parameters->options().stub_group_size();
12375       bool stubs_always_after_branch = stub_group_size_param < 0;
12376       section_size_type stub_group_size = abs(stub_group_size_param);
12377
12378       if (stub_group_size == 1)
12379         {
12380           // Default value.
12381           // Thumb branch range is +-4MB has to be used as the default
12382           // maximum size (a given section can contain both ARM and Thumb
12383           // code, so the worst case has to be taken into account).  If we are
12384           // fixing cortex-a8 errata, the branch range has to be even smaller,
12385           // since wide conditional branch has a range of +-1MB only.
12386           //
12387           // This value is 48K less than that, which allows for 4096
12388           // 12-byte stubs.  If we exceed that, then we will fail to link.
12389           // The user will have to relink with an explicit group size
12390           // option.
12391             stub_group_size = 4145152;
12392         }
12393
12394       // The Cortex-A8 erratum fix depends on stubs not being in the same 4K
12395       // page as the first half of a 32-bit branch straddling two 4K pages.
12396       // This is a crude way of enforcing that.  In addition, long conditional
12397       // branches of THUMB-2 have a range of +-1M.  If we are fixing cortex-A8
12398       // erratum, limit the group size to  (1M - 12k) to avoid unreachable
12399       // cortex-A8 stubs from long conditional branches.
12400       if (this->fix_cortex_a8_)
12401         {
12402           stubs_always_after_branch = true;
12403           const section_size_type cortex_a8_group_size = 1024 * (1024 - 12);
12404           stub_group_size = std::max(stub_group_size, cortex_a8_group_size);
12405         }
12406
12407       group_sections(layout, stub_group_size, stubs_always_after_branch, task);
12408
12409       // Also fix .ARM.exidx section coverage.
12410       Arm_output_section<big_endian>* exidx_output_section = NULL;
12411       for (Layout::Section_list::const_iterator p =
12412              layout->section_list().begin();
12413            p != layout->section_list().end();
12414            ++p)
12415         if ((*p)->type() == elfcpp::SHT_ARM_EXIDX)
12416           {
12417             if (exidx_output_section == NULL)
12418               exidx_output_section =
12419                 Arm_output_section<big_endian>::as_arm_output_section(*p);
12420             else
12421               // We cannot handle this now.
12422               gold_error(_("multiple SHT_ARM_EXIDX sections %s and %s in a "
12423                            "non-relocatable link"),
12424                           exidx_output_section->name(),
12425                           (*p)->name());
12426           }
12427
12428       if (exidx_output_section != NULL)
12429         {
12430           this->fix_exidx_coverage(layout, input_objects, exidx_output_section,
12431                                    symtab, task);
12432           done_exidx_fixup = true;
12433         }
12434     }
12435   else
12436     {
12437       // If this is not the first pass, addresses and file offsets have
12438       // been reset at this point, set them here.
12439       for (Stub_table_iterator sp = this->stub_tables_.begin();
12440            sp != this->stub_tables_.end();
12441            ++sp)
12442         {
12443           Arm_input_section<big_endian>* owner = (*sp)->owner();
12444           off_t off = align_address(owner->original_size(),
12445                                     (*sp)->addralign());
12446           (*sp)->set_address_and_file_offset(owner->address() + off,
12447                                              owner->offset() + off);
12448         }
12449     }
12450
12451   // The Cortex-A8 stubs are sensitive to layout of code sections.  At the
12452   // beginning of each relaxation pass, just blow away all the stubs.
12453   // Alternatively, we could selectively remove only the stubs and reloc
12454   // information for code sections that have moved since the last pass.
12455   // That would require more book-keeping.
12456   if (this->fix_cortex_a8_)
12457     {
12458       // Clear all Cortex-A8 reloc information.
12459       for (typename Cortex_a8_relocs_info::const_iterator p =
12460              this->cortex_a8_relocs_info_.begin();
12461            p != this->cortex_a8_relocs_info_.end();
12462            ++p)
12463         delete p->second;
12464       this->cortex_a8_relocs_info_.clear();
12465
12466       // Remove all Cortex-A8 stubs.
12467       for (Stub_table_iterator sp = this->stub_tables_.begin();
12468            sp != this->stub_tables_.end();
12469            ++sp)
12470         (*sp)->remove_all_cortex_a8_stubs();
12471     }
12472
12473   // Scan relocs for relocation stubs
12474   for (Input_objects::Relobj_iterator op = input_objects->relobj_begin();
12475        op != input_objects->relobj_end();
12476        ++op)
12477     {
12478       Arm_relobj<big_endian>* arm_relobj =
12479         Arm_relobj<big_endian>::as_arm_relobj(*op);
12480       // Lock the object so we can read from it.  This is only called
12481       // single-threaded from Layout::finalize, so it is OK to lock.
12482       Task_lock_obj<Object> tl(task, arm_relobj);
12483       arm_relobj->scan_sections_for_stubs(this, symtab, layout);
12484     }
12485
12486   // Check all stub tables to see if any of them have their data sizes
12487   // or addresses alignments changed.  These are the only things that
12488   // matter.
12489   bool any_stub_table_changed = false;
12490   Unordered_set<const Output_section*> sections_needing_adjustment;
12491   for (Stub_table_iterator sp = this->stub_tables_.begin();
12492        (sp != this->stub_tables_.end()) && !any_stub_table_changed;
12493        ++sp)
12494     {
12495       if ((*sp)->update_data_size_and_addralign())
12496         {
12497           // Update data size of stub table owner.
12498           Arm_input_section<big_endian>* owner = (*sp)->owner();
12499           uint64_t address = owner->address();
12500           off_t offset = owner->offset();
12501           owner->reset_address_and_file_offset();
12502           owner->set_address_and_file_offset(address, offset);
12503
12504           sections_needing_adjustment.insert(owner->output_section());
12505           any_stub_table_changed = true;
12506         }
12507     }
12508
12509   // Output_section_data::output_section() returns a const pointer but we
12510   // need to update output sections, so we record all output sections needing
12511   // update above and scan the sections here to find out what sections need
12512   // to be updated.
12513   for (Layout::Section_list::const_iterator p = layout->section_list().begin();
12514       p != layout->section_list().end();
12515       ++p)
12516     {
12517       if (sections_needing_adjustment.find(*p)
12518           != sections_needing_adjustment.end())
12519         (*p)->set_section_offsets_need_adjustment();
12520     }
12521
12522   // Stop relaxation if no EXIDX fix-up and no stub table change.
12523   bool continue_relaxation = done_exidx_fixup || any_stub_table_changed;
12524
12525   // Finalize the stubs in the last relaxation pass.
12526   if (!continue_relaxation)
12527     {
12528       for (Stub_table_iterator sp = this->stub_tables_.begin();
12529            (sp != this->stub_tables_.end()) && !any_stub_table_changed;
12530             ++sp)
12531         (*sp)->finalize_stubs();
12532
12533       // Update output local symbol counts of objects if necessary.
12534       for (Input_objects::Relobj_iterator op = input_objects->relobj_begin();
12535            op != input_objects->relobj_end();
12536            ++op)
12537         {
12538           Arm_relobj<big_endian>* arm_relobj =
12539             Arm_relobj<big_endian>::as_arm_relobj(*op);
12540
12541           // Update output local symbol counts.  We need to discard local
12542           // symbols defined in parts of input sections that are discarded by
12543           // relaxation.
12544           if (arm_relobj->output_local_symbol_count_needs_update())
12545             {
12546               // We need to lock the object's file to update it.
12547               Task_lock_obj<Object> tl(task, arm_relobj);
12548               arm_relobj->update_output_local_symbol_count();
12549             }
12550         }
12551     }
12552
12553   return continue_relaxation;
12554 }
12555
12556 // Relocate a stub.
12557
12558 template<bool big_endian>
12559 void
12560 Target_arm<big_endian>::relocate_stub(
12561     Stub* stub,
12562     const Relocate_info<32, big_endian>* relinfo,
12563     Output_section* output_section,
12564     unsigned char* view,
12565     Arm_address address,
12566     section_size_type view_size)
12567 {
12568   Relocate relocate;
12569   const Stub_template* stub_template = stub->stub_template();
12570   for (size_t i = 0; i < stub_template->reloc_count(); i++)
12571     {
12572       size_t reloc_insn_index = stub_template->reloc_insn_index(i);
12573       const Insn_template* insn = &stub_template->insns()[reloc_insn_index];
12574
12575       unsigned int r_type = insn->r_type();
12576       section_size_type reloc_offset = stub_template->reloc_offset(i);
12577       section_size_type reloc_size = insn->size();
12578       gold_assert(reloc_offset + reloc_size <= view_size);
12579
12580       // This is the address of the stub destination.
12581       Arm_address target = stub->reloc_target(i) + insn->reloc_addend();
12582       Symbol_value<32> symval;
12583       symval.set_output_value(target);
12584
12585       // Synthesize a fake reloc just in case.  We don't have a symbol so
12586       // we use 0.
12587       unsigned char reloc_buffer[elfcpp::Elf_sizes<32>::rel_size];
12588       memset(reloc_buffer, 0, sizeof(reloc_buffer));
12589       elfcpp::Rel_write<32, big_endian> reloc_write(reloc_buffer);
12590       reloc_write.put_r_offset(reloc_offset);
12591       reloc_write.put_r_info(elfcpp::elf_r_info<32>(0, r_type));
12592
12593       relocate.relocate(relinfo, elfcpp::SHT_REL, this, output_section,
12594                         this->fake_relnum_for_stubs, reloc_buffer,
12595                         NULL, &symval, view + reloc_offset,
12596                         address + reloc_offset, reloc_size);
12597     }
12598 }
12599
12600 // Determine whether an object attribute tag takes an integer, a
12601 // string or both.
12602
12603 template<bool big_endian>
12604 int
12605 Target_arm<big_endian>::do_attribute_arg_type(int tag) const
12606 {
12607   if (tag == Object_attribute::Tag_compatibility)
12608     return (Object_attribute::ATTR_TYPE_FLAG_INT_VAL
12609             | Object_attribute::ATTR_TYPE_FLAG_STR_VAL);
12610   else if (tag == elfcpp::Tag_nodefaults)
12611     return (Object_attribute::ATTR_TYPE_FLAG_INT_VAL
12612             | Object_attribute::ATTR_TYPE_FLAG_NO_DEFAULT);
12613   else if (tag == elfcpp::Tag_CPU_raw_name || tag == elfcpp::Tag_CPU_name)
12614     return Object_attribute::ATTR_TYPE_FLAG_STR_VAL;
12615   else if (tag < 32)
12616     return Object_attribute::ATTR_TYPE_FLAG_INT_VAL;
12617   else
12618     return ((tag & 1) != 0
12619             ? Object_attribute::ATTR_TYPE_FLAG_STR_VAL
12620             : Object_attribute::ATTR_TYPE_FLAG_INT_VAL);
12621 }
12622
12623 // Reorder attributes.
12624 //
12625 // The ABI defines that Tag_conformance should be emitted first, and that
12626 // Tag_nodefaults should be second (if either is defined).  This sets those
12627 // two positions, and bumps up the position of all the remaining tags to
12628 // compensate.
12629
12630 template<bool big_endian>
12631 int
12632 Target_arm<big_endian>::do_attributes_order(int num) const
12633 {
12634   // Reorder the known object attributes in output.  We want to move
12635   // Tag_conformance to position 4 and Tag_conformance to position 5
12636   // and shift everything between 4 .. Tag_conformance - 1 to make room.
12637   if (num == 4)
12638     return elfcpp::Tag_conformance;
12639   if (num == 5)
12640     return elfcpp::Tag_nodefaults;
12641   if ((num - 2) < elfcpp::Tag_nodefaults)
12642     return num - 2;
12643   if ((num - 1) < elfcpp::Tag_conformance)
12644     return num - 1;
12645   return num;
12646 }
12647
12648 // Scan a span of THUMB code for Cortex-A8 erratum.
12649
12650 template<bool big_endian>
12651 void
12652 Target_arm<big_endian>::scan_span_for_cortex_a8_erratum(
12653     Arm_relobj<big_endian>* arm_relobj,
12654     unsigned int shndx,
12655     section_size_type span_start,
12656     section_size_type span_end,
12657     const unsigned char* view,
12658     Arm_address address)
12659 {
12660   // Scan for 32-bit Thumb-2 branches which span two 4K regions, where:
12661   //
12662   // The opcode is BLX.W, BL.W, B.W, Bcc.W
12663   // The branch target is in the same 4KB region as the
12664   // first half of the branch.
12665   // The instruction before the branch is a 32-bit
12666   // length non-branch instruction.
12667   section_size_type i = span_start;
12668   bool last_was_32bit = false;
12669   bool last_was_branch = false;
12670   while (i < span_end)
12671     {
12672       typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
12673       const Valtype* wv = reinterpret_cast<const Valtype*>(view + i);
12674       uint32_t insn = elfcpp::Swap<16, big_endian>::readval(wv);
12675       bool is_blx = false, is_b = false;
12676       bool is_bl = false, is_bcc = false;
12677
12678       bool insn_32bit = (insn & 0xe000) == 0xe000 && (insn & 0x1800) != 0x0000;
12679       if (insn_32bit)
12680         {
12681           // Load the rest of the insn (in manual-friendly order).
12682           insn = (insn << 16) | elfcpp::Swap<16, big_endian>::readval(wv + 1);
12683
12684           // Encoding T4: B<c>.W.
12685           is_b = (insn & 0xf800d000U) == 0xf0009000U;
12686           // Encoding T1: BL<c>.W.
12687           is_bl = (insn & 0xf800d000U) == 0xf000d000U;
12688           // Encoding T2: BLX<c>.W.
12689           is_blx = (insn & 0xf800d000U) == 0xf000c000U;
12690           // Encoding T3: B<c>.W (not permitted in IT block).
12691           is_bcc = ((insn & 0xf800d000U) == 0xf0008000U
12692                     && (insn & 0x07f00000U) != 0x03800000U);
12693         }
12694
12695       bool is_32bit_branch = is_b || is_bl || is_blx || is_bcc;
12696
12697       // If this instruction is a 32-bit THUMB branch that crosses a 4K
12698       // page boundary and it follows 32-bit non-branch instruction,
12699       // we need to work around.
12700       if (is_32bit_branch
12701           && ((address + i) & 0xfffU) == 0xffeU
12702           && last_was_32bit
12703           && !last_was_branch)
12704         {
12705           // Check to see if there is a relocation stub for this branch.
12706           bool force_target_arm = false;
12707           bool force_target_thumb = false;
12708           const Cortex_a8_reloc* cortex_a8_reloc = NULL;
12709           Cortex_a8_relocs_info::const_iterator p =
12710             this->cortex_a8_relocs_info_.find(address + i);
12711
12712           if (p != this->cortex_a8_relocs_info_.end())
12713             {
12714               cortex_a8_reloc = p->second;
12715               bool target_is_thumb = (cortex_a8_reloc->destination() & 1) != 0;
12716
12717               if (cortex_a8_reloc->r_type() == elfcpp::R_ARM_THM_CALL
12718                   && !target_is_thumb)
12719                 force_target_arm = true;
12720               else if (cortex_a8_reloc->r_type() == elfcpp::R_ARM_THM_CALL
12721                        && target_is_thumb)
12722                 force_target_thumb = true;
12723             }
12724
12725           off_t offset;
12726           Stub_type stub_type = arm_stub_none;
12727
12728           // Check if we have an offending branch instruction.
12729           uint16_t upper_insn = (insn >> 16) & 0xffffU;
12730           uint16_t lower_insn = insn & 0xffffU;
12731           typedef class Arm_relocate_functions<big_endian> RelocFuncs;
12732
12733           if (cortex_a8_reloc != NULL
12734               && cortex_a8_reloc->reloc_stub() != NULL)
12735             // We've already made a stub for this instruction, e.g.
12736             // it's a long branch or a Thumb->ARM stub.  Assume that
12737             // stub will suffice to work around the A8 erratum (see
12738             // setting of always_after_branch above).
12739             ;
12740           else if (is_bcc)
12741             {
12742               offset = RelocFuncs::thumb32_cond_branch_offset(upper_insn,
12743                                                               lower_insn);
12744               stub_type = arm_stub_a8_veneer_b_cond;
12745             }
12746           else if (is_b || is_bl || is_blx)
12747             {
12748               offset = RelocFuncs::thumb32_branch_offset(upper_insn,
12749                                                          lower_insn);
12750               if (is_blx)
12751                 offset &= ~3;
12752
12753               stub_type = (is_blx
12754                            ? arm_stub_a8_veneer_blx
12755                            : (is_bl
12756                               ? arm_stub_a8_veneer_bl
12757                               : arm_stub_a8_veneer_b));
12758             }
12759
12760           if (stub_type != arm_stub_none)
12761             {
12762               Arm_address pc_for_insn = address + i + 4;
12763
12764               // The original instruction is a BL, but the target is
12765               // an ARM instruction.  If we were not making a stub,
12766               // the BL would have been converted to a BLX.  Use the
12767               // BLX stub instead in that case.
12768               if (this->may_use_v5t_interworking() && force_target_arm
12769                   && stub_type == arm_stub_a8_veneer_bl)
12770                 {
12771                   stub_type = arm_stub_a8_veneer_blx;
12772                   is_blx = true;
12773                   is_bl = false;
12774                 }
12775               // Conversely, if the original instruction was
12776               // BLX but the target is Thumb mode, use the BL stub.
12777               else if (force_target_thumb
12778                        && stub_type == arm_stub_a8_veneer_blx)
12779                 {
12780                   stub_type = arm_stub_a8_veneer_bl;
12781                   is_blx = false;
12782                   is_bl = true;
12783                 }
12784
12785               if (is_blx)
12786                 pc_for_insn &= ~3;
12787
12788               // If we found a relocation, use the proper destination,
12789               // not the offset in the (unrelocated) instruction.
12790               // Note this is always done if we switched the stub type above.
12791               if (cortex_a8_reloc != NULL)
12792                 offset = (off_t) (cortex_a8_reloc->destination() - pc_for_insn);
12793
12794               Arm_address target = (pc_for_insn + offset) | (is_blx ? 0 : 1);
12795
12796               // Add a new stub if destination address is in the same page.
12797               if (((address + i) & ~0xfffU) == (target & ~0xfffU))
12798                 {
12799                   Cortex_a8_stub* stub =
12800                     this->stub_factory_.make_cortex_a8_stub(stub_type,
12801                                                             arm_relobj, shndx,
12802                                                             address + i,
12803                                                             target, insn);
12804                   Stub_table<big_endian>* stub_table =
12805                     arm_relobj->stub_table(shndx);
12806                   gold_assert(stub_table != NULL);
12807                   stub_table->add_cortex_a8_stub(address + i, stub);
12808                 }
12809             }
12810         }
12811
12812       i += insn_32bit ? 4 : 2;
12813       last_was_32bit = insn_32bit;
12814       last_was_branch = is_32bit_branch;
12815     }
12816 }
12817
12818 // Apply the Cortex-A8 workaround.
12819
12820 template<bool big_endian>
12821 void
12822 Target_arm<big_endian>::apply_cortex_a8_workaround(
12823     const Cortex_a8_stub* stub,
12824     Arm_address stub_address,
12825     unsigned char* insn_view,
12826     Arm_address insn_address)
12827 {
12828   typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
12829   Valtype* wv = reinterpret_cast<Valtype*>(insn_view);
12830   Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
12831   Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
12832   off_t branch_offset = stub_address - (insn_address + 4);
12833
12834   typedef class Arm_relocate_functions<big_endian> RelocFuncs;
12835   switch (stub->stub_template()->type())
12836     {
12837     case arm_stub_a8_veneer_b_cond:
12838       // For a conditional branch, we re-write it to be an unconditional
12839       // branch to the stub.  We use the THUMB-2 encoding here.
12840       upper_insn = 0xf000U;
12841       lower_insn = 0xb800U;
12842       // Fall through.
12843     case arm_stub_a8_veneer_b:
12844     case arm_stub_a8_veneer_bl:
12845     case arm_stub_a8_veneer_blx:
12846       if ((lower_insn & 0x5000U) == 0x4000U)
12847         // For a BLX instruction, make sure that the relocation is
12848         // rounded up to a word boundary.  This follows the semantics of
12849         // the instruction which specifies that bit 1 of the target
12850         // address will come from bit 1 of the base address.
12851         branch_offset = (branch_offset + 2) & ~3;
12852
12853       // Put BRANCH_OFFSET back into the insn.
12854       gold_assert(!Bits<25>::has_overflow32(branch_offset));
12855       upper_insn = RelocFuncs::thumb32_branch_upper(upper_insn, branch_offset);
12856       lower_insn = RelocFuncs::thumb32_branch_lower(lower_insn, branch_offset);
12857       break;
12858
12859     default:
12860       gold_unreachable();
12861     }
12862
12863   // Put the relocated value back in the object file:
12864   elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
12865   elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
12866 }
12867
12868 // Target selector for ARM.  Note this is never instantiated directly.
12869 // It's only used in Target_selector_arm_nacl, below.
12870
12871 template<bool big_endian>
12872 class Target_selector_arm : public Target_selector
12873 {
12874  public:
12875   Target_selector_arm()
12876     : Target_selector(elfcpp::EM_ARM, 32, big_endian,
12877                       (big_endian ? "elf32-bigarm" : "elf32-littlearm"),
12878                       (big_endian ? "armelfb" : "armelf"))
12879   { }
12880
12881   Target*
12882   do_instantiate_target()
12883   { return new Target_arm<big_endian>(); }
12884 };
12885
12886 // Fix .ARM.exidx section coverage.
12887
12888 template<bool big_endian>
12889 void
12890 Target_arm<big_endian>::fix_exidx_coverage(
12891     Layout* layout,
12892     const Input_objects* input_objects,
12893     Arm_output_section<big_endian>* exidx_section,
12894     Symbol_table* symtab,
12895     const Task* task)
12896 {
12897   // We need to look at all the input sections in output in ascending
12898   // order of output address.  We do that by building a sorted list
12899   // of output sections by addresses.  Then we looks at the output sections
12900   // in order.  The input sections in an output section are already sorted
12901   // by addresses within the output section.
12902
12903   typedef std::set<Output_section*, output_section_address_less_than>
12904       Sorted_output_section_list;
12905   Sorted_output_section_list sorted_output_sections;
12906
12907   // Find out all the output sections of input sections pointed by
12908   // EXIDX input sections.
12909   for (Input_objects::Relobj_iterator p = input_objects->relobj_begin();
12910        p != input_objects->relobj_end();
12911        ++p)
12912     {
12913       Arm_relobj<big_endian>* arm_relobj =
12914         Arm_relobj<big_endian>::as_arm_relobj(*p);
12915       std::vector<unsigned int> shndx_list;
12916       arm_relobj->get_exidx_shndx_list(&shndx_list);
12917       for (size_t i = 0; i < shndx_list.size(); ++i)
12918         {
12919           const Arm_exidx_input_section* exidx_input_section =
12920             arm_relobj->exidx_input_section_by_shndx(shndx_list[i]);
12921           gold_assert(exidx_input_section != NULL);
12922           if (!exidx_input_section->has_errors())
12923             {
12924               unsigned int text_shndx = exidx_input_section->link();
12925               Output_section* os = arm_relobj->output_section(text_shndx);
12926               if (os != NULL && (os->flags() & elfcpp::SHF_ALLOC) != 0)
12927                 sorted_output_sections.insert(os);
12928             }
12929         }
12930     }
12931
12932   // Go over the output sections in ascending order of output addresses.
12933   typedef typename Arm_output_section<big_endian>::Text_section_list
12934       Text_section_list;
12935   Text_section_list sorted_text_sections;
12936   for (typename Sorted_output_section_list::iterator p =
12937         sorted_output_sections.begin();
12938       p != sorted_output_sections.end();
12939       ++p)
12940     {
12941       Arm_output_section<big_endian>* arm_output_section =
12942         Arm_output_section<big_endian>::as_arm_output_section(*p);
12943       arm_output_section->append_text_sections_to_list(&sorted_text_sections);
12944     }
12945
12946   exidx_section->fix_exidx_coverage(layout, sorted_text_sections, symtab,
12947                                     merge_exidx_entries(), task);
12948 }
12949
12950 template<bool big_endian>
12951 void
12952 Target_arm<big_endian>::do_define_standard_symbols(
12953     Symbol_table* symtab,
12954     Layout* layout)
12955 {
12956   // Handle the .ARM.exidx section.
12957   Output_section* exidx_section = layout->find_output_section(".ARM.exidx");
12958
12959   if (exidx_section != NULL)
12960     {
12961       // Create __exidx_start and __exidx_end symbols.
12962       symtab->define_in_output_data("__exidx_start",
12963                                     NULL, // version
12964                                     Symbol_table::PREDEFINED,
12965                                     exidx_section,
12966                                     0, // value
12967                                     0, // symsize
12968                                     elfcpp::STT_NOTYPE,
12969                                     elfcpp::STB_GLOBAL,
12970                                     elfcpp::STV_HIDDEN,
12971                                     0, // nonvis
12972                                     false, // offset_is_from_end
12973                                     true); // only_if_ref
12974
12975       symtab->define_in_output_data("__exidx_end",
12976                                     NULL, // version
12977                                     Symbol_table::PREDEFINED,
12978                                     exidx_section,
12979                                     0, // value
12980                                     0, // symsize
12981                                     elfcpp::STT_NOTYPE,
12982                                     elfcpp::STB_GLOBAL,
12983                                     elfcpp::STV_HIDDEN,
12984                                     0, // nonvis
12985                                     true, // offset_is_from_end
12986                                     true); // only_if_ref
12987     }
12988   else
12989     {
12990       // Define __exidx_start and __exidx_end even when .ARM.exidx
12991       // section is missing to match ld's behaviour.
12992       symtab->define_as_constant("__exidx_start", NULL,
12993                                  Symbol_table::PREDEFINED,
12994                                  0, 0, elfcpp::STT_OBJECT,
12995                                  elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
12996                                  true, false);
12997       symtab->define_as_constant("__exidx_end", NULL,
12998                                  Symbol_table::PREDEFINED,
12999                                  0, 0, elfcpp::STT_OBJECT,
13000                                  elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
13001                                  true, false);
13002     }
13003 }
13004
13005 // NaCl variant.  It uses different PLT contents.
13006
13007 template<bool big_endian>
13008 class Output_data_plt_arm_nacl;
13009
13010 template<bool big_endian>
13011 class Target_arm_nacl : public Target_arm<big_endian>
13012 {
13013  public:
13014   Target_arm_nacl()
13015     : Target_arm<big_endian>(&arm_nacl_info)
13016   { }
13017
13018  protected:
13019   virtual Output_data_plt_arm<big_endian>*
13020   do_make_data_plt(
13021                    Layout* layout,
13022                    Arm_output_data_got<big_endian>* got,
13023                    Output_data_space* got_plt,
13024                    Output_data_space* got_irelative)
13025   { return new Output_data_plt_arm_nacl<big_endian>(
13026       layout, got, got_plt, got_irelative); }
13027
13028  private:
13029   static const Target::Target_info arm_nacl_info;
13030 };
13031
13032 template<bool big_endian>
13033 const Target::Target_info Target_arm_nacl<big_endian>::arm_nacl_info =
13034 {
13035   32,                   // size
13036   big_endian,           // is_big_endian
13037   elfcpp::EM_ARM,       // machine_code
13038   false,                // has_make_symbol
13039   false,                // has_resolve
13040   false,                // has_code_fill
13041   true,                 // is_default_stack_executable
13042   false,                // can_icf_inline_merge_sections
13043   '\0',                 // wrap_char
13044   "/lib/ld-nacl-arm.so.1", // dynamic_linker
13045   0x20000,              // default_text_segment_address
13046   0x10000,              // abi_pagesize (overridable by -z max-page-size)
13047   0x10000,              // common_pagesize (overridable by -z common-page-size)
13048   true,                 // isolate_execinstr
13049   0x10000000,           // rosegment_gap
13050   elfcpp::SHN_UNDEF,    // small_common_shndx
13051   elfcpp::SHN_UNDEF,    // large_common_shndx
13052   0,                    // small_common_section_flags
13053   0,                    // large_common_section_flags
13054   ".ARM.attributes",    // attributes_section
13055   "aeabi",              // attributes_vendor
13056   "_start",             // entry_symbol_name
13057   32,                   // hash_entry_size
13058   elfcpp::SHT_PROGBITS, // unwind_section_type
13059 };
13060
13061 template<bool big_endian>
13062 class Output_data_plt_arm_nacl : public Output_data_plt_arm<big_endian>
13063 {
13064  public:
13065   Output_data_plt_arm_nacl(
13066       Layout* layout,
13067       Arm_output_data_got<big_endian>* got,
13068       Output_data_space* got_plt,
13069       Output_data_space* got_irelative)
13070     : Output_data_plt_arm<big_endian>(layout, 16, got, got_plt, got_irelative)
13071   { }
13072
13073  protected:
13074   // Return the offset of the first non-reserved PLT entry.
13075   virtual unsigned int
13076   do_first_plt_entry_offset() const
13077   { return sizeof(first_plt_entry); }
13078
13079   // Return the size of a PLT entry.
13080   virtual unsigned int
13081   do_get_plt_entry_size() const
13082   { return sizeof(plt_entry); }
13083
13084   virtual void
13085   do_fill_first_plt_entry(unsigned char* pov,
13086                           Arm_address got_address,
13087                           Arm_address plt_address);
13088
13089   virtual void
13090   do_fill_plt_entry(unsigned char* pov,
13091                     Arm_address got_address,
13092                     Arm_address plt_address,
13093                     unsigned int got_offset,
13094                     unsigned int plt_offset);
13095
13096  private:
13097   inline uint32_t arm_movw_immediate(uint32_t value)
13098   {
13099     return (value & 0x00000fff) | ((value & 0x0000f000) << 4);
13100   }
13101
13102   inline uint32_t arm_movt_immediate(uint32_t value)
13103   {
13104     return ((value & 0x0fff0000) >> 16) | ((value & 0xf0000000) >> 12);
13105   }
13106
13107   // Template for the first PLT entry.
13108   static const uint32_t first_plt_entry[16];
13109
13110   // Template for subsequent PLT entries.
13111   static const uint32_t plt_entry[4];
13112 };
13113
13114 // The first entry in the PLT.
13115 template<bool big_endian>
13116 const uint32_t Output_data_plt_arm_nacl<big_endian>::first_plt_entry[16] =
13117 {
13118   // First bundle:
13119   0xe300c000,                           // movw ip, #:lower16:&GOT[2]-.+8
13120   0xe340c000,                           // movt ip, #:upper16:&GOT[2]-.+8
13121   0xe08cc00f,                           // add  ip, ip, pc
13122   0xe52dc008,                           // str  ip, [sp, #-8]!
13123   // Second bundle:
13124   0xe3ccc103,                           // bic  ip, ip, #0xc0000000
13125   0xe59cc000,                           // ldr  ip, [ip]
13126   0xe3ccc13f,                           // bic  ip, ip, #0xc000000f
13127   0xe12fff1c,                           // bx   ip
13128   // Third bundle:
13129   0xe320f000,                           // nop
13130   0xe320f000,                           // nop
13131   0xe320f000,                           // nop
13132   // .Lplt_tail:
13133   0xe50dc004,                           // str  ip, [sp, #-4]
13134   // Fourth bundle:
13135   0xe3ccc103,                           // bic  ip, ip, #0xc0000000
13136   0xe59cc000,                           // ldr  ip, [ip]
13137   0xe3ccc13f,                           // bic  ip, ip, #0xc000000f
13138   0xe12fff1c,                           // bx   ip
13139 };
13140
13141 template<bool big_endian>
13142 void
13143 Output_data_plt_arm_nacl<big_endian>::do_fill_first_plt_entry(
13144     unsigned char* pov,
13145     Arm_address got_address,
13146     Arm_address plt_address)
13147 {
13148   // Write first PLT entry.  All but first two words are constants.
13149   const size_t num_first_plt_words = (sizeof(first_plt_entry)
13150                                       / sizeof(first_plt_entry[0]));
13151
13152   int32_t got_displacement = got_address + 8 - (plt_address + 16);
13153
13154   elfcpp::Swap<32, big_endian>::writeval
13155     (pov + 0, first_plt_entry[0] | arm_movw_immediate (got_displacement));
13156   elfcpp::Swap<32, big_endian>::writeval
13157     (pov + 4, first_plt_entry[1] | arm_movt_immediate (got_displacement));
13158
13159   for (size_t i = 2; i < num_first_plt_words; ++i)
13160     elfcpp::Swap<32, big_endian>::writeval(pov + i * 4, first_plt_entry[i]);
13161 }
13162
13163 // Subsequent entries in the PLT.
13164
13165 template<bool big_endian>
13166 const uint32_t Output_data_plt_arm_nacl<big_endian>::plt_entry[4] =
13167 {
13168   0xe300c000,                           // movw ip, #:lower16:&GOT[n]-.+8
13169   0xe340c000,                           // movt ip, #:upper16:&GOT[n]-.+8
13170   0xe08cc00f,                           // add  ip, ip, pc
13171   0xea000000,                           // b    .Lplt_tail
13172 };
13173
13174 template<bool big_endian>
13175 void
13176 Output_data_plt_arm_nacl<big_endian>::do_fill_plt_entry(
13177     unsigned char* pov,
13178     Arm_address got_address,
13179     Arm_address plt_address,
13180     unsigned int got_offset,
13181     unsigned int plt_offset)
13182 {
13183   // Calculate the displacement between the PLT slot and the
13184   // common tail that's part of the special initial PLT slot.
13185   int32_t tail_displacement = (plt_address + (11 * sizeof(uint32_t))
13186                                - (plt_address + plt_offset
13187                                   + sizeof(plt_entry) + sizeof(uint32_t)));
13188   gold_assert((tail_displacement & 3) == 0);
13189   tail_displacement >>= 2;
13190
13191   gold_assert ((tail_displacement & 0xff000000) == 0
13192                || (-tail_displacement & 0xff000000) == 0);
13193
13194   // Calculate the displacement between the PLT slot and the entry
13195   // in the GOT.  The offset accounts for the value produced by
13196   // adding to pc in the penultimate instruction of the PLT stub.
13197   const int32_t got_displacement = (got_address + got_offset
13198                                     - (plt_address + sizeof(plt_entry)));
13199
13200   elfcpp::Swap<32, big_endian>::writeval
13201     (pov + 0, plt_entry[0] | arm_movw_immediate (got_displacement));
13202   elfcpp::Swap<32, big_endian>::writeval
13203     (pov + 4, plt_entry[1] | arm_movt_immediate (got_displacement));
13204   elfcpp::Swap<32, big_endian>::writeval
13205     (pov + 8, plt_entry[2]);
13206   elfcpp::Swap<32, big_endian>::writeval
13207     (pov + 12, plt_entry[3] | (tail_displacement & 0x00ffffff));
13208 }
13209
13210 // Target selectors.
13211
13212 template<bool big_endian>
13213 class Target_selector_arm_nacl
13214   : public Target_selector_nacl<Target_selector_arm<big_endian>,
13215                                 Target_arm_nacl<big_endian> >
13216 {
13217  public:
13218   Target_selector_arm_nacl()
13219     : Target_selector_nacl<Target_selector_arm<big_endian>,
13220                            Target_arm_nacl<big_endian> >(
13221           "arm",
13222           big_endian ? "elf32-bigarm-nacl" : "elf32-littlearm-nacl",
13223           big_endian ? "armelfb_nacl" : "armelf_nacl")
13224   { }
13225 };
13226
13227 Target_selector_arm_nacl<false> target_selector_arm;
13228 Target_selector_arm_nacl<true> target_selector_armbe;
13229
13230 } // End anonymous namespace.