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