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