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