* layout.cc (Layout::Layout): Initialize increase_relro_.
[external/binutils.git] / gold / arm.cc
1 // arm.cc -- arm target support for gold.
2
3 // Copyright 2009 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
34 #include "elfcpp.h"
35 #include "parameters.h"
36 #include "reloc.h"
37 #include "arm.h"
38 #include "object.h"
39 #include "symtab.h"
40 #include "layout.h"
41 #include "output.h"
42 #include "copy-relocs.h"
43 #include "target.h"
44 #include "target-reloc.h"
45 #include "target-select.h"
46 #include "tls.h"
47 #include "defstd.h"
48 #include "gc.h"
49 #include "attributes.h"
50
51 namespace
52 {
53
54 using namespace gold;
55
56 template<bool big_endian>
57 class Output_data_plt_arm;
58
59 template<bool big_endian>
60 class Stub_table;
61
62 template<bool big_endian>
63 class Arm_input_section;
64
65 template<bool big_endian>
66 class Arm_output_section;
67
68 template<bool big_endian>
69 class Arm_relobj;
70
71 template<bool big_endian>
72 class Target_arm;
73
74 // For convenience.
75 typedef elfcpp::Elf_types<32>::Elf_Addr Arm_address;
76
77 // Maximum branch offsets for ARM, THUMB and THUMB2.
78 const int32_t ARM_MAX_FWD_BRANCH_OFFSET = ((((1 << 23) - 1) << 2) + 8);
79 const int32_t ARM_MAX_BWD_BRANCH_OFFSET = ((-((1 << 23) << 2)) + 8);
80 const int32_t THM_MAX_FWD_BRANCH_OFFSET = ((1 << 22) -2 + 4);
81 const int32_t THM_MAX_BWD_BRANCH_OFFSET = (-(1 << 22) + 4);
82 const int32_t THM2_MAX_FWD_BRANCH_OFFSET = (((1 << 24) - 2) + 4);
83 const int32_t THM2_MAX_BWD_BRANCH_OFFSET = (-(1 << 24) + 4);
84
85 // The arm target class.
86 //
87 // This is a very simple port of gold for ARM-EABI.  It is intended for
88 // supporting Android only for the time being.  Only these relocation types
89 // are supported.
90 //
91 // R_ARM_NONE
92 // R_ARM_ABS32
93 // R_ARM_ABS32_NOI
94 // R_ARM_ABS16
95 // R_ARM_ABS12
96 // R_ARM_ABS8
97 // R_ARM_THM_ABS5
98 // R_ARM_BASE_ABS
99 // R_ARM_REL32
100 // R_ARM_THM_CALL
101 // R_ARM_COPY
102 // R_ARM_GLOB_DAT
103 // R_ARM_BASE_PREL
104 // R_ARM_JUMP_SLOT
105 // R_ARM_RELATIVE
106 // R_ARM_GOTOFF32
107 // R_ARM_GOT_BREL
108 // R_ARM_GOT_PREL
109 // R_ARM_PLT32
110 // R_ARM_CALL
111 // R_ARM_JUMP24
112 // R_ARM_TARGET1
113 // R_ARM_PREL31
114 // R_ARM_ABS8
115 // R_ARM_MOVW_ABS_NC
116 // R_ARM_MOVT_ABS
117 // R_ARM_THM_MOVW_ABS_NC
118 // R_ARM_THM_MOVT_ABS
119 // R_ARM_MOVW_PREL_NC
120 // R_ARM_MOVT_PREL
121 // R_ARM_THM_MOVW_PREL_NC
122 // R_ARM_THM_MOVT_PREL
123 // 
124 // TODOs:
125 // - Support more relocation types as needed. 
126 // - Make PLTs more flexible for different architecture features like
127 //   Thumb-2 and BE8.
128 // There are probably a lot more.
129
130 // Instruction template class.  This class is similar to the insn_sequence
131 // struct in bfd/elf32-arm.c.
132
133 class Insn_template
134 {
135  public:
136   // Types of instruction templates.
137   enum Type
138     {
139       THUMB16_TYPE = 1,
140       THUMB32_TYPE,
141       ARM_TYPE,
142       DATA_TYPE
143     };
144
145   // Factory methods to create instrunction templates in different formats.
146
147   static const Insn_template
148   thumb16_insn(uint32_t data)
149   { return Insn_template(data, THUMB16_TYPE, elfcpp::R_ARM_NONE, 0); } 
150
151   // A bit of a hack.  A Thumb conditional branch, in which the proper
152   // condition is inserted when we build the stub.
153   static const Insn_template
154   thumb16_bcond_insn(uint32_t data)
155   { return Insn_template(data, THUMB16_TYPE, elfcpp::R_ARM_NONE, 1); } 
156
157   static const Insn_template
158   thumb32_insn(uint32_t data)
159   { return Insn_template(data, THUMB32_TYPE, elfcpp::R_ARM_NONE, 0); } 
160
161   static const Insn_template
162   thumb32_b_insn(uint32_t data, int reloc_addend)
163   {
164     return Insn_template(data, THUMB32_TYPE, elfcpp::R_ARM_THM_JUMP24,
165                          reloc_addend);
166   } 
167
168   static const Insn_template
169   arm_insn(uint32_t data)
170   { return Insn_template(data, ARM_TYPE, elfcpp::R_ARM_NONE, 0); }
171
172   static const Insn_template
173   arm_rel_insn(unsigned data, int reloc_addend)
174   { return Insn_template(data, ARM_TYPE, elfcpp::R_ARM_JUMP24, reloc_addend); }
175
176   static const Insn_template
177   data_word(unsigned data, unsigned int r_type, int reloc_addend)
178   { return Insn_template(data, DATA_TYPE, r_type, reloc_addend); } 
179
180   // Accessors.  This class is used for read-only objects so no modifiers
181   // are provided.
182
183   uint32_t
184   data() const
185   { return this->data_; }
186
187   // Return the instruction sequence type of this.
188   Type
189   type() const
190   { return this->type_; }
191
192   // Return the ARM relocation type of this.
193   unsigned int
194   r_type() const
195   { return this->r_type_; }
196
197   int32_t
198   reloc_addend() const
199   { return this->reloc_addend_; }
200
201   // Return size of instrunction template in bytes.
202   size_t
203   size() const;
204
205   // Return byte-alignment of instrunction template.
206   unsigned
207   alignment() const;
208
209  private:
210   // We make the constructor private to ensure that only the factory
211   // methods are used.
212   inline
213   Insn_template(unsigned data, Type type, unsigned int r_type, int reloc_addend)
214     : data_(data), type_(type), r_type_(r_type), reloc_addend_(reloc_addend)
215   { }
216
217   // Instruction specific data.  This is used to store information like
218   // some of the instruction bits.
219   uint32_t data_;
220   // Instruction template type.
221   Type type_;
222   // Relocation type if there is a relocation or R_ARM_NONE otherwise.
223   unsigned int r_type_;
224   // Relocation addend.
225   int32_t reloc_addend_;
226 };
227
228 // Macro for generating code to stub types. One entry per long/short
229 // branch stub
230
231 #define DEF_STUBS \
232   DEF_STUB(long_branch_any_any) \
233   DEF_STUB(long_branch_v4t_arm_thumb) \
234   DEF_STUB(long_branch_thumb_only) \
235   DEF_STUB(long_branch_v4t_thumb_thumb) \
236   DEF_STUB(long_branch_v4t_thumb_arm) \
237   DEF_STUB(short_branch_v4t_thumb_arm) \
238   DEF_STUB(long_branch_any_arm_pic) \
239   DEF_STUB(long_branch_any_thumb_pic) \
240   DEF_STUB(long_branch_v4t_thumb_thumb_pic) \
241   DEF_STUB(long_branch_v4t_arm_thumb_pic) \
242   DEF_STUB(long_branch_v4t_thumb_arm_pic) \
243   DEF_STUB(long_branch_thumb_only_pic) \
244   DEF_STUB(a8_veneer_b_cond) \
245   DEF_STUB(a8_veneer_b) \
246   DEF_STUB(a8_veneer_bl) \
247   DEF_STUB(a8_veneer_blx)
248
249 // Stub types.
250
251 #define DEF_STUB(x) arm_stub_##x,
252 typedef enum
253   {
254     arm_stub_none,
255     DEF_STUBS
256
257     // First reloc stub type.
258     arm_stub_reloc_first = arm_stub_long_branch_any_any,
259     // Last  reloc stub type.
260     arm_stub_reloc_last = arm_stub_long_branch_thumb_only_pic,
261
262     // First Cortex-A8 stub type.
263     arm_stub_cortex_a8_first = arm_stub_a8_veneer_b_cond,
264     // Last Cortex-A8 stub type.
265     arm_stub_cortex_a8_last = arm_stub_a8_veneer_blx,
266     
267     // Last stub type.
268     arm_stub_type_last = arm_stub_a8_veneer_blx
269   } Stub_type;
270 #undef DEF_STUB
271
272 // Stub template class.  Templates are meant to be read-only objects.
273 // A stub template for a stub type contains all read-only attributes
274 // common to all stubs of the same type.
275
276 class Stub_template
277 {
278  public:
279   Stub_template(Stub_type, const Insn_template*, size_t);
280
281   ~Stub_template()
282   { }
283
284   // Return stub type.
285   Stub_type
286   type() const
287   { return this->type_; }
288
289   // Return an array of instruction templates.
290   const Insn_template*
291   insns() const
292   { return this->insns_; }
293
294   // Return size of template in number of instructions.
295   size_t
296   insn_count() const
297   { return this->insn_count_; }
298
299   // Return size of template in bytes.
300   size_t
301   size() const
302   { return this->size_; }
303
304   // Return alignment of the stub template.
305   unsigned
306   alignment() const
307   { return this->alignment_; }
308   
309   // Return whether entry point is in thumb mode.
310   bool
311   entry_in_thumb_mode() const
312   { return this->entry_in_thumb_mode_; }
313
314   // Return number of relocations in this template.
315   size_t
316   reloc_count() const
317   { return this->relocs_.size(); }
318
319   // Return index of the I-th instruction with relocation.
320   size_t
321   reloc_insn_index(size_t i) const
322   {
323     gold_assert(i < this->relocs_.size());
324     return this->relocs_[i].first;
325   }
326
327   // Return the offset of the I-th instruction with relocation from the
328   // beginning of the stub.
329   section_size_type
330   reloc_offset(size_t i) const
331   {
332     gold_assert(i < this->relocs_.size());
333     return this->relocs_[i].second;
334   }
335
336  private:
337   // This contains information about an instruction template with a relocation
338   // and its offset from start of stub.
339   typedef std::pair<size_t, section_size_type> Reloc;
340
341   // A Stub_template may not be copied.  We want to share templates as much
342   // as possible.
343   Stub_template(const Stub_template&);
344   Stub_template& operator=(const Stub_template&);
345   
346   // Stub type.
347   Stub_type type_;
348   // Points to an array of Insn_templates.
349   const Insn_template* insns_;
350   // Number of Insn_templates in insns_[].
351   size_t insn_count_;
352   // Size of templated instructions in bytes.
353   size_t size_;
354   // Alignment of templated instructions.
355   unsigned alignment_;
356   // Flag to indicate if entry is in thumb mode.
357   bool entry_in_thumb_mode_;
358   // A table of reloc instruction indices and offsets.  We can find these by
359   // looking at the instruction templates but we pre-compute and then stash
360   // them here for speed. 
361   std::vector<Reloc> relocs_;
362 };
363
364 //
365 // A class for code stubs.  This is a base class for different type of
366 // stubs used in the ARM target.
367 //
368
369 class Stub
370 {
371  private:
372   static const section_offset_type invalid_offset =
373     static_cast<section_offset_type>(-1);
374
375  public:
376   Stub(const Stub_template* stub_template)
377     : stub_template_(stub_template), offset_(invalid_offset)
378   { }
379
380   virtual
381    ~Stub()
382   { }
383
384   // Return the stub template.
385   const Stub_template*
386   stub_template() const
387   { return this->stub_template_; }
388
389   // Return offset of code stub from beginning of its containing stub table.
390   section_offset_type
391   offset() const
392   {
393     gold_assert(this->offset_ != invalid_offset);
394     return this->offset_;
395   }
396
397   // Set offset of code stub from beginning of its containing stub table.
398   void
399   set_offset(section_offset_type offset)
400   { this->offset_ = offset; }
401   
402   // Return the relocation target address of the i-th relocation in the
403   // stub.  This must be defined in a child class.
404   Arm_address
405   reloc_target(size_t i)
406   { return this->do_reloc_target(i); }
407
408   // Write a stub at output VIEW.  BIG_ENDIAN select how a stub is written.
409   void
410   write(unsigned char* view, section_size_type view_size, bool big_endian)
411   { this->do_write(view, view_size, big_endian); }
412
413  protected:
414   // This must be defined in the child class.
415   virtual Arm_address
416   do_reloc_target(size_t) = 0;
417
418   // This must be defined in the child class.
419   virtual void
420   do_write(unsigned char*, section_size_type, bool) = 0;
421   
422  private:
423   // Its template.
424   const Stub_template* stub_template_;
425   // Offset within the section of containing this stub.
426   section_offset_type offset_;
427 };
428
429 // Reloc stub class.  These are stubs we use to fix up relocation because
430 // of limited branch ranges.
431
432 class Reloc_stub : public Stub
433 {
434  public:
435   static const unsigned int invalid_index = static_cast<unsigned int>(-1);
436   // We assume we never jump to this address.
437   static const Arm_address invalid_address = static_cast<Arm_address>(-1);
438
439   // Return destination address.
440   Arm_address
441   destination_address() const
442   {
443     gold_assert(this->destination_address_ != this->invalid_address);
444     return this->destination_address_;
445   }
446
447   // Set destination address.
448   void
449   set_destination_address(Arm_address address)
450   {
451     gold_assert(address != this->invalid_address);
452     this->destination_address_ = address;
453   }
454
455   // Reset destination address.
456   void
457   reset_destination_address()
458   { this->destination_address_ = this->invalid_address; }
459
460   // Determine stub type for a branch of a relocation of R_TYPE going
461   // from BRANCH_ADDRESS to BRANCH_TARGET.  If TARGET_IS_THUMB is set,
462   // the branch target is a thumb instruction.  TARGET is used for look
463   // up ARM-specific linker settings.
464   static Stub_type
465   stub_type_for_reloc(unsigned int r_type, Arm_address branch_address,
466                       Arm_address branch_target, bool target_is_thumb);
467
468   // Reloc_stub key.  A key is logically a triplet of a stub type, a symbol
469   // and an addend.  Since we treat global and local symbol differently, we
470   // use a Symbol object for a global symbol and a object-index pair for
471   // a local symbol.
472   class Key
473   {
474    public:
475     // If SYMBOL is not null, this is a global symbol, we ignore RELOBJ and
476     // R_SYM.  Otherwise, this is a local symbol and RELOBJ must non-NULL
477     // and R_SYM must not be invalid_index.
478     Key(Stub_type stub_type, const Symbol* symbol, const Relobj* relobj,
479         unsigned int r_sym, int32_t addend)
480       : stub_type_(stub_type), addend_(addend)
481     {
482       if (symbol != NULL)
483         {
484           this->r_sym_ = Reloc_stub::invalid_index;
485           this->u_.symbol = symbol;
486         }
487       else
488         {
489           gold_assert(relobj != NULL && r_sym != invalid_index);
490           this->r_sym_ = r_sym;
491           this->u_.relobj = relobj;
492         }
493     }
494
495     ~Key()
496     { }
497
498     // Accessors: Keys are meant to be read-only object so no modifiers are
499     // provided.
500
501     // Return stub type.
502     Stub_type
503     stub_type() const
504     { return this->stub_type_; }
505
506     // Return the local symbol index or invalid_index.
507     unsigned int
508     r_sym() const
509     { return this->r_sym_; }
510
511     // Return the symbol if there is one.
512     const Symbol*
513     symbol() const
514     { return this->r_sym_ == invalid_index ? this->u_.symbol : NULL; }
515
516     // Return the relobj if there is one.
517     const Relobj*
518     relobj() const
519     { return this->r_sym_ != invalid_index ? this->u_.relobj : NULL; }
520
521     // Whether this equals to another key k.
522     bool
523     eq(const Key& k) const 
524     {
525       return ((this->stub_type_ == k.stub_type_)
526               && (this->r_sym_ == k.r_sym_)
527               && ((this->r_sym_ != Reloc_stub::invalid_index)
528                   ? (this->u_.relobj == k.u_.relobj)
529                   : (this->u_.symbol == k.u_.symbol))
530               && (this->addend_ == k.addend_));
531     }
532
533     // Return a hash value.
534     size_t
535     hash_value() const
536     {
537       return (this->stub_type_
538               ^ this->r_sym_
539               ^ gold::string_hash<char>(
540                     (this->r_sym_ != Reloc_stub::invalid_index)
541                     ? this->u_.relobj->name().c_str()
542                     : this->u_.symbol->name())
543               ^ this->addend_);
544     }
545
546     // Functors for STL associative containers.
547     struct hash
548     {
549       size_t
550       operator()(const Key& k) const
551       { return k.hash_value(); }
552     };
553
554     struct equal_to
555     {
556       bool
557       operator()(const Key& k1, const Key& k2) const
558       { return k1.eq(k2); }
559     };
560
561     // Name of key.  This is mainly for debugging.
562     std::string
563     name() const;
564
565    private:
566     // Stub type.
567     Stub_type stub_type_;
568     // If this is a local symbol, this is the index in the defining object.
569     // Otherwise, it is invalid_index for a global symbol.
570     unsigned int r_sym_;
571     // If r_sym_ is invalid index.  This points to a global symbol.
572     // Otherwise, this points a relobj.  We used the unsized and target
573     // independent Symbol and Relobj classes instead of Sized_symbol<32> and  
574     // Arm_relobj.  This is done to avoid making the stub class a template
575     // as most of the stub machinery is endianity-neutral.  However, it
576     // may require a bit of casting done by users of this class.
577     union
578     {
579       const Symbol* symbol;
580       const Relobj* relobj;
581     } u_;
582     // Addend associated with a reloc.
583     int32_t addend_;
584   };
585
586  protected:
587   // Reloc_stubs are created via a stub factory.  So these are protected.
588   Reloc_stub(const Stub_template* stub_template)
589     : Stub(stub_template), destination_address_(invalid_address)
590   { }
591
592   ~Reloc_stub()
593   { }
594
595   friend class Stub_factory;
596
597  private:
598   // Return the relocation target address of the i-th relocation in the
599   // stub.
600   Arm_address
601   do_reloc_target(size_t i)
602   {
603     // All reloc stub have only one relocation.
604     gold_assert(i == 0);
605     return this->destination_address_;
606   }
607
608   // A template to implement do_write below.
609   template<bool big_endian>
610   void inline
611   do_fixed_endian_write(unsigned char*, section_size_type);
612
613   // Write a stub.
614   void
615   do_write(unsigned char* view, section_size_type view_size, bool big_endian);
616
617   // Address of destination.
618   Arm_address destination_address_;
619 };
620
621 // Stub factory class.
622
623 class Stub_factory
624 {
625  public:
626   // Return the unique instance of this class.
627   static const Stub_factory&
628   get_instance()
629   {
630     static Stub_factory singleton;
631     return singleton;
632   }
633
634   // Make a relocation stub.
635   Reloc_stub*
636   make_reloc_stub(Stub_type stub_type) const
637   {
638     gold_assert(stub_type >= arm_stub_reloc_first
639                 && stub_type <= arm_stub_reloc_last);
640     return new Reloc_stub(this->stub_templates_[stub_type]);
641   }
642
643  private:
644   // Constructor and destructor are protected since we only return a single
645   // instance created in Stub_factory::get_instance().
646   
647   Stub_factory();
648
649   // A Stub_factory may not be copied since it is a singleton.
650   Stub_factory(const Stub_factory&);
651   Stub_factory& operator=(Stub_factory&);
652   
653   // Stub templates.  These are initialized in the constructor.
654   const Stub_template* stub_templates_[arm_stub_type_last+1];
655 };
656
657 // A class to hold stubs for the ARM target.
658
659 template<bool big_endian>
660 class Stub_table : public Output_data
661 {
662  public:
663   Stub_table(Arm_input_section<big_endian>* owner)
664     : Output_data(), addralign_(1), owner_(owner), has_been_changed_(false),
665       reloc_stubs_()
666   { }
667
668   ~Stub_table()
669   { }
670
671   // Owner of this stub table.
672   Arm_input_section<big_endian>*
673   owner() const
674   { return this->owner_; }
675
676   // Whether this stub table is empty.
677   bool
678   empty() const
679   { return this->reloc_stubs_.empty(); }
680
681   // Whether this has been changed.
682   bool
683   has_been_changed() const
684   { return this->has_been_changed_; }
685
686   // Set the has-been-changed flag.
687   void
688   set_has_been_changed(bool value)
689   { this->has_been_changed_ = value; }
690
691   // Return the current data size.
692   off_t
693   current_data_size() const
694   { return this->current_data_size_for_child(); }
695
696   // Add a STUB with using KEY.  Caller is reponsible for avoid adding
697   // if already a STUB with the same key has been added. 
698   void
699   add_reloc_stub(Reloc_stub* stub, const Reloc_stub::Key& key);
700
701   // Look up a relocation stub using KEY.  Return NULL if there is none.
702   Reloc_stub*
703   find_reloc_stub(const Reloc_stub::Key& key) const
704   {
705     typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.find(key);
706     return (p != this->reloc_stubs_.end()) ? p->second : NULL;
707   }
708
709   // Relocate stubs in this stub table.
710   void
711   relocate_stubs(const Relocate_info<32, big_endian>*,
712                  Target_arm<big_endian>*, Output_section*,
713                  unsigned char*, Arm_address, section_size_type);
714
715  protected:
716   // Write out section contents.
717   void
718   do_write(Output_file*);
719  
720   // Return the required alignment.
721   uint64_t
722   do_addralign() const
723   { return this->addralign_; }
724
725   // Finalize data size.
726   void
727   set_final_data_size()
728   { this->set_data_size(this->current_data_size_for_child()); }
729
730   // Reset address and file offset.
731   void
732   do_reset_address_and_file_offset();
733
734  private:
735   // Unordered map of stubs.
736   typedef
737     Unordered_map<Reloc_stub::Key, Reloc_stub*, Reloc_stub::Key::hash,
738                   Reloc_stub::Key::equal_to>
739     Reloc_stub_map;
740
741   // Address alignment
742   uint64_t addralign_;
743   // Owner of this stub table.
744   Arm_input_section<big_endian>* owner_;
745   // This is set to true during relaxiong if the size of the stub table
746   // has been changed.
747   bool has_been_changed_;
748   // The relocation stubs.
749   Reloc_stub_map reloc_stubs_;
750 };
751
752 // A class to wrap an ordinary input section containing executable code.
753
754 template<bool big_endian>
755 class Arm_input_section : public Output_relaxed_input_section
756 {
757  public:
758   Arm_input_section(Relobj* relobj, unsigned int shndx)
759     : Output_relaxed_input_section(relobj, shndx, 1),
760       original_addralign_(1), original_size_(0), stub_table_(NULL)
761   { }
762
763   ~Arm_input_section()
764   { }
765
766   // Initialize.
767   void
768   init();
769   
770   // Whether this is a stub table owner.
771   bool
772   is_stub_table_owner() const
773   { return this->stub_table_ != NULL && this->stub_table_->owner() == this; }
774
775   // Return the stub table.
776   Stub_table<big_endian>*
777   stub_table() const
778   { return this->stub_table_; }
779
780   // Set the stub_table.
781   void
782   set_stub_table(Stub_table<big_endian>* stub_table)
783   { this->stub_table_ = stub_table; }
784
785   // Downcast a base pointer to an Arm_input_section pointer.  This is
786   // not type-safe but we only use Arm_input_section not the base class.
787   static Arm_input_section<big_endian>*
788   as_arm_input_section(Output_relaxed_input_section* poris)
789   { return static_cast<Arm_input_section<big_endian>*>(poris); }
790
791  protected:
792   // Write data to output file.
793   void
794   do_write(Output_file*);
795
796   // Return required alignment of this.
797   uint64_t
798   do_addralign() const
799   {
800     if (this->is_stub_table_owner())
801       return std::max(this->stub_table_->addralign(),
802                       this->original_addralign_);
803     else
804       return this->original_addralign_;
805   }
806
807   // Finalize data size.
808   void
809   set_final_data_size();
810
811   // Reset address and file offset.
812   void
813   do_reset_address_and_file_offset();
814
815   // Output offset.
816   bool
817   do_output_offset(const Relobj* object, unsigned int shndx,
818                    section_offset_type offset,
819                    section_offset_type* poutput) const
820   {
821     if ((object == this->relobj())
822         && (shndx == this->shndx())
823         && (offset >= 0)
824         && (convert_types<uint64_t, section_offset_type>(offset)
825             <= this->original_size_))
826       {
827         *poutput = offset;
828         return true;
829       }
830     else
831       return false;
832   }
833
834  private:
835   // Copying is not allowed.
836   Arm_input_section(const Arm_input_section&);
837   Arm_input_section& operator=(const Arm_input_section&);
838
839   // Address alignment of the original input section.
840   uint64_t original_addralign_;
841   // Section size of the original input section.
842   uint64_t original_size_;
843   // Stub table.
844   Stub_table<big_endian>* stub_table_;
845 };
846
847 // Arm output section class.  This is defined mainly to add a number of
848 // stub generation methods.
849
850 template<bool big_endian>
851 class Arm_output_section : public Output_section
852 {
853  public:
854   Arm_output_section(const char* name, elfcpp::Elf_Word type,
855                      elfcpp::Elf_Xword flags)
856     : Output_section(name, type, flags)
857   { }
858
859   ~Arm_output_section()
860   { }
861   
862   // Group input sections for stub generation.
863   void
864   group_sections(section_size_type, bool, Target_arm<big_endian>*);
865
866   // Downcast a base pointer to an Arm_output_section pointer.  This is
867   // not type-safe but we only use Arm_output_section not the base class.
868   static Arm_output_section<big_endian>*
869   as_arm_output_section(Output_section* os)
870   { return static_cast<Arm_output_section<big_endian>*>(os); }
871
872  private:
873   // For convenience.
874   typedef Output_section::Input_section Input_section;
875   typedef Output_section::Input_section_list Input_section_list;
876
877   // Create a stub group.
878   void create_stub_group(Input_section_list::const_iterator,
879                          Input_section_list::const_iterator,
880                          Input_section_list::const_iterator,
881                          Target_arm<big_endian>*,
882                          std::vector<Output_relaxed_input_section*>*);
883 };
884
885 // Arm_relobj class.
886
887 template<bool big_endian>
888 class Arm_relobj : public Sized_relobj<32, big_endian>
889 {
890  public:
891   static const Arm_address invalid_address = static_cast<Arm_address>(-1);
892
893   Arm_relobj(const std::string& name, Input_file* input_file, off_t offset,
894              const typename elfcpp::Ehdr<32, big_endian>& ehdr)
895     : Sized_relobj<32, big_endian>(name, input_file, offset, ehdr),
896       stub_tables_(), local_symbol_is_thumb_function_(),
897       attributes_section_data_(NULL)
898   { }
899
900   ~Arm_relobj()
901   { delete this->attributes_section_data_; }
902  
903   // Return the stub table of the SHNDX-th section if there is one.
904   Stub_table<big_endian>*
905   stub_table(unsigned int shndx) const
906   {
907     gold_assert(shndx < this->stub_tables_.size());
908     return this->stub_tables_[shndx];
909   }
910
911   // Set STUB_TABLE to be the stub_table of the SHNDX-th section.
912   void
913   set_stub_table(unsigned int shndx, Stub_table<big_endian>* stub_table)
914   {
915     gold_assert(shndx < this->stub_tables_.size());
916     this->stub_tables_[shndx] = stub_table;
917   }
918
919   // Whether a local symbol is a THUMB function.  R_SYM is the symbol table
920   // index.  This is only valid after do_count_local_symbol is called.
921   bool
922   local_symbol_is_thumb_function(unsigned int r_sym) const
923   {
924     gold_assert(r_sym < this->local_symbol_is_thumb_function_.size());
925     return this->local_symbol_is_thumb_function_[r_sym];
926   }
927   
928   // Scan all relocation sections for stub generation.
929   void
930   scan_sections_for_stubs(Target_arm<big_endian>*, const Symbol_table*,
931                           const Layout*);
932
933   // Convert regular input section with index SHNDX to a relaxed section.
934   void
935   convert_input_section_to_relaxed_section(unsigned shndx)
936   {
937     // The stubs have relocations and we need to process them after writing
938     // out the stubs.  So relocation now must follow section write.
939     this->invalidate_section_offset(shndx);
940     this->set_relocs_must_follow_section_writes();
941   }
942
943   // Downcast a base pointer to an Arm_relobj pointer.  This is
944   // not type-safe but we only use Arm_relobj not the base class.
945   static Arm_relobj<big_endian>*
946   as_arm_relobj(Relobj* relobj)
947   { return static_cast<Arm_relobj<big_endian>*>(relobj); }
948
949   // Processor-specific flags in ELF file header.  This is valid only after
950   // reading symbols.
951   elfcpp::Elf_Word
952   processor_specific_flags() const
953   { return this->processor_specific_flags_; }
954
955   // Attribute section data  This is the contents of the .ARM.attribute section
956   // if there is one.
957   const Attributes_section_data*
958   attributes_section_data() const
959   { return this->attributes_section_data_; }
960
961  protected:
962   // Post constructor setup.
963   void
964   do_setup()
965   {
966     // Call parent's setup method.
967     Sized_relobj<32, big_endian>::do_setup();
968
969     // Initialize look-up tables.
970     Stub_table_list empty_stub_table_list(this->shnum(), NULL);
971     this->stub_tables_.swap(empty_stub_table_list);
972   }
973
974   // Count the local symbols.
975   void
976   do_count_local_symbols(Stringpool_template<char>*,
977                          Stringpool_template<char>*);
978
979   void
980   do_relocate_sections(const Symbol_table* symtab, const Layout* layout,
981                        const unsigned char* pshdrs,
982                        typename Sized_relobj<32, big_endian>::Views* pivews);
983
984   // Read the symbol information.
985   void
986   do_read_symbols(Read_symbols_data* sd);
987
988  private:
989   // List of stub tables.
990   typedef std::vector<Stub_table<big_endian>*> Stub_table_list;
991   Stub_table_list stub_tables_;
992   // Bit vector to tell if a local symbol is a thumb function or not.
993   // This is only valid after do_count_local_symbol is called.
994   std::vector<bool> local_symbol_is_thumb_function_;
995   // processor-specific flags in ELF file header.
996   elfcpp::Elf_Word processor_specific_flags_;
997   // Object attributes if there is an .ARM.attributes section or NULL.
998   Attributes_section_data* attributes_section_data_;
999 };
1000
1001 // Arm_dynobj class.
1002
1003 template<bool big_endian>
1004 class Arm_dynobj : public Sized_dynobj<32, big_endian>
1005 {
1006  public:
1007   Arm_dynobj(const std::string& name, Input_file* input_file, off_t offset,
1008              const elfcpp::Ehdr<32, big_endian>& ehdr)
1009     : Sized_dynobj<32, big_endian>(name, input_file, offset, ehdr),
1010       processor_specific_flags_(0), attributes_section_data_(NULL)
1011   { }
1012  
1013   ~Arm_dynobj()
1014   { delete this->attributes_section_data_; }
1015
1016   // Downcast a base pointer to an Arm_relobj pointer.  This is
1017   // not type-safe but we only use Arm_relobj not the base class.
1018   static Arm_dynobj<big_endian>*
1019   as_arm_dynobj(Dynobj* dynobj)
1020   { return static_cast<Arm_dynobj<big_endian>*>(dynobj); }
1021
1022   // Processor-specific flags in ELF file header.  This is valid only after
1023   // reading symbols.
1024   elfcpp::Elf_Word
1025   processor_specific_flags() const
1026   { return this->processor_specific_flags_; }
1027
1028   // Attributes section data.
1029   const Attributes_section_data*
1030   attributes_section_data() const
1031   { return this->attributes_section_data_; }
1032
1033  protected:
1034   // Read the symbol information.
1035   void
1036   do_read_symbols(Read_symbols_data* sd);
1037
1038  private:
1039   // processor-specific flags in ELF file header.
1040   elfcpp::Elf_Word processor_specific_flags_;
1041   // Object attributes if there is an .ARM.attributes section or NULL.
1042   Attributes_section_data* attributes_section_data_;
1043 };
1044
1045 // Functor to read reloc addends during stub generation.
1046
1047 template<int sh_type, bool big_endian>
1048 struct Stub_addend_reader
1049 {
1050   // Return the addend for a relocation of a particular type.  Depending
1051   // on whether this is a REL or RELA relocation, read the addend from a
1052   // view or from a Reloc object.
1053   elfcpp::Elf_types<32>::Elf_Swxword
1054   operator()(
1055     unsigned int /* r_type */,
1056     const unsigned char* /* view */,
1057     const typename Reloc_types<sh_type,
1058                                32, big_endian>::Reloc& /* reloc */) const;
1059 };
1060
1061 // Specialized Stub_addend_reader for SHT_REL type relocation sections.
1062
1063 template<bool big_endian>
1064 struct Stub_addend_reader<elfcpp::SHT_REL, big_endian>
1065 {
1066   elfcpp::Elf_types<32>::Elf_Swxword
1067   operator()(
1068     unsigned int,
1069     const unsigned char*,
1070     const typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc&) const;
1071 };
1072
1073 // Specialized Stub_addend_reader for RELA type relocation sections.
1074 // We currently do not handle RELA type relocation sections but it is trivial
1075 // to implement the addend reader.  This is provided for completeness and to
1076 // make it easier to add support for RELA relocation sections in the future.
1077
1078 template<bool big_endian>
1079 struct Stub_addend_reader<elfcpp::SHT_RELA, big_endian>
1080 {
1081   elfcpp::Elf_types<32>::Elf_Swxword
1082   operator()(
1083     unsigned int,
1084     const unsigned char*,
1085     const typename Reloc_types<elfcpp::SHT_RELA, 32,
1086                                big_endian>::Reloc& reloc) const
1087   { return reloc.get_r_addend(); }
1088 };
1089
1090 // Utilities for manipulating integers of up to 32-bits
1091
1092 namespace utils
1093 {
1094   // Sign extend an n-bit unsigned integer stored in an uint32_t into
1095   // an int32_t.  NO_BITS must be between 1 to 32.
1096   template<int no_bits>
1097   static inline int32_t
1098   sign_extend(uint32_t bits)
1099   {
1100     gold_assert(no_bits >= 0 && no_bits <= 32);
1101     if (no_bits == 32)
1102       return static_cast<int32_t>(bits);
1103     uint32_t mask = (~((uint32_t) 0)) >> (32 - no_bits);
1104     bits &= mask;
1105     uint32_t top_bit = 1U << (no_bits - 1);
1106     int32_t as_signed = static_cast<int32_t>(bits);
1107     return (bits & top_bit) ? as_signed + (-top_bit * 2) : as_signed;
1108   }
1109
1110   // Detects overflow of an NO_BITS integer stored in a uint32_t.
1111   template<int no_bits>
1112   static inline bool
1113   has_overflow(uint32_t bits)
1114   {
1115     gold_assert(no_bits >= 0 && no_bits <= 32);
1116     if (no_bits == 32)
1117       return false;
1118     int32_t max = (1 << (no_bits - 1)) - 1;
1119     int32_t min = -(1 << (no_bits - 1));
1120     int32_t as_signed = static_cast<int32_t>(bits);
1121     return as_signed > max || as_signed < min;
1122   }
1123
1124   // Detects overflow of an NO_BITS integer stored in a uint32_t when it
1125   // fits in the given number of bits as either a signed or unsigned value.
1126   // For example, has_signed_unsigned_overflow<8> would check
1127   // -128 <= bits <= 255
1128   template<int no_bits>
1129   static inline bool
1130   has_signed_unsigned_overflow(uint32_t bits)
1131   {
1132     gold_assert(no_bits >= 2 && no_bits <= 32);
1133     if (no_bits == 32)
1134       return false;
1135     int32_t max = static_cast<int32_t>((1U << no_bits) - 1);
1136     int32_t min = -(1 << (no_bits - 1));
1137     int32_t as_signed = static_cast<int32_t>(bits);
1138     return as_signed > max || as_signed < min;
1139   }
1140
1141   // Select bits from A and B using bits in MASK.  For each n in [0..31],
1142   // the n-th bit in the result is chosen from the n-th bits of A and B.
1143   // A zero selects A and a one selects B.
1144   static inline uint32_t
1145   bit_select(uint32_t a, uint32_t b, uint32_t mask)
1146   { return (a & ~mask) | (b & mask); }
1147 };
1148
1149 template<bool big_endian>
1150 class Target_arm : public Sized_target<32, big_endian>
1151 {
1152  public:
1153   typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, big_endian>
1154     Reloc_section;
1155
1156   // When were are relocating a stub, we pass this as the relocation number.
1157   static const size_t fake_relnum_for_stubs = static_cast<size_t>(-1);
1158
1159   Target_arm()
1160     : Sized_target<32, big_endian>(&arm_info),
1161       got_(NULL), plt_(NULL), got_plt_(NULL), rel_dyn_(NULL),
1162       copy_relocs_(elfcpp::R_ARM_COPY), dynbss_(NULL), stub_tables_(),
1163       stub_factory_(Stub_factory::get_instance()), may_use_blx_(false),
1164       should_force_pic_veneer_(false), arm_input_section_map_(),
1165       attributes_section_data_(NULL)
1166   { }
1167
1168   // Whether we can use BLX.
1169   bool
1170   may_use_blx() const
1171   { return this->may_use_blx_; }
1172
1173   // Set use-BLX flag.
1174   void
1175   set_may_use_blx(bool value)
1176   { this->may_use_blx_ = value; }
1177   
1178   // Whether we force PCI branch veneers.
1179   bool
1180   should_force_pic_veneer() const
1181   { return this->should_force_pic_veneer_; }
1182
1183   // Set PIC veneer flag.
1184   void
1185   set_should_force_pic_veneer(bool value)
1186   { this->should_force_pic_veneer_ = value; }
1187   
1188   // Whether we use THUMB-2 instructions.
1189   bool
1190   using_thumb2() const
1191   {
1192     Object_attribute* attr =
1193       this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
1194     int arch = attr->int_value();
1195     return arch == elfcpp::TAG_CPU_ARCH_V6T2 || arch >= elfcpp::TAG_CPU_ARCH_V7;
1196   }
1197
1198   // Whether we use THUMB/THUMB-2 instructions only.
1199   bool
1200   using_thumb_only() const
1201   {
1202     Object_attribute* attr =
1203       this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
1204     if (attr->int_value() != elfcpp::TAG_CPU_ARCH_V7
1205         && attr->int_value() != elfcpp::TAG_CPU_ARCH_V7E_M)
1206       return false;
1207     attr = this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch_profile);
1208     return attr->int_value() == 'M';
1209   }
1210
1211   // Whether we have an NOP instruction.  If not, use mov r0, r0 instead.
1212   bool
1213   may_use_arm_nop() const
1214   {
1215     Object_attribute* attr =
1216       this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
1217     int arch = attr->int_value();
1218     return (arch == elfcpp::TAG_CPU_ARCH_V6T2
1219             || arch == elfcpp::TAG_CPU_ARCH_V6K
1220             || arch == elfcpp::TAG_CPU_ARCH_V7
1221             || arch == elfcpp::TAG_CPU_ARCH_V7E_M);
1222   }
1223
1224   // Whether we have THUMB-2 NOP.W instruction.
1225   bool
1226   may_use_thumb2_nop() const
1227   {
1228     Object_attribute* attr =
1229       this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
1230     int arch = attr->int_value();
1231     return (arch == elfcpp::TAG_CPU_ARCH_V6T2
1232             || arch == elfcpp::TAG_CPU_ARCH_V7
1233             || arch == elfcpp::TAG_CPU_ARCH_V7E_M);
1234   }
1235   
1236   // Process the relocations to determine unreferenced sections for 
1237   // garbage collection.
1238   void
1239   gc_process_relocs(Symbol_table* symtab,
1240                     Layout* layout,
1241                     Sized_relobj<32, big_endian>* object,
1242                     unsigned int data_shndx,
1243                     unsigned int sh_type,
1244                     const unsigned char* prelocs,
1245                     size_t reloc_count,
1246                     Output_section* output_section,
1247                     bool needs_special_offset_handling,
1248                     size_t local_symbol_count,
1249                     const unsigned char* plocal_symbols);
1250
1251   // Scan the relocations to look for symbol adjustments.
1252   void
1253   scan_relocs(Symbol_table* symtab,
1254               Layout* layout,
1255               Sized_relobj<32, big_endian>* object,
1256               unsigned int data_shndx,
1257               unsigned int sh_type,
1258               const unsigned char* prelocs,
1259               size_t reloc_count,
1260               Output_section* output_section,
1261               bool needs_special_offset_handling,
1262               size_t local_symbol_count,
1263               const unsigned char* plocal_symbols);
1264
1265   // Finalize the sections.
1266   void
1267   do_finalize_sections(Layout*, const Input_objects*, Symbol_table*);
1268
1269   // Return the value to use for a dynamic symbol which requires special
1270   // treatment.
1271   uint64_t
1272   do_dynsym_value(const Symbol*) const;
1273
1274   // Relocate a section.
1275   void
1276   relocate_section(const Relocate_info<32, big_endian>*,
1277                    unsigned int sh_type,
1278                    const unsigned char* prelocs,
1279                    size_t reloc_count,
1280                    Output_section* output_section,
1281                    bool needs_special_offset_handling,
1282                    unsigned char* view,
1283                    Arm_address view_address,
1284                    section_size_type view_size,
1285                    const Reloc_symbol_changes*);
1286
1287   // Scan the relocs during a relocatable link.
1288   void
1289   scan_relocatable_relocs(Symbol_table* symtab,
1290                           Layout* layout,
1291                           Sized_relobj<32, big_endian>* object,
1292                           unsigned int data_shndx,
1293                           unsigned int sh_type,
1294                           const unsigned char* prelocs,
1295                           size_t reloc_count,
1296                           Output_section* output_section,
1297                           bool needs_special_offset_handling,
1298                           size_t local_symbol_count,
1299                           const unsigned char* plocal_symbols,
1300                           Relocatable_relocs*);
1301
1302   // Relocate a section during a relocatable link.
1303   void
1304   relocate_for_relocatable(const Relocate_info<32, big_endian>*,
1305                            unsigned int sh_type,
1306                            const unsigned char* prelocs,
1307                            size_t reloc_count,
1308                            Output_section* output_section,
1309                            off_t offset_in_output_section,
1310                            const Relocatable_relocs*,
1311                            unsigned char* view,
1312                            Arm_address view_address,
1313                            section_size_type view_size,
1314                            unsigned char* reloc_view,
1315                            section_size_type reloc_view_size);
1316
1317   // Return whether SYM is defined by the ABI.
1318   bool
1319   do_is_defined_by_abi(Symbol* sym) const
1320   { return strcmp(sym->name(), "__tls_get_addr") == 0; }
1321
1322   // Return the size of the GOT section.
1323   section_size_type
1324   got_size()
1325   {
1326     gold_assert(this->got_ != NULL);
1327     return this->got_->data_size();
1328   }
1329
1330   // Map platform-specific reloc types
1331   static unsigned int
1332   get_real_reloc_type (unsigned int r_type);
1333
1334   //
1335   // Methods to support stub-generations.
1336   //
1337   
1338   // Return the stub factory
1339   const Stub_factory&
1340   stub_factory() const
1341   { return this->stub_factory_; }
1342
1343   // Make a new Arm_input_section object.
1344   Arm_input_section<big_endian>*
1345   new_arm_input_section(Relobj*, unsigned int);
1346
1347   // Find the Arm_input_section object corresponding to the SHNDX-th input
1348   // section of RELOBJ.
1349   Arm_input_section<big_endian>*
1350   find_arm_input_section(Relobj* relobj, unsigned int shndx) const;
1351
1352   // Make a new Stub_table
1353   Stub_table<big_endian>*
1354   new_stub_table(Arm_input_section<big_endian>*);
1355
1356   // Scan a section for stub generation.
1357   void
1358   scan_section_for_stubs(const Relocate_info<32, big_endian>*, unsigned int,
1359                          const unsigned char*, size_t, Output_section*,
1360                          bool, const unsigned char*, Arm_address,
1361                          section_size_type);
1362
1363   // Relocate a stub. 
1364   void
1365   relocate_stub(Reloc_stub*, const Relocate_info<32, big_endian>*,
1366                 Output_section*, unsigned char*, Arm_address,
1367                 section_size_type);
1368  
1369   // Get the default ARM target.
1370   static Target_arm<big_endian>*
1371   default_target()
1372   {
1373     gold_assert(parameters->target().machine_code() == elfcpp::EM_ARM
1374                 && parameters->target().is_big_endian() == big_endian);
1375     return static_cast<Target_arm<big_endian>*>(
1376              parameters->sized_target<32, big_endian>());
1377   }
1378
1379   // Whether relocation type uses LSB to distinguish THUMB addresses.
1380   static bool
1381   reloc_uses_thumb_bit(unsigned int r_type);
1382
1383  protected:
1384   // Make an ELF object.
1385   Object*
1386   do_make_elf_object(const std::string&, Input_file*, off_t,
1387                      const elfcpp::Ehdr<32, big_endian>& ehdr);
1388
1389   Object*
1390   do_make_elf_object(const std::string&, Input_file*, off_t,
1391                      const elfcpp::Ehdr<32, !big_endian>&)
1392   { gold_unreachable(); }
1393
1394   Object*
1395   do_make_elf_object(const std::string&, Input_file*, off_t,
1396                       const elfcpp::Ehdr<64, false>&)
1397   { gold_unreachable(); }
1398
1399   Object*
1400   do_make_elf_object(const std::string&, Input_file*, off_t,
1401                      const elfcpp::Ehdr<64, true>&)
1402   { gold_unreachable(); }
1403
1404   // Make an output section.
1405   Output_section*
1406   do_make_output_section(const char* name, elfcpp::Elf_Word type,
1407                          elfcpp::Elf_Xword flags)
1408   { return new Arm_output_section<big_endian>(name, type, flags); }
1409
1410   void
1411   do_adjust_elf_header(unsigned char* view, int len) const;
1412
1413   // We only need to generate stubs, and hence perform relaxation if we are
1414   // not doing relocatable linking.
1415   bool
1416   do_may_relax() const
1417   { return !parameters->options().relocatable(); }
1418
1419   bool
1420   do_relax(int, const Input_objects*, Symbol_table*, Layout*);
1421
1422   // Determine whether an object attribute tag takes an integer, a
1423   // string or both.
1424   int
1425   do_attribute_arg_type(int tag) const;
1426
1427   // Reorder tags during output.
1428   int
1429   do_attributes_order(int num) const;
1430
1431  private:
1432   // The class which scans relocations.
1433   class Scan
1434   {
1435    public:
1436     Scan()
1437       : issued_non_pic_error_(false)
1438     { }
1439
1440     inline void
1441     local(Symbol_table* symtab, Layout* layout, Target_arm* target,
1442           Sized_relobj<32, big_endian>* object,
1443           unsigned int data_shndx,
1444           Output_section* output_section,
1445           const elfcpp::Rel<32, big_endian>& reloc, unsigned int r_type,
1446           const elfcpp::Sym<32, big_endian>& lsym);
1447
1448     inline void
1449     global(Symbol_table* symtab, Layout* layout, Target_arm* target,
1450            Sized_relobj<32, big_endian>* object,
1451            unsigned int data_shndx,
1452            Output_section* output_section,
1453            const elfcpp::Rel<32, big_endian>& reloc, unsigned int r_type,
1454            Symbol* gsym);
1455
1456    private:
1457     static void
1458     unsupported_reloc_local(Sized_relobj<32, big_endian>*,
1459                             unsigned int r_type);
1460
1461     static void
1462     unsupported_reloc_global(Sized_relobj<32, big_endian>*,
1463                              unsigned int r_type, Symbol*);
1464
1465     void
1466     check_non_pic(Relobj*, unsigned int r_type);
1467
1468     // Almost identical to Symbol::needs_plt_entry except that it also
1469     // handles STT_ARM_TFUNC.
1470     static bool
1471     symbol_needs_plt_entry(const Symbol* sym)
1472     {
1473       // An undefined symbol from an executable does not need a PLT entry.
1474       if (sym->is_undefined() && !parameters->options().shared())
1475         return false;
1476
1477       return (!parameters->doing_static_link()
1478               && (sym->type() == elfcpp::STT_FUNC
1479                   || sym->type() == elfcpp::STT_ARM_TFUNC)
1480               && (sym->is_from_dynobj()
1481                   || sym->is_undefined()
1482                   || sym->is_preemptible()));
1483     }
1484
1485     // Whether we have issued an error about a non-PIC compilation.
1486     bool issued_non_pic_error_;
1487   };
1488
1489   // The class which implements relocation.
1490   class Relocate
1491   {
1492    public:
1493     Relocate()
1494     { }
1495
1496     ~Relocate()
1497     { }
1498
1499     // Return whether the static relocation needs to be applied.
1500     inline bool
1501     should_apply_static_reloc(const Sized_symbol<32>* gsym,
1502                               int ref_flags,
1503                               bool is_32bit,
1504                               Output_section* output_section);
1505
1506     // Do a relocation.  Return false if the caller should not issue
1507     // any warnings about this relocation.
1508     inline bool
1509     relocate(const Relocate_info<32, big_endian>*, Target_arm*,
1510              Output_section*,  size_t relnum,
1511              const elfcpp::Rel<32, big_endian>&,
1512              unsigned int r_type, const Sized_symbol<32>*,
1513              const Symbol_value<32>*,
1514              unsigned char*, Arm_address,
1515              section_size_type);
1516
1517     // Return whether we want to pass flag NON_PIC_REF for this
1518     // reloc.  This means the relocation type accesses a symbol not via
1519     // GOT or PLT.
1520     static inline bool
1521     reloc_is_non_pic (unsigned int r_type)
1522     {
1523       switch (r_type)
1524         {
1525         // These relocation types reference GOT or PLT entries explicitly.
1526         case elfcpp::R_ARM_GOT_BREL:
1527         case elfcpp::R_ARM_GOT_ABS:
1528         case elfcpp::R_ARM_GOT_PREL:
1529         case elfcpp::R_ARM_GOT_BREL12:
1530         case elfcpp::R_ARM_PLT32_ABS:
1531         case elfcpp::R_ARM_TLS_GD32:
1532         case elfcpp::R_ARM_TLS_LDM32:
1533         case elfcpp::R_ARM_TLS_IE32:
1534         case elfcpp::R_ARM_TLS_IE12GP:
1535
1536         // These relocate types may use PLT entries.
1537         case elfcpp::R_ARM_CALL:
1538         case elfcpp::R_ARM_THM_CALL:
1539         case elfcpp::R_ARM_JUMP24:
1540         case elfcpp::R_ARM_THM_JUMP24:
1541         case elfcpp::R_ARM_THM_JUMP19:
1542         case elfcpp::R_ARM_PLT32:
1543         case elfcpp::R_ARM_THM_XPC22:
1544           return false;
1545
1546         default:
1547           return true;
1548         }
1549     }
1550   };
1551
1552   // A class which returns the size required for a relocation type,
1553   // used while scanning relocs during a relocatable link.
1554   class Relocatable_size_for_reloc
1555   {
1556    public:
1557     unsigned int
1558     get_size_for_reloc(unsigned int, Relobj*);
1559   };
1560
1561   // Get the GOT section, creating it if necessary.
1562   Output_data_got<32, big_endian>*
1563   got_section(Symbol_table*, Layout*);
1564
1565   // Get the GOT PLT section.
1566   Output_data_space*
1567   got_plt_section() const
1568   {
1569     gold_assert(this->got_plt_ != NULL);
1570     return this->got_plt_;
1571   }
1572
1573   // Create a PLT entry for a global symbol.
1574   void
1575   make_plt_entry(Symbol_table*, Layout*, Symbol*);
1576
1577   // Get the PLT section.
1578   const Output_data_plt_arm<big_endian>*
1579   plt_section() const
1580   {
1581     gold_assert(this->plt_ != NULL);
1582     return this->plt_;
1583   }
1584
1585   // Get the dynamic reloc section, creating it if necessary.
1586   Reloc_section*
1587   rel_dyn_section(Layout*);
1588
1589   // Return true if the symbol may need a COPY relocation.
1590   // References from an executable object to non-function symbols
1591   // defined in a dynamic object may need a COPY relocation.
1592   bool
1593   may_need_copy_reloc(Symbol* gsym)
1594   {
1595     return (gsym->type() != elfcpp::STT_ARM_TFUNC
1596             && gsym->may_need_copy_reloc());
1597   }
1598
1599   // Add a potential copy relocation.
1600   void
1601   copy_reloc(Symbol_table* symtab, Layout* layout,
1602              Sized_relobj<32, big_endian>* object,
1603              unsigned int shndx, Output_section* output_section,
1604              Symbol* sym, const elfcpp::Rel<32, big_endian>& reloc)
1605   {
1606     this->copy_relocs_.copy_reloc(symtab, layout,
1607                                   symtab->get_sized_symbol<32>(sym),
1608                                   object, shndx, output_section, reloc,
1609                                   this->rel_dyn_section(layout));
1610   }
1611
1612   // Whether two EABI versions are compatible.
1613   static bool
1614   are_eabi_versions_compatible(elfcpp::Elf_Word v1, elfcpp::Elf_Word v2);
1615
1616   // Merge processor-specific flags from input object and those in the ELF
1617   // header of the output.
1618   void
1619   merge_processor_specific_flags(const std::string&, elfcpp::Elf_Word);
1620
1621   // Get the secondary compatible architecture.
1622   static int
1623   get_secondary_compatible_arch(const Attributes_section_data*);
1624
1625   // Set the secondary compatible architecture.
1626   static void
1627   set_secondary_compatible_arch(Attributes_section_data*, int);
1628
1629   static int
1630   tag_cpu_arch_combine(const char*, int, int*, int, int);
1631
1632   // Helper to print AEABI enum tag value.
1633   static std::string
1634   aeabi_enum_name(unsigned int);
1635
1636   // Return string value for TAG_CPU_name.
1637   static std::string
1638   tag_cpu_name_value(unsigned int);
1639
1640   // Merge object attributes from input object and those in the output.
1641   void
1642   merge_object_attributes(const char*, const Attributes_section_data*);
1643
1644   // Helper to get an AEABI object attribute
1645   Object_attribute*
1646   get_aeabi_object_attribute(int tag) const
1647   {
1648     Attributes_section_data* pasd = this->attributes_section_data_;
1649     gold_assert(pasd != NULL);
1650     Object_attribute* attr =
1651       pasd->get_attribute(Object_attribute::OBJ_ATTR_PROC, tag);
1652     gold_assert(attr != NULL);
1653     return attr;
1654   }
1655
1656   //
1657   // Methods to support stub-generations.
1658   //
1659
1660   // Group input sections for stub generation.
1661   void
1662   group_sections(Layout*, section_size_type, bool);
1663
1664   // Scan a relocation for stub generation.
1665   void
1666   scan_reloc_for_stub(const Relocate_info<32, big_endian>*, unsigned int,
1667                       const Sized_symbol<32>*, unsigned int,
1668                       const Symbol_value<32>*,
1669                       elfcpp::Elf_types<32>::Elf_Swxword, Arm_address);
1670
1671   // Scan a relocation section for stub.
1672   template<int sh_type>
1673   void
1674   scan_reloc_section_for_stubs(
1675       const Relocate_info<32, big_endian>* relinfo,
1676       const unsigned char* prelocs,
1677       size_t reloc_count,
1678       Output_section* output_section,
1679       bool needs_special_offset_handling,
1680       const unsigned char* view,
1681       elfcpp::Elf_types<32>::Elf_Addr view_address,
1682       section_size_type);
1683
1684   // Information about this specific target which we pass to the
1685   // general Target structure.
1686   static const Target::Target_info arm_info;
1687
1688   // The types of GOT entries needed for this platform.
1689   enum Got_type
1690   {
1691     GOT_TYPE_STANDARD = 0       // GOT entry for a regular symbol
1692   };
1693
1694   typedef typename std::vector<Stub_table<big_endian>*> Stub_table_list;
1695
1696   // Map input section to Arm_input_section.
1697   typedef Unordered_map<Input_section_specifier,
1698                         Arm_input_section<big_endian>*,
1699                         Input_section_specifier::hash,
1700                         Input_section_specifier::equal_to>
1701           Arm_input_section_map;
1702     
1703   // The GOT section.
1704   Output_data_got<32, big_endian>* got_;
1705   // The PLT section.
1706   Output_data_plt_arm<big_endian>* plt_;
1707   // The GOT PLT section.
1708   Output_data_space* got_plt_;
1709   // The dynamic reloc section.
1710   Reloc_section* rel_dyn_;
1711   // Relocs saved to avoid a COPY reloc.
1712   Copy_relocs<elfcpp::SHT_REL, 32, big_endian> copy_relocs_;
1713   // Space for variables copied with a COPY reloc.
1714   Output_data_space* dynbss_;
1715   // Vector of Stub_tables created.
1716   Stub_table_list stub_tables_;
1717   // Stub factory.
1718   const Stub_factory &stub_factory_;
1719   // Whether we can use BLX.
1720   bool may_use_blx_;
1721   // Whether we force PIC branch veneers.
1722   bool should_force_pic_veneer_;
1723   // Map for locating Arm_input_sections.
1724   Arm_input_section_map arm_input_section_map_;
1725   // Attributes section data in output.
1726   Attributes_section_data* attributes_section_data_;
1727 };
1728
1729 template<bool big_endian>
1730 const Target::Target_info Target_arm<big_endian>::arm_info =
1731 {
1732   32,                   // size
1733   big_endian,           // is_big_endian
1734   elfcpp::EM_ARM,       // machine_code
1735   false,                // has_make_symbol
1736   false,                // has_resolve
1737   false,                // has_code_fill
1738   true,                 // is_default_stack_executable
1739   '\0',                 // wrap_char
1740   "/usr/lib/libc.so.1", // dynamic_linker
1741   0x8000,               // default_text_segment_address
1742   0x1000,               // abi_pagesize (overridable by -z max-page-size)
1743   0x1000,               // common_pagesize (overridable by -z common-page-size)
1744   elfcpp::SHN_UNDEF,    // small_common_shndx
1745   elfcpp::SHN_UNDEF,    // large_common_shndx
1746   0,                    // small_common_section_flags
1747   0,                    // large_common_section_flags
1748   ".ARM.attributes",    // attributes_section
1749   "aeabi"               // attributes_vendor
1750 };
1751
1752 // Arm relocate functions class
1753 //
1754
1755 template<bool big_endian>
1756 class Arm_relocate_functions : public Relocate_functions<32, big_endian>
1757 {
1758  public:
1759   typedef enum
1760   {
1761     STATUS_OKAY,        // No error during relocation.
1762     STATUS_OVERFLOW,    // Relocation oveflow.
1763     STATUS_BAD_RELOC    // Relocation cannot be applied.
1764   } Status;
1765
1766  private:
1767   typedef Relocate_functions<32, big_endian> Base;
1768   typedef Arm_relocate_functions<big_endian> This;
1769
1770   // Encoding of imm16 argument for movt and movw ARM instructions
1771   // from ARM ARM:
1772   //     
1773   //     imm16 := imm4 | imm12
1774   //
1775   //  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 
1776   // +-------+---------------+-------+-------+-----------------------+
1777   // |       |               |imm4   |       |imm12                  |
1778   // +-------+---------------+-------+-------+-----------------------+
1779
1780   // Extract the relocation addend from VAL based on the ARM
1781   // instruction encoding described above.
1782   static inline typename elfcpp::Swap<32, big_endian>::Valtype
1783   extract_arm_movw_movt_addend(
1784       typename elfcpp::Swap<32, big_endian>::Valtype val)
1785   {
1786     // According to the Elf ABI for ARM Architecture the immediate
1787     // field is sign-extended to form the addend.
1788     return utils::sign_extend<16>(((val >> 4) & 0xf000) | (val & 0xfff));
1789   }
1790
1791   // Insert X into VAL based on the ARM instruction encoding described
1792   // above.
1793   static inline typename elfcpp::Swap<32, big_endian>::Valtype
1794   insert_val_arm_movw_movt(
1795       typename elfcpp::Swap<32, big_endian>::Valtype val,
1796       typename elfcpp::Swap<32, big_endian>::Valtype x)
1797   {
1798     val &= 0xfff0f000;
1799     val |= x & 0x0fff;
1800     val |= (x & 0xf000) << 4;
1801     return val;
1802   }
1803
1804   // Encoding of imm16 argument for movt and movw Thumb2 instructions
1805   // from ARM ARM:
1806   //     
1807   //     imm16 := imm4 | i | imm3 | imm8
1808   //
1809   //  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 
1810   // +---------+-+-----------+-------++-+-----+-------+---------------+
1811   // |         |i|           |imm4   || |imm3 |       |imm8           |
1812   // +---------+-+-----------+-------++-+-----+-------+---------------+
1813
1814   // Extract the relocation addend from VAL based on the Thumb2
1815   // instruction encoding described above.
1816   static inline typename elfcpp::Swap<32, big_endian>::Valtype
1817   extract_thumb_movw_movt_addend(
1818       typename elfcpp::Swap<32, big_endian>::Valtype val)
1819   {
1820     // According to the Elf ABI for ARM Architecture the immediate
1821     // field is sign-extended to form the addend.
1822     return utils::sign_extend<16>(((val >> 4) & 0xf000)
1823                                   | ((val >> 15) & 0x0800)
1824                                   | ((val >> 4) & 0x0700)
1825                                   | (val & 0x00ff));
1826   }
1827
1828   // Insert X into VAL based on the Thumb2 instruction encoding
1829   // described above.
1830   static inline typename elfcpp::Swap<32, big_endian>::Valtype
1831   insert_val_thumb_movw_movt(
1832       typename elfcpp::Swap<32, big_endian>::Valtype val,
1833       typename elfcpp::Swap<32, big_endian>::Valtype x)
1834   {
1835     val &= 0xfbf08f00;
1836     val |= (x & 0xf000) << 4;
1837     val |= (x & 0x0800) << 15;
1838     val |= (x & 0x0700) << 4;
1839     val |= (x & 0x00ff);
1840     return val;
1841   }
1842
1843   // Handle ARM long branches.
1844   static typename This::Status
1845   arm_branch_common(unsigned int, const Relocate_info<32, big_endian>*,
1846                     unsigned char *, const Sized_symbol<32>*,
1847                     const Arm_relobj<big_endian>*, unsigned int,
1848                     const Symbol_value<32>*, Arm_address, Arm_address, bool);
1849
1850   // Handle THUMB long branches.
1851   static typename This::Status
1852   thumb_branch_common(unsigned int, const Relocate_info<32, big_endian>*,
1853                       unsigned char *, const Sized_symbol<32>*,
1854                       const Arm_relobj<big_endian>*, unsigned int,
1855                       const Symbol_value<32>*, Arm_address, Arm_address, bool);
1856
1857  public:
1858
1859   // R_ARM_ABS8: S + A
1860   static inline typename This::Status
1861   abs8(unsigned char *view,
1862        const Sized_relobj<32, big_endian>* object,
1863        const Symbol_value<32>* psymval)
1864   {
1865     typedef typename elfcpp::Swap<8, big_endian>::Valtype Valtype;
1866     typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
1867     Valtype* wv = reinterpret_cast<Valtype*>(view);
1868     Valtype val = elfcpp::Swap<8, big_endian>::readval(wv);
1869     Reltype addend = utils::sign_extend<8>(val);
1870     Reltype x = psymval->value(object, addend);
1871     val = utils::bit_select(val, x, 0xffU);
1872     elfcpp::Swap<8, big_endian>::writeval(wv, val);
1873     return (utils::has_signed_unsigned_overflow<8>(x)
1874             ? This::STATUS_OVERFLOW
1875             : This::STATUS_OKAY);
1876   }
1877
1878   // R_ARM_THM_ABS5: S + A
1879   static inline typename This::Status
1880   thm_abs5(unsigned char *view,
1881        const Sized_relobj<32, big_endian>* object,
1882        const Symbol_value<32>* psymval)
1883   {
1884     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
1885     typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
1886     Valtype* wv = reinterpret_cast<Valtype*>(view);
1887     Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
1888     Reltype addend = (val & 0x7e0U) >> 6;
1889     Reltype x = psymval->value(object, addend);
1890     val = utils::bit_select(val, x << 6, 0x7e0U);
1891     elfcpp::Swap<16, big_endian>::writeval(wv, val);
1892     return (utils::has_overflow<5>(x)
1893             ? This::STATUS_OVERFLOW
1894             : This::STATUS_OKAY);
1895   }
1896
1897   // R_ARM_ABS12: S + A
1898   static inline typename This::Status
1899   abs12(unsigned char *view,
1900         const Sized_relobj<32, big_endian>* object,
1901         const Symbol_value<32>* psymval)
1902   {
1903     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
1904     typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
1905     Valtype* wv = reinterpret_cast<Valtype*>(view);
1906     Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
1907     Reltype addend = val & 0x0fffU;
1908     Reltype x = psymval->value(object, addend);
1909     val = utils::bit_select(val, x, 0x0fffU);
1910     elfcpp::Swap<32, big_endian>::writeval(wv, val);
1911     return (utils::has_overflow<12>(x)
1912             ? This::STATUS_OVERFLOW
1913             : This::STATUS_OKAY);
1914   }
1915
1916   // R_ARM_ABS16: S + A
1917   static inline typename This::Status
1918   abs16(unsigned char *view,
1919         const Sized_relobj<32, big_endian>* object,
1920         const Symbol_value<32>* psymval)
1921   {
1922     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
1923     typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
1924     Valtype* wv = reinterpret_cast<Valtype*>(view);
1925     Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
1926     Reltype addend = utils::sign_extend<16>(val);
1927     Reltype x = psymval->value(object, addend);
1928     val = utils::bit_select(val, x, 0xffffU);
1929     elfcpp::Swap<16, big_endian>::writeval(wv, val);
1930     return (utils::has_signed_unsigned_overflow<16>(x)
1931             ? This::STATUS_OVERFLOW
1932             : This::STATUS_OKAY);
1933   }
1934
1935   // R_ARM_ABS32: (S + A) | T
1936   static inline typename This::Status
1937   abs32(unsigned char *view,
1938         const Sized_relobj<32, big_endian>* object,
1939         const Symbol_value<32>* psymval,
1940         Arm_address thumb_bit)
1941   {
1942     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
1943     Valtype* wv = reinterpret_cast<Valtype*>(view);
1944     Valtype addend = elfcpp::Swap<32, big_endian>::readval(wv);
1945     Valtype x = psymval->value(object, addend) | thumb_bit;
1946     elfcpp::Swap<32, big_endian>::writeval(wv, x);
1947     return This::STATUS_OKAY;
1948   }
1949
1950   // R_ARM_REL32: (S + A) | T - P
1951   static inline typename This::Status
1952   rel32(unsigned char *view,
1953         const Sized_relobj<32, big_endian>* object,
1954         const Symbol_value<32>* psymval,
1955         Arm_address address,
1956         Arm_address thumb_bit)
1957   {
1958     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
1959     Valtype* wv = reinterpret_cast<Valtype*>(view);
1960     Valtype addend = elfcpp::Swap<32, big_endian>::readval(wv);
1961     Valtype x = (psymval->value(object, addend) | thumb_bit) - address;
1962     elfcpp::Swap<32, big_endian>::writeval(wv, x);
1963     return This::STATUS_OKAY;
1964   }
1965
1966   // R_ARM_THM_CALL: (S + A) | T - P
1967   static inline typename This::Status
1968   thm_call(const Relocate_info<32, big_endian>* relinfo, unsigned char *view,
1969            const Sized_symbol<32>* gsym, const Arm_relobj<big_endian>* object,
1970            unsigned int r_sym, const Symbol_value<32>* psymval,
1971            Arm_address address, Arm_address thumb_bit,
1972            bool is_weakly_undefined_without_plt)
1973   {
1974     return thumb_branch_common(elfcpp::R_ARM_THM_CALL, relinfo, view, gsym,
1975                                object, r_sym, psymval, address, thumb_bit,
1976                                is_weakly_undefined_without_plt);
1977   }
1978
1979   // R_ARM_THM_JUMP24: (S + A) | T - P
1980   static inline typename This::Status
1981   thm_jump24(const Relocate_info<32, big_endian>* relinfo, unsigned char *view,
1982              const Sized_symbol<32>* gsym, const Arm_relobj<big_endian>* object,
1983              unsigned int r_sym, const Symbol_value<32>* psymval,
1984              Arm_address address, Arm_address thumb_bit,
1985              bool is_weakly_undefined_without_plt)
1986   {
1987     return thumb_branch_common(elfcpp::R_ARM_THM_JUMP24, relinfo, view, gsym,
1988                                object, r_sym, psymval, address, thumb_bit,
1989                                is_weakly_undefined_without_plt);
1990   }
1991
1992   // R_ARM_THM_XPC22: (S + A) | T - P
1993   static inline typename This::Status
1994   thm_xpc22(const Relocate_info<32, big_endian>* relinfo, unsigned char *view,
1995             const Sized_symbol<32>* gsym, const Arm_relobj<big_endian>* object,
1996             unsigned int r_sym, const Symbol_value<32>* psymval,
1997             Arm_address address, Arm_address thumb_bit,
1998             bool is_weakly_undefined_without_plt)
1999   {
2000     return thumb_branch_common(elfcpp::R_ARM_THM_XPC22, relinfo, view, gsym,
2001                                object, r_sym, psymval, address, thumb_bit,
2002                                is_weakly_undefined_without_plt);
2003   }
2004
2005   // R_ARM_BASE_PREL: B(S) + A - P
2006   static inline typename This::Status
2007   base_prel(unsigned char* view,
2008             Arm_address origin,
2009             Arm_address address)
2010   {
2011     Base::rel32(view, origin - address);
2012     return STATUS_OKAY;
2013   }
2014
2015   // R_ARM_BASE_ABS: B(S) + A
2016   static inline typename This::Status
2017   base_abs(unsigned char* view,
2018            Arm_address origin)
2019   {
2020     Base::rel32(view, origin);
2021     return STATUS_OKAY;
2022   }
2023
2024   // R_ARM_GOT_BREL: GOT(S) + A - GOT_ORG
2025   static inline typename This::Status
2026   got_brel(unsigned char* view,
2027            typename elfcpp::Swap<32, big_endian>::Valtype got_offset)
2028   {
2029     Base::rel32(view, got_offset);
2030     return This::STATUS_OKAY;
2031   }
2032
2033   // R_ARM_GOT_PREL: GOT(S) + A - P
2034   static inline typename This::Status
2035   got_prel(unsigned char *view,
2036            Arm_address got_entry,
2037            Arm_address address)
2038   {
2039     Base::rel32(view, got_entry - address);
2040     return This::STATUS_OKAY;
2041   }
2042
2043   // R_ARM_PLT32: (S + A) | T - P
2044   static inline typename This::Status
2045   plt32(const Relocate_info<32, big_endian>* relinfo,
2046         unsigned char *view,
2047         const Sized_symbol<32>* gsym,
2048         const Arm_relobj<big_endian>* object,
2049         unsigned int r_sym,
2050         const Symbol_value<32>* psymval,
2051         Arm_address address,
2052         Arm_address thumb_bit,
2053         bool is_weakly_undefined_without_plt)
2054   {
2055     return arm_branch_common(elfcpp::R_ARM_PLT32, relinfo, view, gsym,
2056                              object, r_sym, psymval, address, thumb_bit,
2057                              is_weakly_undefined_without_plt);
2058   }
2059
2060   // R_ARM_XPC25: (S + A) | T - P
2061   static inline typename This::Status
2062   xpc25(const Relocate_info<32, big_endian>* relinfo,
2063         unsigned char *view,
2064         const Sized_symbol<32>* gsym,
2065         const Arm_relobj<big_endian>* object,
2066         unsigned int r_sym,
2067         const Symbol_value<32>* psymval,
2068         Arm_address address,
2069         Arm_address thumb_bit,
2070         bool is_weakly_undefined_without_plt)
2071   {
2072     return arm_branch_common(elfcpp::R_ARM_XPC25, relinfo, view, gsym,
2073                              object, r_sym, psymval, address, thumb_bit,
2074                              is_weakly_undefined_without_plt);
2075   }
2076
2077   // R_ARM_CALL: (S + A) | T - P
2078   static inline typename This::Status
2079   call(const Relocate_info<32, big_endian>* relinfo,
2080        unsigned char *view,
2081        const Sized_symbol<32>* gsym,
2082        const Arm_relobj<big_endian>* object,
2083        unsigned int r_sym,
2084        const Symbol_value<32>* psymval,
2085        Arm_address address,
2086        Arm_address thumb_bit,
2087        bool is_weakly_undefined_without_plt)
2088   {
2089     return arm_branch_common(elfcpp::R_ARM_CALL, relinfo, view, gsym,
2090                              object, r_sym, psymval, address, thumb_bit,
2091                              is_weakly_undefined_without_plt);
2092   }
2093
2094   // R_ARM_JUMP24: (S + A) | T - P
2095   static inline typename This::Status
2096   jump24(const Relocate_info<32, big_endian>* relinfo,
2097          unsigned char *view,
2098          const Sized_symbol<32>* gsym,
2099          const Arm_relobj<big_endian>* object,
2100          unsigned int r_sym,
2101          const Symbol_value<32>* psymval,
2102          Arm_address address,
2103          Arm_address thumb_bit,
2104          bool is_weakly_undefined_without_plt)
2105   {
2106     return arm_branch_common(elfcpp::R_ARM_JUMP24, relinfo, view, gsym,
2107                              object, r_sym, psymval, address, thumb_bit,
2108                              is_weakly_undefined_without_plt);
2109   }
2110
2111   // R_ARM_PREL: (S + A) | T - P
2112   static inline typename This::Status
2113   prel31(unsigned char *view,
2114          const Sized_relobj<32, big_endian>* object,
2115          const Symbol_value<32>* psymval,
2116          Arm_address address,
2117          Arm_address thumb_bit)
2118   {
2119     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
2120     Valtype* wv = reinterpret_cast<Valtype*>(view);
2121     Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
2122     Valtype addend = utils::sign_extend<31>(val);
2123     Valtype x = (psymval->value(object, addend) | thumb_bit) - address;
2124     val = utils::bit_select(val, x, 0x7fffffffU);
2125     elfcpp::Swap<32, big_endian>::writeval(wv, val);
2126     return (utils::has_overflow<31>(x) ?
2127             This::STATUS_OVERFLOW : This::STATUS_OKAY);
2128   }
2129
2130   // R_ARM_MOVW_ABS_NC: (S + A) | T
2131   static inline typename This::Status 
2132   movw_abs_nc(unsigned char *view,
2133               const Sized_relobj<32, big_endian>* object,
2134               const Symbol_value<32>* psymval,
2135               Arm_address thumb_bit)
2136   {
2137     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
2138     Valtype* wv = reinterpret_cast<Valtype*>(view);
2139     Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
2140     Valtype addend =  This::extract_arm_movw_movt_addend(val);
2141     Valtype x = psymval->value(object, addend) | thumb_bit;
2142     val = This::insert_val_arm_movw_movt(val, x);
2143     elfcpp::Swap<32, big_endian>::writeval(wv, val);
2144     return This::STATUS_OKAY;
2145   }
2146
2147   // R_ARM_MOVT_ABS: S + A
2148   static inline typename This::Status
2149   movt_abs(unsigned char *view,
2150            const Sized_relobj<32, big_endian>* object,
2151            const Symbol_value<32>* psymval)
2152   {
2153     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
2154     Valtype* wv = reinterpret_cast<Valtype*>(view);
2155     Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
2156     Valtype addend = This::extract_arm_movw_movt_addend(val);
2157     Valtype x = psymval->value(object, addend) >> 16;
2158     val = This::insert_val_arm_movw_movt(val, x);
2159     elfcpp::Swap<32, big_endian>::writeval(wv, val);
2160     return This::STATUS_OKAY;
2161   }
2162
2163   //  R_ARM_THM_MOVW_ABS_NC: S + A | T
2164   static inline typename This::Status 
2165   thm_movw_abs_nc(unsigned char *view,
2166                   const Sized_relobj<32, big_endian>* object,
2167                   const Symbol_value<32>* psymval,
2168                   Arm_address thumb_bit)
2169   {
2170     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
2171     typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
2172     Valtype* wv = reinterpret_cast<Valtype*>(view);
2173     Reltype val = ((elfcpp::Swap<16, big_endian>::readval(wv) << 16)
2174                    | elfcpp::Swap<16, big_endian>::readval(wv + 1));
2175     Reltype addend = extract_thumb_movw_movt_addend(val);
2176     Reltype x = psymval->value(object, addend) | thumb_bit;
2177     val = This::insert_val_thumb_movw_movt(val, x);
2178     elfcpp::Swap<16, big_endian>::writeval(wv, val >> 16);
2179     elfcpp::Swap<16, big_endian>::writeval(wv + 1, val & 0xffff);
2180     return This::STATUS_OKAY;
2181   }
2182
2183   //  R_ARM_THM_MOVT_ABS: S + A
2184   static inline typename This::Status 
2185   thm_movt_abs(unsigned char *view,
2186                const Sized_relobj<32, big_endian>* object,
2187                const Symbol_value<32>* psymval)
2188   {
2189     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
2190     typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
2191     Valtype* wv = reinterpret_cast<Valtype*>(view);
2192     Reltype val = ((elfcpp::Swap<16, big_endian>::readval(wv) << 16)
2193                    | elfcpp::Swap<16, big_endian>::readval(wv + 1));
2194     Reltype addend = This::extract_thumb_movw_movt_addend(val);
2195     Reltype x = psymval->value(object, addend) >> 16;
2196     val = This::insert_val_thumb_movw_movt(val, x);
2197     elfcpp::Swap<16, big_endian>::writeval(wv, val >> 16);
2198     elfcpp::Swap<16, big_endian>::writeval(wv + 1, val & 0xffff);
2199     return This::STATUS_OKAY;
2200   }
2201
2202   // R_ARM_MOVW_PREL_NC: (S + A) | T - P
2203   static inline typename This::Status
2204   movw_prel_nc(unsigned char *view,
2205                const Sized_relobj<32, big_endian>* object,
2206                const Symbol_value<32>* psymval,
2207                Arm_address address,
2208                Arm_address thumb_bit)
2209   {
2210     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
2211     Valtype* wv = reinterpret_cast<Valtype*>(view);
2212     Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
2213     Valtype addend = This::extract_arm_movw_movt_addend(val);
2214     Valtype x = (psymval->value(object, addend) | thumb_bit) - address;
2215     val = This::insert_val_arm_movw_movt(val, x);
2216     elfcpp::Swap<32, big_endian>::writeval(wv, val);
2217     return This::STATUS_OKAY;
2218   }
2219
2220   // R_ARM_MOVT_PREL: S + A - P
2221   static inline typename This::Status
2222   movt_prel(unsigned char *view,
2223             const Sized_relobj<32, big_endian>* object,
2224             const Symbol_value<32>* psymval,
2225             Arm_address address)
2226   {
2227     typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
2228     Valtype* wv = reinterpret_cast<Valtype*>(view);
2229     Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
2230     Valtype addend = This::extract_arm_movw_movt_addend(val);
2231     Valtype x = (psymval->value(object, addend) - address) >> 16;
2232     val = This::insert_val_arm_movw_movt(val, x);
2233     elfcpp::Swap<32, big_endian>::writeval(wv, val);
2234     return This::STATUS_OKAY;
2235   }
2236
2237   // R_ARM_THM_MOVW_PREL_NC: (S + A) | T - P
2238   static inline typename This::Status
2239   thm_movw_prel_nc(unsigned char *view,
2240                    const Sized_relobj<32, big_endian>* object,
2241                    const Symbol_value<32>* psymval,
2242                    Arm_address address,
2243                    Arm_address thumb_bit)
2244   {
2245     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
2246     typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
2247     Valtype* wv = reinterpret_cast<Valtype*>(view);
2248     Reltype val = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
2249                   | elfcpp::Swap<16, big_endian>::readval(wv + 1);
2250     Reltype addend = This::extract_thumb_movw_movt_addend(val);
2251     Reltype x = (psymval->value(object, addend) | thumb_bit) - address;
2252     val = This::insert_val_thumb_movw_movt(val, x);
2253     elfcpp::Swap<16, big_endian>::writeval(wv, val >> 16);
2254     elfcpp::Swap<16, big_endian>::writeval(wv + 1, val & 0xffff);
2255     return This::STATUS_OKAY;
2256   }
2257
2258   // R_ARM_THM_MOVT_PREL: S + A - P
2259   static inline typename This::Status
2260   thm_movt_prel(unsigned char *view,
2261                 const Sized_relobj<32, big_endian>* object,
2262                 const Symbol_value<32>* psymval,
2263                 Arm_address address)
2264   {
2265     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
2266     typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
2267     Valtype* wv = reinterpret_cast<Valtype*>(view);
2268     Reltype val = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
2269                   | elfcpp::Swap<16, big_endian>::readval(wv + 1);
2270     Reltype addend = This::extract_thumb_movw_movt_addend(val);
2271     Reltype x = (psymval->value(object, addend) - address) >> 16;
2272     val = This::insert_val_thumb_movw_movt(val, x);
2273     elfcpp::Swap<16, big_endian>::writeval(wv, val >> 16);
2274     elfcpp::Swap<16, big_endian>::writeval(wv + 1, val & 0xffff);
2275     return This::STATUS_OKAY;
2276   }
2277 };
2278
2279 // Relocate ARM long branches.  This handles relocation types
2280 // R_ARM_CALL, R_ARM_JUMP24, R_ARM_PLT32 and R_ARM_XPC25.
2281 // If IS_WEAK_UNDEFINED_WITH_PLT is true.  The target symbol is weakly
2282 // undefined and we do not use PLT in this relocation.  In such a case,
2283 // the branch is converted into an NOP.
2284
2285 template<bool big_endian>
2286 typename Arm_relocate_functions<big_endian>::Status
2287 Arm_relocate_functions<big_endian>::arm_branch_common(
2288     unsigned int r_type,
2289     const Relocate_info<32, big_endian>* relinfo,
2290     unsigned char *view,
2291     const Sized_symbol<32>* gsym,
2292     const Arm_relobj<big_endian>* object,
2293     unsigned int r_sym,
2294     const Symbol_value<32>* psymval,
2295     Arm_address address,
2296     Arm_address thumb_bit,
2297     bool is_weakly_undefined_without_plt)
2298 {
2299   typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
2300   Valtype* wv = reinterpret_cast<Valtype*>(view);
2301   Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
2302      
2303   bool insn_is_b = (((val >> 28) & 0xf) <= 0xe)
2304                     && ((val & 0x0f000000UL) == 0x0a000000UL);
2305   bool insn_is_uncond_bl = (val & 0xff000000UL) == 0xeb000000UL;
2306   bool insn_is_cond_bl = (((val >> 28) & 0xf) < 0xe)
2307                           && ((val & 0x0f000000UL) == 0x0b000000UL);
2308   bool insn_is_blx = (val & 0xfe000000UL) == 0xfa000000UL;
2309   bool insn_is_any_branch = (val & 0x0e000000UL) == 0x0a000000UL;
2310
2311   // Check that the instruction is valid.
2312   if (r_type == elfcpp::R_ARM_CALL)
2313     {
2314       if (!insn_is_uncond_bl && !insn_is_blx)
2315         return This::STATUS_BAD_RELOC;
2316     }
2317   else if (r_type == elfcpp::R_ARM_JUMP24)
2318     {
2319       if (!insn_is_b && !insn_is_cond_bl)
2320         return This::STATUS_BAD_RELOC;
2321     }
2322   else if (r_type == elfcpp::R_ARM_PLT32)
2323     {
2324       if (!insn_is_any_branch)
2325         return This::STATUS_BAD_RELOC;
2326     }
2327   else if (r_type == elfcpp::R_ARM_XPC25)
2328     {
2329       // FIXME: AAELF document IH0044C does not say much about it other
2330       // than it being obsolete.
2331       if (!insn_is_any_branch)
2332         return This::STATUS_BAD_RELOC;
2333     }
2334   else
2335     gold_unreachable();
2336
2337   // A branch to an undefined weak symbol is turned into a jump to
2338   // the next instruction unless a PLT entry will be created.
2339   // Do the same for local undefined symbols.
2340   // The jump to the next instruction is optimized as a NOP depending
2341   // on the architecture.
2342   const Target_arm<big_endian>* arm_target =
2343     Target_arm<big_endian>::default_target();
2344   if (is_weakly_undefined_without_plt)
2345     {
2346       Valtype cond = val & 0xf0000000U;
2347       if (arm_target->may_use_arm_nop())
2348         val = cond | 0x0320f000;
2349       else
2350         val = cond | 0x01a00000;        // Using pre-UAL nop: mov r0, r0.
2351       elfcpp::Swap<32, big_endian>::writeval(wv, val);
2352       return This::STATUS_OKAY;
2353     }
2354  
2355   Valtype addend = utils::sign_extend<26>(val << 2);
2356   Valtype branch_target = psymval->value(object, addend);
2357   int32_t branch_offset = branch_target - address;
2358
2359   // We need a stub if the branch offset is too large or if we need
2360   // to switch mode.
2361   bool may_use_blx = arm_target->may_use_blx();
2362   Reloc_stub* stub = NULL;
2363   if ((branch_offset > ARM_MAX_FWD_BRANCH_OFFSET)
2364       || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET)
2365       || ((thumb_bit != 0) && !(may_use_blx && r_type == elfcpp::R_ARM_CALL)))
2366     {
2367       Stub_type stub_type =
2368         Reloc_stub::stub_type_for_reloc(r_type, address, branch_target,
2369                                         (thumb_bit != 0));
2370       if (stub_type != arm_stub_none)
2371         {
2372           Stub_table<big_endian>* stub_table =
2373             object->stub_table(relinfo->data_shndx);
2374           gold_assert(stub_table != NULL);
2375
2376           Reloc_stub::Key stub_key(stub_type, gsym, object, r_sym, addend);
2377           stub = stub_table->find_reloc_stub(stub_key);
2378           gold_assert(stub != NULL);
2379           thumb_bit = stub->stub_template()->entry_in_thumb_mode() ? 1 : 0;
2380           branch_target = stub_table->address() + stub->offset() + addend;
2381           branch_offset = branch_target - address;
2382           gold_assert((branch_offset <= ARM_MAX_FWD_BRANCH_OFFSET)
2383                       && (branch_offset >= ARM_MAX_BWD_BRANCH_OFFSET));
2384         }
2385     }
2386
2387   // At this point, if we still need to switch mode, the instruction
2388   // must either be a BLX or a BL that can be converted to a BLX.
2389   if (thumb_bit != 0)
2390     {
2391       // Turn BL to BLX.
2392       gold_assert(may_use_blx && r_type == elfcpp::R_ARM_CALL);
2393       val = (val & 0xffffff) | 0xfa000000 | ((branch_offset & 2) << 23);
2394     }
2395
2396   val = utils::bit_select(val, (branch_offset >> 2), 0xffffffUL);
2397   elfcpp::Swap<32, big_endian>::writeval(wv, val);
2398   return (utils::has_overflow<26>(branch_offset)
2399           ? This::STATUS_OVERFLOW : This::STATUS_OKAY);
2400 }
2401
2402 // Relocate THUMB long branches.  This handles relocation types
2403 // R_ARM_THM_CALL, R_ARM_THM_JUMP24 and R_ARM_THM_XPC22.
2404 // If IS_WEAK_UNDEFINED_WITH_PLT is true.  The target symbol is weakly
2405 // undefined and we do not use PLT in this relocation.  In such a case,
2406 // the branch is converted into an NOP.
2407
2408 template<bool big_endian>
2409 typename Arm_relocate_functions<big_endian>::Status
2410 Arm_relocate_functions<big_endian>::thumb_branch_common(
2411     unsigned int r_type,
2412     const Relocate_info<32, big_endian>* relinfo,
2413     unsigned char *view,
2414     const Sized_symbol<32>* gsym,
2415     const Arm_relobj<big_endian>* object,
2416     unsigned int r_sym,
2417     const Symbol_value<32>* psymval,
2418     Arm_address address,
2419     Arm_address thumb_bit,
2420     bool is_weakly_undefined_without_plt)
2421 {
2422   typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
2423   Valtype* wv = reinterpret_cast<Valtype*>(view);
2424   uint32_t upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
2425   uint32_t lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
2426
2427   // FIXME: These tests are too loose and do not take THUMB/THUMB-2 difference
2428   // into account.
2429   bool is_bl_insn = (lower_insn & 0x1000U) == 0x1000U;
2430   bool is_blx_insn = (lower_insn & 0x1000U) == 0x0000U;
2431      
2432   // Check that the instruction is valid.
2433   if (r_type == elfcpp::R_ARM_THM_CALL)
2434     {
2435       if (!is_bl_insn && !is_blx_insn)
2436         return This::STATUS_BAD_RELOC;
2437     }
2438   else if (r_type == elfcpp::R_ARM_THM_JUMP24)
2439     {
2440       // This cannot be a BLX.
2441       if (!is_bl_insn)
2442         return This::STATUS_BAD_RELOC;
2443     }
2444   else if (r_type == elfcpp::R_ARM_THM_XPC22)
2445     {
2446       // Check for Thumb to Thumb call.
2447       if (!is_blx_insn)
2448         return This::STATUS_BAD_RELOC;
2449       if (thumb_bit != 0)
2450         {
2451           gold_warning(_("%s: Thumb BLX instruction targets "
2452                          "thumb function '%s'."),
2453                          object->name().c_str(),
2454                          (gsym ? gsym->name() : "(local)")); 
2455           // Convert BLX to BL.
2456           lower_insn |= 0x1000U;
2457         }
2458     }
2459   else
2460     gold_unreachable();
2461
2462   // A branch to an undefined weak symbol is turned into a jump to
2463   // the next instruction unless a PLT entry will be created.
2464   // The jump to the next instruction is optimized as a NOP.W for
2465   // Thumb-2 enabled architectures.
2466   const Target_arm<big_endian>* arm_target =
2467     Target_arm<big_endian>::default_target();
2468   if (is_weakly_undefined_without_plt)
2469     {
2470       if (arm_target->may_use_thumb2_nop())
2471         {
2472           elfcpp::Swap<16, big_endian>::writeval(wv, 0xf3af);
2473           elfcpp::Swap<16, big_endian>::writeval(wv + 1, 0x8000);
2474         }
2475       else
2476         {
2477           elfcpp::Swap<16, big_endian>::writeval(wv, 0xe000);
2478           elfcpp::Swap<16, big_endian>::writeval(wv + 1, 0xbf00);
2479         }
2480       return This::STATUS_OKAY;
2481     }
2482  
2483   // Fetch the addend.  We use the Thumb-2 encoding (backwards compatible
2484   // with Thumb-1) involving the J1 and J2 bits.
2485   uint32_t s = (upper_insn & (1 << 10)) >> 10;
2486   uint32_t upper = upper_insn & 0x3ff;
2487   uint32_t lower = lower_insn & 0x7ff;
2488   uint32_t j1 = (lower_insn & (1 << 13)) >> 13;
2489   uint32_t j2 = (lower_insn & (1 << 11)) >> 11;
2490   uint32_t i1 = j1 ^ s ? 0 : 1;
2491   uint32_t i2 = j2 ^ s ? 0 : 1;
2492  
2493   int32_t addend = (i1 << 23) | (i2 << 22) | (upper << 12) | (lower << 1);
2494   // Sign extend.
2495   addend = (addend | ((s ? 0 : 1) << 24)) - (1 << 24);
2496
2497   Arm_address branch_target = psymval->value(object, addend);
2498   int32_t branch_offset = branch_target - address;
2499
2500   // We need a stub if the branch offset is too large or if we need
2501   // to switch mode.
2502   bool may_use_blx = arm_target->may_use_blx();
2503   bool thumb2 = arm_target->using_thumb2();
2504   if ((!thumb2
2505        && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
2506            || (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
2507       || (thumb2
2508           && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
2509               || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
2510       || ((thumb_bit == 0)
2511           && (((r_type == elfcpp::R_ARM_THM_CALL) && !may_use_blx)
2512               || r_type == elfcpp::R_ARM_THM_JUMP24)))
2513     {
2514       Stub_type stub_type =
2515         Reloc_stub::stub_type_for_reloc(r_type, address, branch_target,
2516                                         (thumb_bit != 0));
2517       if (stub_type != arm_stub_none)
2518         {
2519           Stub_table<big_endian>* stub_table =
2520             object->stub_table(relinfo->data_shndx);
2521           gold_assert(stub_table != NULL);
2522
2523           Reloc_stub::Key stub_key(stub_type, gsym, object, r_sym, addend);
2524           Reloc_stub* stub = stub_table->find_reloc_stub(stub_key);
2525           gold_assert(stub != NULL);
2526           thumb_bit = stub->stub_template()->entry_in_thumb_mode() ? 1 : 0;
2527           branch_target = stub_table->address() + stub->offset() + addend;
2528           branch_offset = branch_target - address;
2529         }
2530     }
2531
2532   // At this point, if we still need to switch mode, the instruction
2533   // must either be a BLX or a BL that can be converted to a BLX.
2534   if (thumb_bit == 0)
2535     {
2536       gold_assert(may_use_blx
2537                   && (r_type == elfcpp::R_ARM_THM_CALL
2538                       || r_type == elfcpp::R_ARM_THM_XPC22));
2539       // Make sure this is a BLX.
2540       lower_insn &= ~0x1000U;
2541     }
2542   else
2543     {
2544       // Make sure this is a BL.
2545       lower_insn |= 0x1000U;
2546     }
2547
2548   uint32_t reloc_sign = (branch_offset < 0) ? 1 : 0;
2549   uint32_t relocation = static_cast<uint32_t>(branch_offset);
2550
2551   if ((lower_insn & 0x5000U) == 0x4000U)
2552     // For a BLX instruction, make sure that the relocation is rounded up
2553     // to a word boundary.  This follows the semantics of the instruction
2554     // which specifies that bit 1 of the target address will come from bit
2555     // 1 of the base address.
2556     relocation = (relocation + 2U) & ~3U;
2557
2558   // Put BRANCH_OFFSET back into the insn.  Assumes two's complement.
2559   // We use the Thumb-2 encoding, which is safe even if dealing with
2560   // a Thumb-1 instruction by virtue of our overflow check above.  */
2561   upper_insn = (upper_insn & ~0x7ffU)
2562                 | ((relocation >> 12) & 0x3ffU)
2563                 | (reloc_sign << 10);
2564   lower_insn = (lower_insn & ~0x2fffU)
2565                 | (((!((relocation >> 23) & 1U)) ^ reloc_sign) << 13)
2566                 | (((!((relocation >> 22) & 1U)) ^ reloc_sign) << 11)
2567                 | ((relocation >> 1) & 0x7ffU);
2568
2569   elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
2570   elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
2571
2572   return ((thumb2
2573            ? utils::has_overflow<25>(relocation)
2574            : utils::has_overflow<23>(relocation))
2575           ? This::STATUS_OVERFLOW
2576           : This::STATUS_OKAY);
2577 }
2578
2579 // Get the GOT section, creating it if necessary.
2580
2581 template<bool big_endian>
2582 Output_data_got<32, big_endian>*
2583 Target_arm<big_endian>::got_section(Symbol_table* symtab, Layout* layout)
2584 {
2585   if (this->got_ == NULL)
2586     {
2587       gold_assert(symtab != NULL && layout != NULL);
2588
2589       this->got_ = new Output_data_got<32, big_endian>();
2590
2591       Output_section* os;
2592       os = layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
2593                                            (elfcpp::SHF_ALLOC
2594                                             | elfcpp::SHF_WRITE),
2595                                            this->got_, false, true, true,
2596                                            false);
2597
2598       // The old GNU linker creates a .got.plt section.  We just
2599       // create another set of data in the .got section.  Note that we
2600       // always create a PLT if we create a GOT, although the PLT
2601       // might be empty.
2602       this->got_plt_ = new Output_data_space(4, "** GOT PLT");
2603       os = layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
2604                                            (elfcpp::SHF_ALLOC
2605                                             | elfcpp::SHF_WRITE),
2606                                            this->got_plt_, false, false,
2607                                            false, true);
2608
2609       // The first three entries are reserved.
2610       this->got_plt_->set_current_data_size(3 * 4);
2611
2612       // Define _GLOBAL_OFFSET_TABLE_ at the start of the PLT.
2613       symtab->define_in_output_data("_GLOBAL_OFFSET_TABLE_", NULL,
2614                                     Symbol_table::PREDEFINED,
2615                                     this->got_plt_,
2616                                     0, 0, elfcpp::STT_OBJECT,
2617                                     elfcpp::STB_LOCAL,
2618                                     elfcpp::STV_HIDDEN, 0,
2619                                     false, false);
2620     }
2621   return this->got_;
2622 }
2623
2624 // Get the dynamic reloc section, creating it if necessary.
2625
2626 template<bool big_endian>
2627 typename Target_arm<big_endian>::Reloc_section*
2628 Target_arm<big_endian>::rel_dyn_section(Layout* layout)
2629 {
2630   if (this->rel_dyn_ == NULL)
2631     {
2632       gold_assert(layout != NULL);
2633       this->rel_dyn_ = new Reloc_section(parameters->options().combreloc());
2634       layout->add_output_section_data(".rel.dyn", elfcpp::SHT_REL,
2635                                       elfcpp::SHF_ALLOC, this->rel_dyn_, true,
2636                                       false, false, false);
2637     }
2638   return this->rel_dyn_;
2639 }
2640
2641 // Insn_template methods.
2642
2643 // Return byte size of an instruction template.
2644
2645 size_t
2646 Insn_template::size() const
2647 {
2648   switch (this->type())
2649     {
2650     case THUMB16_TYPE:
2651       return 2;
2652     case ARM_TYPE:
2653     case THUMB32_TYPE:
2654     case DATA_TYPE:
2655       return 4;
2656     default:
2657       gold_unreachable();
2658     }
2659 }
2660
2661 // Return alignment of an instruction template.
2662
2663 unsigned
2664 Insn_template::alignment() const
2665 {
2666   switch (this->type())
2667     {
2668     case THUMB16_TYPE:
2669     case THUMB32_TYPE:
2670       return 2;
2671     case ARM_TYPE:
2672     case DATA_TYPE:
2673       return 4;
2674     default:
2675       gold_unreachable();
2676     }
2677 }
2678
2679 // Stub_template methods.
2680
2681 Stub_template::Stub_template(
2682     Stub_type type, const Insn_template* insns,
2683      size_t insn_count)
2684   : type_(type), insns_(insns), insn_count_(insn_count), alignment_(1),
2685     entry_in_thumb_mode_(false), relocs_()
2686 {
2687   off_t offset = 0;
2688
2689   // Compute byte size and alignment of stub template.
2690   for (size_t i = 0; i < insn_count; i++)
2691     {
2692       unsigned insn_alignment = insns[i].alignment();
2693       size_t insn_size = insns[i].size();
2694       gold_assert((offset & (insn_alignment - 1)) == 0);
2695       this->alignment_ = std::max(this->alignment_, insn_alignment);
2696       switch (insns[i].type())
2697         {
2698         case Insn_template::THUMB16_TYPE:
2699           if (i == 0)
2700             this->entry_in_thumb_mode_ = true;
2701           break;
2702
2703         case Insn_template::THUMB32_TYPE:
2704           if (insns[i].r_type() != elfcpp::R_ARM_NONE)
2705             this->relocs_.push_back(Reloc(i, offset));
2706           if (i == 0)
2707             this->entry_in_thumb_mode_ = true;
2708           break;
2709
2710         case Insn_template::ARM_TYPE:
2711           // Handle cases where the target is encoded within the
2712           // instruction.
2713           if (insns[i].r_type() == elfcpp::R_ARM_JUMP24)
2714             this->relocs_.push_back(Reloc(i, offset));
2715           break;
2716
2717         case Insn_template::DATA_TYPE:
2718           // Entry point cannot be data.
2719           gold_assert(i != 0);
2720           this->relocs_.push_back(Reloc(i, offset));
2721           break;
2722
2723         default:
2724           gold_unreachable();
2725         }
2726       offset += insn_size; 
2727     }
2728   this->size_ = offset;
2729 }
2730
2731 // Reloc_stub::Key methods.
2732
2733 // Dump a Key as a string for debugging.
2734
2735 std::string
2736 Reloc_stub::Key::name() const
2737 {
2738   if (this->r_sym_ == invalid_index)
2739     {
2740       // Global symbol key name
2741       // <stub-type>:<symbol name>:<addend>.
2742       const std::string sym_name = this->u_.symbol->name();
2743       // We need to print two hex number and two colons.  So just add 100 bytes
2744       // to the symbol name size.
2745       size_t len = sym_name.size() + 100;
2746       char* buffer = new char[len];
2747       int c = snprintf(buffer, len, "%d:%s:%x", this->stub_type_,
2748                        sym_name.c_str(), this->addend_);
2749       gold_assert(c > 0 && c < static_cast<int>(len));
2750       delete[] buffer;
2751       return std::string(buffer);
2752     }
2753   else
2754     {
2755       // local symbol key name
2756       // <stub-type>:<object>:<r_sym>:<addend>.
2757       const size_t len = 200;
2758       char buffer[len];
2759       int c = snprintf(buffer, len, "%d:%p:%u:%x", this->stub_type_,
2760                        this->u_.relobj, this->r_sym_, this->addend_);
2761       gold_assert(c > 0 && c < static_cast<int>(len));
2762       return std::string(buffer);
2763     }
2764 }
2765
2766 // Reloc_stub methods.
2767
2768 // Determine the type of stub needed, if any, for a relocation of R_TYPE at
2769 // LOCATION to DESTINATION.
2770 // This code is based on the arm_type_of_stub function in
2771 // bfd/elf32-arm.c.  We have changed the interface a liitle to keep the Stub
2772 // class simple.
2773
2774 Stub_type
2775 Reloc_stub::stub_type_for_reloc(
2776    unsigned int r_type,
2777    Arm_address location,
2778    Arm_address destination,
2779    bool target_is_thumb)
2780 {
2781   Stub_type stub_type = arm_stub_none;
2782
2783   // This is a bit ugly but we want to avoid using a templated class for
2784   // big and little endianities.
2785   bool may_use_blx;
2786   bool should_force_pic_veneer;
2787   bool thumb2;
2788   bool thumb_only;
2789   if (parameters->target().is_big_endian())
2790     {
2791       const Target_arm<true>* big_endian_target =
2792         Target_arm<true>::default_target();
2793       may_use_blx = big_endian_target->may_use_blx();
2794       should_force_pic_veneer = big_endian_target->should_force_pic_veneer();
2795       thumb2 = big_endian_target->using_thumb2();
2796       thumb_only = big_endian_target->using_thumb_only();
2797     }
2798   else
2799     {
2800       const Target_arm<false>* little_endian_target =
2801         Target_arm<false>::default_target();
2802       may_use_blx = little_endian_target->may_use_blx();
2803       should_force_pic_veneer = little_endian_target->should_force_pic_veneer();
2804       thumb2 = little_endian_target->using_thumb2();
2805       thumb_only = little_endian_target->using_thumb_only();
2806     }
2807
2808   int64_t branch_offset = (int64_t)destination - location;
2809
2810   if (r_type == elfcpp::R_ARM_THM_CALL || r_type == elfcpp::R_ARM_THM_JUMP24)
2811     {
2812       // Handle cases where:
2813       // - this call goes too far (different Thumb/Thumb2 max
2814       //   distance)
2815       // - it's a Thumb->Arm call and blx is not available, or it's a
2816       //   Thumb->Arm branch (not bl). A stub is needed in this case.
2817       if ((!thumb2
2818             && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
2819                 || (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
2820           || (thumb2
2821               && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
2822                   || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
2823           || ((!target_is_thumb)
2824               && (((r_type == elfcpp::R_ARM_THM_CALL) && !may_use_blx)
2825                   || (r_type == elfcpp::R_ARM_THM_JUMP24))))
2826         {
2827           if (target_is_thumb)
2828             {
2829               // Thumb to thumb.
2830               if (!thumb_only)
2831                 {
2832                   stub_type = (parameters->options().shared()
2833                                || should_force_pic_veneer)
2834                     // PIC stubs.
2835                     ? ((may_use_blx
2836                         && (r_type == elfcpp::R_ARM_THM_CALL))
2837                        // V5T and above. Stub starts with ARM code, so
2838                        // we must be able to switch mode before
2839                        // reaching it, which is only possible for 'bl'
2840                        // (ie R_ARM_THM_CALL relocation).
2841                        ? arm_stub_long_branch_any_thumb_pic
2842                        // On V4T, use Thumb code only.
2843                        : arm_stub_long_branch_v4t_thumb_thumb_pic)
2844
2845                     // non-PIC stubs.
2846                     : ((may_use_blx
2847                         && (r_type == elfcpp::R_ARM_THM_CALL))
2848                        ? arm_stub_long_branch_any_any // V5T and above.
2849                        : arm_stub_long_branch_v4t_thumb_thumb); // V4T.
2850                 }
2851               else
2852                 {
2853                   stub_type = (parameters->options().shared()
2854                                || should_force_pic_veneer)
2855                     ? arm_stub_long_branch_thumb_only_pic       // PIC stub.
2856                     : arm_stub_long_branch_thumb_only;  // non-PIC stub.
2857                 }
2858             }
2859           else
2860             {
2861               // Thumb to arm.
2862              
2863               // FIXME: We should check that the input section is from an
2864               // object that has interwork enabled.
2865
2866               stub_type = (parameters->options().shared()
2867                            || should_force_pic_veneer)
2868                 // PIC stubs.
2869                 ? ((may_use_blx
2870                     && (r_type == elfcpp::R_ARM_THM_CALL))
2871                    ? arm_stub_long_branch_any_arm_pic   // V5T and above.
2872                    : arm_stub_long_branch_v4t_thumb_arm_pic)    // V4T.
2873
2874                 // non-PIC stubs.
2875                 : ((may_use_blx
2876                     && (r_type == elfcpp::R_ARM_THM_CALL))
2877                    ? arm_stub_long_branch_any_any       // V5T and above.
2878                    : arm_stub_long_branch_v4t_thumb_arm);       // V4T.
2879
2880               // Handle v4t short branches.
2881               if ((stub_type == arm_stub_long_branch_v4t_thumb_arm)
2882                   && (branch_offset <= THM_MAX_FWD_BRANCH_OFFSET)
2883                   && (branch_offset >= THM_MAX_BWD_BRANCH_OFFSET))
2884                 stub_type = arm_stub_short_branch_v4t_thumb_arm;
2885             }
2886         }
2887     }
2888   else if (r_type == elfcpp::R_ARM_CALL
2889            || r_type == elfcpp::R_ARM_JUMP24
2890            || r_type == elfcpp::R_ARM_PLT32)
2891     {
2892       if (target_is_thumb)
2893         {
2894           // Arm to thumb.
2895
2896           // FIXME: We should check that the input section is from an
2897           // object that has interwork enabled.
2898
2899           // We have an extra 2-bytes reach because of
2900           // the mode change (bit 24 (H) of BLX encoding).
2901           if (branch_offset > (ARM_MAX_FWD_BRANCH_OFFSET + 2)
2902               || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET)
2903               || ((r_type == elfcpp::R_ARM_CALL) && !may_use_blx)
2904               || (r_type == elfcpp::R_ARM_JUMP24)
2905               || (r_type == elfcpp::R_ARM_PLT32))
2906             {
2907               stub_type = (parameters->options().shared()
2908                            || should_force_pic_veneer)
2909                 // PIC stubs.
2910                 ? (may_use_blx
2911                    ? arm_stub_long_branch_any_thumb_pic// V5T and above.
2912                    : arm_stub_long_branch_v4t_arm_thumb_pic)    // V4T stub.
2913
2914                 // non-PIC stubs.
2915                 : (may_use_blx
2916                    ? arm_stub_long_branch_any_any       // V5T and above.
2917                    : arm_stub_long_branch_v4t_arm_thumb);       // V4T.
2918             }
2919         }
2920       else
2921         {
2922           // Arm to arm.
2923           if (branch_offset > ARM_MAX_FWD_BRANCH_OFFSET
2924               || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET))
2925             {
2926               stub_type = (parameters->options().shared()
2927                            || should_force_pic_veneer)
2928                 ? arm_stub_long_branch_any_arm_pic      // PIC stubs.
2929                 : arm_stub_long_branch_any_any;         /// non-PIC.
2930             }
2931         }
2932     }
2933
2934   return stub_type;
2935 }
2936
2937 // Template to implement do_write for a specific target endianity.
2938
2939 template<bool big_endian>
2940 void inline
2941 Reloc_stub::do_fixed_endian_write(unsigned char* view,
2942                                   section_size_type view_size)
2943 {
2944   const Stub_template* stub_template = this->stub_template();
2945   const Insn_template* insns = stub_template->insns();
2946
2947   // FIXME:  We do not handle BE8 encoding yet.
2948   unsigned char* pov = view;
2949   for (size_t i = 0; i < stub_template->insn_count(); i++)
2950     {
2951       switch (insns[i].type())
2952         {
2953         case Insn_template::THUMB16_TYPE:
2954           // Non-zero reloc addends are only used in Cortex-A8 stubs. 
2955           gold_assert(insns[i].reloc_addend() == 0);
2956           elfcpp::Swap<16, big_endian>::writeval(pov, insns[i].data() & 0xffff);
2957           break;
2958         case Insn_template::THUMB32_TYPE:
2959           {
2960             uint32_t hi = (insns[i].data() >> 16) & 0xffff;
2961             uint32_t lo = insns[i].data() & 0xffff;
2962             elfcpp::Swap<16, big_endian>::writeval(pov, hi);
2963             elfcpp::Swap<16, big_endian>::writeval(pov + 2, lo);
2964           }
2965           break;
2966         case Insn_template::ARM_TYPE:
2967         case Insn_template::DATA_TYPE:
2968           elfcpp::Swap<32, big_endian>::writeval(pov, insns[i].data());
2969           break;
2970         default:
2971           gold_unreachable();
2972         }
2973       pov += insns[i].size();
2974     }
2975   gold_assert(static_cast<section_size_type>(pov - view) == view_size);
2976
2977
2978 // Write a reloc stub to VIEW with endianity specified by BIG_ENDIAN.
2979
2980 void
2981 Reloc_stub::do_write(unsigned char* view, section_size_type view_size,
2982                      bool big_endian)
2983 {
2984   if (big_endian)
2985     this->do_fixed_endian_write<true>(view, view_size);
2986   else
2987     this->do_fixed_endian_write<false>(view, view_size);
2988 }
2989
2990 // Stub_factory methods.
2991
2992 Stub_factory::Stub_factory()
2993 {
2994   // The instruction template sequences are declared as static
2995   // objects and initialized first time the constructor runs.
2996  
2997   // Arm/Thumb -> Arm/Thumb long branch stub. On V5T and above, use blx
2998   // to reach the stub if necessary.
2999   static const Insn_template elf32_arm_stub_long_branch_any_any[] =
3000     {
3001       Insn_template::arm_insn(0xe51ff004),      // ldr   pc, [pc, #-4]
3002       Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
3003                                                 // dcd   R_ARM_ABS32(X)
3004     };
3005   
3006   // V4T Arm -> Thumb long branch stub. Used on V4T where blx is not
3007   // available.
3008   static const Insn_template elf32_arm_stub_long_branch_v4t_arm_thumb[] =
3009     {
3010       Insn_template::arm_insn(0xe59fc000),      // ldr   ip, [pc, #0]
3011       Insn_template::arm_insn(0xe12fff1c),      // bx    ip
3012       Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
3013                                                 // dcd   R_ARM_ABS32(X)
3014     };
3015   
3016   // Thumb -> Thumb long branch stub. Used on M-profile architectures.
3017   static const Insn_template elf32_arm_stub_long_branch_thumb_only[] =
3018     {
3019       Insn_template::thumb16_insn(0xb401),      // push {r0}
3020       Insn_template::thumb16_insn(0x4802),      // ldr  r0, [pc, #8]
3021       Insn_template::thumb16_insn(0x4684),      // mov  ip, r0
3022       Insn_template::thumb16_insn(0xbc01),      // pop  {r0}
3023       Insn_template::thumb16_insn(0x4760),      // bx   ip
3024       Insn_template::thumb16_insn(0xbf00),      // nop
3025       Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
3026                                                 // dcd  R_ARM_ABS32(X)
3027     };
3028   
3029   // V4T Thumb -> Thumb long branch stub. Using the stack is not
3030   // allowed.
3031   static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_thumb[] =
3032     {
3033       Insn_template::thumb16_insn(0x4778),      // bx   pc
3034       Insn_template::thumb16_insn(0x46c0),      // nop
3035       Insn_template::arm_insn(0xe59fc000),      // ldr  ip, [pc, #0]
3036       Insn_template::arm_insn(0xe12fff1c),      // bx   ip
3037       Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
3038                                                 // dcd  R_ARM_ABS32(X)
3039     };
3040   
3041   // V4T Thumb -> ARM long branch stub. Used on V4T where blx is not
3042   // available.
3043   static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_arm[] =
3044     {
3045       Insn_template::thumb16_insn(0x4778),      // bx   pc
3046       Insn_template::thumb16_insn(0x46c0),      // nop
3047       Insn_template::arm_insn(0xe51ff004),      // ldr   pc, [pc, #-4]
3048       Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
3049                                                 // dcd   R_ARM_ABS32(X)
3050     };
3051   
3052   // V4T Thumb -> ARM short branch stub. Shorter variant of the above
3053   // one, when the destination is close enough.
3054   static const Insn_template elf32_arm_stub_short_branch_v4t_thumb_arm[] =
3055     {
3056       Insn_template::thumb16_insn(0x4778),              // bx   pc
3057       Insn_template::thumb16_insn(0x46c0),              // nop
3058       Insn_template::arm_rel_insn(0xea000000, -8),      // b    (X-8)
3059     };
3060   
3061   // ARM/Thumb -> ARM long branch stub, PIC.  On V5T and above, use
3062   // blx to reach the stub if necessary.
3063   static const Insn_template elf32_arm_stub_long_branch_any_arm_pic[] =
3064     {
3065       Insn_template::arm_insn(0xe59fc000),      // ldr   r12, [pc]
3066       Insn_template::arm_insn(0xe08ff00c),      // add   pc, pc, ip
3067       Insn_template::data_word(0, elfcpp::R_ARM_REL32, -4),
3068                                                 // dcd   R_ARM_REL32(X-4)
3069     };
3070   
3071   // ARM/Thumb -> Thumb long branch stub, PIC.  On V5T and above, use
3072   // blx to reach the stub if necessary.  We can not add into pc;
3073   // it is not guaranteed to mode switch (different in ARMv6 and
3074   // ARMv7).
3075   static const Insn_template elf32_arm_stub_long_branch_any_thumb_pic[] =
3076     {
3077       Insn_template::arm_insn(0xe59fc004),      // ldr   r12, [pc, #4]
3078       Insn_template::arm_insn(0xe08fc00c),      // add   ip, pc, ip
3079       Insn_template::arm_insn(0xe12fff1c),      // bx    ip
3080       Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
3081                                                 // dcd   R_ARM_REL32(X)
3082     };
3083   
3084   // V4T ARM -> ARM long branch stub, PIC.
3085   static const Insn_template elf32_arm_stub_long_branch_v4t_arm_thumb_pic[] =
3086     {
3087       Insn_template::arm_insn(0xe59fc004),      // ldr   ip, [pc, #4]
3088       Insn_template::arm_insn(0xe08fc00c),      // add   ip, pc, ip
3089       Insn_template::arm_insn(0xe12fff1c),      // bx    ip
3090       Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
3091                                                 // dcd   R_ARM_REL32(X)
3092     };
3093   
3094   // V4T Thumb -> ARM long branch stub, PIC.
3095   static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_arm_pic[] =
3096     {
3097       Insn_template::thumb16_insn(0x4778),      // bx   pc
3098       Insn_template::thumb16_insn(0x46c0),      // nop
3099       Insn_template::arm_insn(0xe59fc000),      // ldr  ip, [pc, #0]
3100       Insn_template::arm_insn(0xe08cf00f),      // add  pc, ip, pc
3101       Insn_template::data_word(0, elfcpp::R_ARM_REL32, -4),
3102                                                 // dcd  R_ARM_REL32(X)
3103     };
3104   
3105   // Thumb -> Thumb long branch stub, PIC. Used on M-profile
3106   // architectures.
3107   static const Insn_template elf32_arm_stub_long_branch_thumb_only_pic[] =
3108     {
3109       Insn_template::thumb16_insn(0xb401),      // push {r0}
3110       Insn_template::thumb16_insn(0x4802),      // ldr  r0, [pc, #8]
3111       Insn_template::thumb16_insn(0x46fc),      // mov  ip, pc
3112       Insn_template::thumb16_insn(0x4484),      // add  ip, r0
3113       Insn_template::thumb16_insn(0xbc01),      // pop  {r0}
3114       Insn_template::thumb16_insn(0x4760),      // bx   ip
3115       Insn_template::data_word(0, elfcpp::R_ARM_REL32, 4),
3116                                                 // dcd  R_ARM_REL32(X)
3117     };
3118   
3119   // V4T Thumb -> Thumb long branch stub, PIC. Using the stack is not
3120   // allowed.
3121   static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_thumb_pic[] =
3122     {
3123       Insn_template::thumb16_insn(0x4778),      // bx   pc
3124       Insn_template::thumb16_insn(0x46c0),      // nop
3125       Insn_template::arm_insn(0xe59fc004),      // ldr  ip, [pc, #4]
3126       Insn_template::arm_insn(0xe08fc00c),      // add   ip, pc, ip
3127       Insn_template::arm_insn(0xe12fff1c),      // bx   ip
3128       Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
3129                                                 // dcd  R_ARM_REL32(X)
3130     };
3131   
3132   // Cortex-A8 erratum-workaround stubs.
3133   
3134   // Stub used for conditional branches (which may be beyond +/-1MB away,
3135   // so we can't use a conditional branch to reach this stub).
3136   
3137   // original code:
3138   //
3139   //    b<cond> X
3140   // after:
3141   //
3142   static const Insn_template elf32_arm_stub_a8_veneer_b_cond[] =
3143     {
3144       Insn_template::thumb16_bcond_insn(0xd001),        //      b<cond>.n true
3145       Insn_template::thumb32_b_insn(0xf000b800, -4),    //      b.w after
3146       Insn_template::thumb32_b_insn(0xf000b800, -4)     // true:
3147                                                         //      b.w X
3148     };
3149   
3150   // Stub used for b.w and bl.w instructions.
3151   
3152   static const Insn_template elf32_arm_stub_a8_veneer_b[] =
3153     {
3154       Insn_template::thumb32_b_insn(0xf000b800, -4)     // b.w dest
3155     };
3156   
3157   static const Insn_template elf32_arm_stub_a8_veneer_bl[] =
3158     {
3159       Insn_template::thumb32_b_insn(0xf000b800, -4)     // b.w dest
3160     };
3161   
3162   // Stub used for Thumb-2 blx.w instructions.  We modified the original blx.w
3163   // instruction (which switches to ARM mode) to point to this stub.  Jump to
3164   // the real destination using an ARM-mode branch.
3165   const Insn_template elf32_arm_stub_a8_veneer_blx[] =
3166     {
3167       Insn_template::arm_rel_insn(0xea000000, -8)       // b dest
3168     };
3169
3170   // Fill in the stub template look-up table.  Stub templates are constructed
3171   // per instance of Stub_factory for fast look-up without locking
3172   // in a thread-enabled environment.
3173
3174   this->stub_templates_[arm_stub_none] =
3175     new Stub_template(arm_stub_none, NULL, 0);
3176
3177 #define DEF_STUB(x)     \
3178   do \
3179     { \
3180       size_t array_size \
3181         = sizeof(elf32_arm_stub_##x) / sizeof(elf32_arm_stub_##x[0]); \
3182       Stub_type type = arm_stub_##x; \
3183       this->stub_templates_[type] = \
3184         new Stub_template(type, elf32_arm_stub_##x, array_size); \
3185     } \
3186   while (0);
3187
3188   DEF_STUBS
3189 #undef DEF_STUB
3190 }
3191
3192 // Stub_table methods.
3193
3194 // Add a STUB with using KEY.  Caller is reponsible for avoid adding
3195 // if already a STUB with the same key has been added. 
3196
3197 template<bool big_endian>
3198 void
3199 Stub_table<big_endian>::add_reloc_stub(
3200     Reloc_stub* stub,
3201     const Reloc_stub::Key& key)
3202 {
3203   const Stub_template* stub_template = stub->stub_template();
3204   gold_assert(stub_template->type() == key.stub_type());
3205   this->reloc_stubs_[key] = stub;
3206   if (this->addralign_ < stub_template->alignment())
3207     this->addralign_ = stub_template->alignment();
3208   this->has_been_changed_ = true;
3209 }
3210
3211 template<bool big_endian>
3212 void
3213 Stub_table<big_endian>::relocate_stubs(
3214     const Relocate_info<32, big_endian>* relinfo,
3215     Target_arm<big_endian>* arm_target,
3216     Output_section* output_section,
3217     unsigned char* view,
3218     Arm_address address,
3219     section_size_type view_size)
3220 {
3221   // If we are passed a view bigger than the stub table's.  we need to
3222   // adjust the view.
3223   gold_assert(address == this->address()
3224               && (view_size
3225                   == static_cast<section_size_type>(this->data_size())));
3226
3227   for (typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.begin();
3228       p != this->reloc_stubs_.end();
3229       ++p)
3230     {
3231       Reloc_stub* stub = p->second;
3232       const Stub_template* stub_template = stub->stub_template();
3233       if (stub_template->reloc_count() != 0)
3234         {
3235           // Adjust view to cover the stub only.
3236           section_size_type offset = stub->offset();
3237           section_size_type stub_size = stub_template->size();
3238           gold_assert(offset + stub_size <= view_size);
3239
3240           arm_target->relocate_stub(stub, relinfo, output_section,
3241                                     view + offset, address + offset,
3242                                     stub_size);
3243         }
3244     }
3245 }
3246
3247 // Reset address and file offset.
3248
3249 template<bool big_endian>
3250 void
3251 Stub_table<big_endian>::do_reset_address_and_file_offset()
3252 {
3253   off_t off = 0;
3254   uint64_t max_addralign = 1;
3255   for (typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.begin();
3256       p != this->reloc_stubs_.end();
3257       ++p)
3258     {
3259       Reloc_stub* stub = p->second;
3260       const Stub_template* stub_template = stub->stub_template();
3261       uint64_t stub_addralign = stub_template->alignment();
3262       max_addralign = std::max(max_addralign, stub_addralign);
3263       off = align_address(off, stub_addralign);
3264       stub->set_offset(off);
3265       stub->reset_destination_address();
3266       off += stub_template->size();
3267     }
3268
3269   this->addralign_ = max_addralign;
3270   this->set_current_data_size_for_child(off);
3271 }
3272
3273 // Write out the stubs to file.
3274
3275 template<bool big_endian>
3276 void
3277 Stub_table<big_endian>::do_write(Output_file* of)
3278 {
3279   off_t offset = this->offset();
3280   const section_size_type oview_size =
3281     convert_to_section_size_type(this->data_size());
3282   unsigned char* const oview = of->get_output_view(offset, oview_size);
3283
3284   for (typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.begin();
3285       p != this->reloc_stubs_.end();
3286       ++p)
3287     {
3288       Reloc_stub* stub = p->second;
3289       Arm_address address = this->address() + stub->offset();
3290       gold_assert(address
3291                   == align_address(address,
3292                                    stub->stub_template()->alignment()));
3293       stub->write(oview + stub->offset(), stub->stub_template()->size(),
3294                   big_endian);
3295     } 
3296   of->write_output_view(this->offset(), oview_size, oview);
3297 }
3298
3299 // Arm_input_section methods.
3300
3301 // Initialize an Arm_input_section.
3302
3303 template<bool big_endian>
3304 void
3305 Arm_input_section<big_endian>::init()
3306 {
3307   Relobj* relobj = this->relobj();
3308   unsigned int shndx = this->shndx();
3309
3310   // Cache these to speed up size and alignment queries.  It is too slow
3311   // to call section_addraglin and section_size every time.
3312   this->original_addralign_ = relobj->section_addralign(shndx);
3313   this->original_size_ = relobj->section_size(shndx);
3314
3315   // We want to make this look like the original input section after
3316   // output sections are finalized.
3317   Output_section* os = relobj->output_section(shndx);
3318   off_t offset = relobj->output_section_offset(shndx);
3319   gold_assert(os != NULL && !relobj->is_output_section_offset_invalid(shndx));
3320   this->set_address(os->address() + offset);
3321   this->set_file_offset(os->offset() + offset);
3322
3323   this->set_current_data_size(this->original_size_);
3324   this->finalize_data_size();
3325 }
3326
3327 template<bool big_endian>
3328 void
3329 Arm_input_section<big_endian>::do_write(Output_file* of)
3330 {
3331   // We have to write out the original section content.
3332   section_size_type section_size;
3333   const unsigned char* section_contents =
3334     this->relobj()->section_contents(this->shndx(), &section_size, false); 
3335   of->write(this->offset(), section_contents, section_size); 
3336
3337   // If this owns a stub table and it is not empty, write it.
3338   if (this->is_stub_table_owner() && !this->stub_table_->empty())
3339     this->stub_table_->write(of);
3340 }
3341
3342 // Finalize data size.
3343
3344 template<bool big_endian>
3345 void
3346 Arm_input_section<big_endian>::set_final_data_size()
3347 {
3348   // If this owns a stub table, finalize its data size as well.
3349   if (this->is_stub_table_owner())
3350     {
3351       uint64_t address = this->address();
3352
3353       // The stub table comes after the original section contents.
3354       address += this->original_size_;
3355       address = align_address(address, this->stub_table_->addralign());
3356       off_t offset = this->offset() + (address - this->address());
3357       this->stub_table_->set_address_and_file_offset(address, offset);
3358       address += this->stub_table_->data_size();
3359       gold_assert(address == this->address() + this->current_data_size());
3360     }
3361
3362   this->set_data_size(this->current_data_size());
3363 }
3364
3365 // Reset address and file offset.
3366
3367 template<bool big_endian>
3368 void
3369 Arm_input_section<big_endian>::do_reset_address_and_file_offset()
3370 {
3371   // Size of the original input section contents.
3372   off_t off = convert_types<off_t, uint64_t>(this->original_size_);
3373
3374   // If this is a stub table owner, account for the stub table size.
3375   if (this->is_stub_table_owner())
3376     {
3377       Stub_table<big_endian>* stub_table = this->stub_table_;
3378
3379       // Reset the stub table's address and file offset.  The
3380       // current data size for child will be updated after that.
3381       stub_table_->reset_address_and_file_offset();
3382       off = align_address(off, stub_table_->addralign());
3383       off += stub_table->current_data_size();
3384     }
3385
3386   this->set_current_data_size(off);
3387 }
3388
3389 // Arm_output_section methods.
3390
3391 // Create a stub group for input sections from BEGIN to END.  OWNER
3392 // points to the input section to be the owner a new stub table.
3393
3394 template<bool big_endian>
3395 void
3396 Arm_output_section<big_endian>::create_stub_group(
3397   Input_section_list::const_iterator begin,
3398   Input_section_list::const_iterator end,
3399   Input_section_list::const_iterator owner,
3400   Target_arm<big_endian>* target,
3401   std::vector<Output_relaxed_input_section*>* new_relaxed_sections)
3402 {
3403   // Currently we convert ordinary input sections into relaxed sections only
3404   // at this point but we may want to support creating relaxed input section
3405   // very early.  So we check here to see if owner is already a relaxed
3406   // section.
3407   
3408   Arm_input_section<big_endian>* arm_input_section;
3409   if (owner->is_relaxed_input_section())
3410     {
3411       arm_input_section =
3412         Arm_input_section<big_endian>::as_arm_input_section(
3413           owner->relaxed_input_section());
3414     }
3415   else
3416     {
3417       gold_assert(owner->is_input_section());
3418       // Create a new relaxed input section.
3419       arm_input_section =
3420         target->new_arm_input_section(owner->relobj(), owner->shndx());
3421       new_relaxed_sections->push_back(arm_input_section);
3422     }
3423
3424   // Create a stub table.
3425   Stub_table<big_endian>* stub_table =
3426     target->new_stub_table(arm_input_section);
3427
3428   arm_input_section->set_stub_table(stub_table);
3429   
3430   Input_section_list::const_iterator p = begin;
3431   Input_section_list::const_iterator prev_p;
3432
3433   // Look for input sections or relaxed input sections in [begin ... end].
3434   do
3435     {
3436       if (p->is_input_section() || p->is_relaxed_input_section())
3437         {
3438           // The stub table information for input sections live
3439           // in their objects.
3440           Arm_relobj<big_endian>* arm_relobj =
3441             Arm_relobj<big_endian>::as_arm_relobj(p->relobj());
3442           arm_relobj->set_stub_table(p->shndx(), stub_table);
3443         }
3444       prev_p = p++;
3445     }
3446   while (prev_p != end);
3447 }
3448
3449 // Group input sections for stub generation.  GROUP_SIZE is roughly the limit
3450 // of stub groups.  We grow a stub group by adding input section until the
3451 // size is just below GROUP_SIZE.  The last input section will be converted
3452 // into a stub table.  If STUB_ALWAYS_AFTER_BRANCH is false, we also add
3453 // input section after the stub table, effectively double the group size.
3454 // 
3455 // This is similar to the group_sections() function in elf32-arm.c but is
3456 // implemented differently.
3457
3458 template<bool big_endian>
3459 void
3460 Arm_output_section<big_endian>::group_sections(
3461     section_size_type group_size,
3462     bool stubs_always_after_branch,
3463     Target_arm<big_endian>* target)
3464 {
3465   // We only care about sections containing code.
3466   if ((this->flags() & elfcpp::SHF_EXECINSTR) == 0)
3467     return;
3468
3469   // States for grouping.
3470   typedef enum
3471   {
3472     // No group is being built.
3473     NO_GROUP,
3474     // A group is being built but the stub table is not found yet.
3475     // We keep group a stub group until the size is just under GROUP_SIZE.
3476     // The last input section in the group will be used as the stub table.
3477     FINDING_STUB_SECTION,
3478     // A group is being built and we have already found a stub table.
3479     // We enter this state to grow a stub group by adding input section
3480     // after the stub table.  This effectively doubles the group size.
3481     HAS_STUB_SECTION
3482   } State;
3483
3484   // Any newly created relaxed sections are stored here.
3485   std::vector<Output_relaxed_input_section*> new_relaxed_sections;
3486
3487   State state = NO_GROUP;
3488   section_size_type off = 0;
3489   section_size_type group_begin_offset = 0;
3490   section_size_type group_end_offset = 0;
3491   section_size_type stub_table_end_offset = 0;
3492   Input_section_list::const_iterator group_begin =
3493     this->input_sections().end();
3494   Input_section_list::const_iterator stub_table =
3495     this->input_sections().end();
3496   Input_section_list::const_iterator group_end = this->input_sections().end();
3497   for (Input_section_list::const_iterator p = this->input_sections().begin();
3498        p != this->input_sections().end();
3499        ++p)
3500     {
3501       section_size_type section_begin_offset =
3502         align_address(off, p->addralign());
3503       section_size_type section_end_offset =
3504         section_begin_offset + p->data_size(); 
3505       
3506       // Check to see if we should group the previously seens sections.
3507       switch (state)
3508         {
3509         case NO_GROUP:
3510           break;
3511
3512         case FINDING_STUB_SECTION:
3513           // Adding this section makes the group larger than GROUP_SIZE.
3514           if (section_end_offset - group_begin_offset >= group_size)
3515             {
3516               if (stubs_always_after_branch)
3517                 {       
3518                   gold_assert(group_end != this->input_sections().end());
3519                   this->create_stub_group(group_begin, group_end, group_end,
3520                                           target, &new_relaxed_sections);
3521                   state = NO_GROUP;
3522                 }
3523               else
3524                 {
3525                   // But wait, there's more!  Input sections up to
3526                   // stub_group_size bytes after the stub table can be
3527                   // handled by it too.
3528                   state = HAS_STUB_SECTION;
3529                   stub_table = group_end;
3530                   stub_table_end_offset = group_end_offset;
3531                 }
3532             }
3533             break;
3534
3535         case HAS_STUB_SECTION:
3536           // Adding this section makes the post stub-section group larger
3537           // than GROUP_SIZE.
3538           if (section_end_offset - stub_table_end_offset >= group_size)
3539            {
3540              gold_assert(group_end != this->input_sections().end());
3541              this->create_stub_group(group_begin, group_end, stub_table,
3542                                      target, &new_relaxed_sections);
3543              state = NO_GROUP;
3544            }
3545            break;
3546
3547           default:
3548             gold_unreachable();
3549         }       
3550
3551       // If we see an input section and currently there is no group, start
3552       // a new one.  Skip any empty sections.
3553       if ((p->is_input_section() || p->is_relaxed_input_section())
3554           && (p->relobj()->section_size(p->shndx()) != 0))
3555         {
3556           if (state == NO_GROUP)
3557             {
3558               state = FINDING_STUB_SECTION;
3559               group_begin = p;
3560               group_begin_offset = section_begin_offset;
3561             }
3562
3563           // Keep track of the last input section seen.
3564           group_end = p;
3565           group_end_offset = section_end_offset;
3566         }
3567
3568       off = section_end_offset;
3569     }
3570
3571   // Create a stub group for any ungrouped sections.
3572   if (state == FINDING_STUB_SECTION || state == HAS_STUB_SECTION)
3573     {
3574       gold_assert(group_end != this->input_sections().end());
3575       this->create_stub_group(group_begin, group_end,
3576                               (state == FINDING_STUB_SECTION
3577                                ? group_end
3578                                : stub_table),
3579                                target, &new_relaxed_sections);
3580     }
3581
3582   // Convert input section into relaxed input section in a batch.
3583   if (!new_relaxed_sections.empty())
3584     this->convert_input_sections_to_relaxed_sections(new_relaxed_sections);
3585
3586   // Update the section offsets
3587   for (size_t i = 0; i < new_relaxed_sections.size(); ++i)
3588     {
3589       Arm_relobj<big_endian>* arm_relobj =
3590         Arm_relobj<big_endian>::as_arm_relobj(
3591           new_relaxed_sections[i]->relobj());
3592       unsigned int shndx = new_relaxed_sections[i]->shndx();
3593       // Tell Arm_relobj that this input section is converted.
3594       arm_relobj->convert_input_section_to_relaxed_section(shndx);
3595     }
3596 }
3597
3598 // Arm_relobj methods.
3599
3600 // Scan relocations for stub generation.
3601
3602 template<bool big_endian>
3603 void
3604 Arm_relobj<big_endian>::scan_sections_for_stubs(
3605     Target_arm<big_endian>* arm_target,
3606     const Symbol_table* symtab,
3607     const Layout* layout)
3608 {
3609   unsigned int shnum = this->shnum();
3610   const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
3611
3612   // Read the section headers.
3613   const unsigned char* pshdrs = this->get_view(this->elf_file()->shoff(),
3614                                                shnum * shdr_size,
3615                                                true, true);
3616
3617   // To speed up processing, we set up hash tables for fast lookup of
3618   // input offsets to output addresses.
3619   this->initialize_input_to_output_maps();
3620
3621   const Relobj::Output_sections& out_sections(this->output_sections());
3622
3623   Relocate_info<32, big_endian> relinfo;
3624   relinfo.symtab = symtab;
3625   relinfo.layout = layout;
3626   relinfo.object = this;
3627
3628   const unsigned char* p = pshdrs + shdr_size;
3629   for (unsigned int i = 1; i < shnum; ++i, p += shdr_size)
3630     {
3631       typename elfcpp::Shdr<32, big_endian> shdr(p);
3632
3633       unsigned int sh_type = shdr.get_sh_type();
3634       if (sh_type != elfcpp::SHT_REL && sh_type != elfcpp::SHT_RELA)
3635         continue;
3636
3637       off_t sh_size = shdr.get_sh_size();
3638       if (sh_size == 0)
3639         continue;
3640
3641       unsigned int index = this->adjust_shndx(shdr.get_sh_info());
3642       if (index >= this->shnum())
3643         {
3644           // Ignore reloc section with bad info.  This error will be
3645           // reported in the final link.
3646           continue;
3647         }
3648
3649       Output_section* os = out_sections[index];
3650       if (os == NULL
3651           || symtab->is_section_folded(this, index))
3652         {
3653           // This relocation section is against a section which we
3654           // discarded or if the section is folded into another
3655           // section due to ICF.
3656           continue;
3657         }
3658       Arm_address output_offset = this->get_output_section_offset(index);
3659
3660       if (this->adjust_shndx(shdr.get_sh_link()) != this->symtab_shndx())
3661         {
3662           // Ignore reloc section with unexpected symbol table.  The
3663           // error will be reported in the final link.
3664           continue;
3665         }
3666
3667       const unsigned char* prelocs = this->get_view(shdr.get_sh_offset(),
3668                                                     sh_size, true, false);
3669
3670       unsigned int reloc_size;
3671       if (sh_type == elfcpp::SHT_REL)
3672         reloc_size = elfcpp::Elf_sizes<32>::rel_size;
3673       else
3674         reloc_size = elfcpp::Elf_sizes<32>::rela_size;
3675
3676       if (reloc_size != shdr.get_sh_entsize())
3677         {
3678           // Ignore reloc section with unexpected entsize.  The error
3679           // will be reported in the final link.
3680           continue;
3681         }
3682
3683       size_t reloc_count = sh_size / reloc_size;
3684       if (static_cast<off_t>(reloc_count * reloc_size) != sh_size)
3685         {
3686           // Ignore reloc section with uneven size.  The error will be
3687           // reported in the final link.
3688           continue;
3689         }
3690
3691       gold_assert(output_offset != invalid_address
3692                   || this->relocs_must_follow_section_writes());
3693
3694       // Get the section contents.  This does work for the case in which
3695       // we modify the contents of an input section.  We need to pass the
3696       // output view under such circumstances.
3697       section_size_type input_view_size = 0;
3698       const unsigned char* input_view =
3699         this->section_contents(index, &input_view_size, false);
3700
3701       relinfo.reloc_shndx = i;
3702       relinfo.data_shndx = index;
3703       arm_target->scan_section_for_stubs(&relinfo, sh_type, prelocs,
3704                                          reloc_count, os,
3705                                          output_offset == invalid_address,
3706                                          input_view,
3707                                          os->address(),
3708                                          input_view_size);
3709     }
3710
3711   // After we've done the relocations, we release the hash tables,
3712   // since we no longer need them.
3713   this->free_input_to_output_maps();
3714 }
3715
3716 // Count the local symbols.  The ARM backend needs to know if a symbol
3717 // is a THUMB function or not.  For global symbols, it is easy because
3718 // the Symbol object keeps the ELF symbol type.  For local symbol it is
3719 // harder because we cannot access this information.   So we override the
3720 // do_count_local_symbol in parent and scan local symbols to mark
3721 // THUMB functions.  This is not the most efficient way but I do not want to
3722 // slow down other ports by calling a per symbol targer hook inside
3723 // Sized_relobj<size, big_endian>::do_count_local_symbols. 
3724
3725 template<bool big_endian>
3726 void
3727 Arm_relobj<big_endian>::do_count_local_symbols(
3728     Stringpool_template<char>* pool,
3729     Stringpool_template<char>* dynpool)
3730 {
3731   // We need to fix-up the values of any local symbols whose type are
3732   // STT_ARM_TFUNC.
3733   
3734   // Ask parent to count the local symbols.
3735   Sized_relobj<32, big_endian>::do_count_local_symbols(pool, dynpool);
3736   const unsigned int loccount = this->local_symbol_count();
3737   if (loccount == 0)
3738     return;
3739
3740   // Intialize the thumb function bit-vector.
3741   std::vector<bool> empty_vector(loccount, false);
3742   this->local_symbol_is_thumb_function_.swap(empty_vector);
3743
3744   // Read the symbol table section header.
3745   const unsigned int symtab_shndx = this->symtab_shndx();
3746   elfcpp::Shdr<32, big_endian>
3747       symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
3748   gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
3749
3750   // Read the local symbols.
3751   const int sym_size =elfcpp::Elf_sizes<32>::sym_size;
3752   gold_assert(loccount == symtabshdr.get_sh_info());
3753   off_t locsize = loccount * sym_size;
3754   const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
3755                                               locsize, true, true);
3756
3757   // Loop over the local symbols and mark any local symbols pointing
3758   // to THUMB functions.
3759
3760   // Skip the first dummy symbol.
3761   psyms += sym_size;
3762   typename Sized_relobj<32, big_endian>::Local_values* plocal_values =
3763     this->local_values();
3764   for (unsigned int i = 1; i < loccount; ++i, psyms += sym_size)
3765     {
3766       elfcpp::Sym<32, big_endian> sym(psyms);
3767       elfcpp::STT st_type = sym.get_st_type();
3768       Symbol_value<32>& lv((*plocal_values)[i]);
3769       Arm_address input_value = lv.input_value();
3770
3771       if (st_type == elfcpp::STT_ARM_TFUNC
3772           || (st_type == elfcpp::STT_FUNC && ((input_value & 1) != 0)))
3773         {
3774           // This is a THUMB function.  Mark this and canonicalize the
3775           // symbol value by setting LSB.
3776           this->local_symbol_is_thumb_function_[i] = true;
3777           if ((input_value & 1) == 0)
3778             lv.set_input_value(input_value | 1);
3779         }
3780     }
3781 }
3782
3783 // Relocate sections.
3784 template<bool big_endian>
3785 void
3786 Arm_relobj<big_endian>::do_relocate_sections(
3787     const Symbol_table* symtab,
3788     const Layout* layout,
3789     const unsigned char* pshdrs,
3790     typename Sized_relobj<32, big_endian>::Views* pviews)
3791 {
3792   // Call parent to relocate sections.
3793   Sized_relobj<32, big_endian>::do_relocate_sections(symtab, layout, pshdrs,
3794                                                      pviews); 
3795
3796   // We do not generate stubs if doing a relocatable link.
3797   if (parameters->options().relocatable())
3798     return;
3799
3800   // Relocate stub tables.
3801   unsigned int shnum = this->shnum();
3802
3803   Target_arm<big_endian>* arm_target =
3804     Target_arm<big_endian>::default_target();
3805
3806   Relocate_info<32, big_endian> relinfo;
3807   relinfo.symtab = symtab;
3808   relinfo.layout = layout;
3809   relinfo.object = this;
3810
3811   for (unsigned int i = 1; i < shnum; ++i)
3812     {
3813       Arm_input_section<big_endian>* arm_input_section =
3814         arm_target->find_arm_input_section(this, i);
3815
3816       if (arm_input_section == NULL
3817           || !arm_input_section->is_stub_table_owner()
3818           || arm_input_section->stub_table()->empty())
3819         continue;
3820
3821       // We cannot discard a section if it owns a stub table.
3822       Output_section* os = this->output_section(i);
3823       gold_assert(os != NULL);
3824
3825       relinfo.reloc_shndx = elfcpp::SHN_UNDEF;
3826       relinfo.reloc_shdr = NULL;
3827       relinfo.data_shndx = i;
3828       relinfo.data_shdr = pshdrs + i * elfcpp::Elf_sizes<32>::shdr_size;
3829
3830       gold_assert((*pviews)[i].view != NULL);
3831
3832       // We are passed the output section view.  Adjust it to cover the
3833       // stub table only.
3834       Stub_table<big_endian>* stub_table = arm_input_section->stub_table();
3835       gold_assert((stub_table->address() >= (*pviews)[i].address)
3836                   && ((stub_table->address() + stub_table->data_size())
3837                       <= (*pviews)[i].address + (*pviews)[i].view_size));
3838
3839       off_t offset = stub_table->address() - (*pviews)[i].address;
3840       unsigned char* view = (*pviews)[i].view + offset;
3841       Arm_address address = stub_table->address();
3842       section_size_type view_size = stub_table->data_size();
3843  
3844       stub_table->relocate_stubs(&relinfo, arm_target, os, view, address,
3845                                  view_size);
3846     }
3847 }
3848
3849 // Helper functions for both Arm_relobj and Arm_dynobj to read ARM
3850 // ABI information.
3851
3852 template<bool big_endian>
3853 Attributes_section_data*
3854 read_arm_attributes_section(
3855     Object* object,
3856     Read_symbols_data *sd)
3857 {
3858   // Read the attributes section if there is one.
3859   // We read from the end because gas seems to put it near the end of
3860   // the section headers.
3861   const size_t shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
3862   const unsigned char *ps =
3863     sd->section_headers->data() + shdr_size * (object->shnum() - 1);
3864   for (unsigned int i = object->shnum(); i > 0; --i, ps -= shdr_size)
3865     {
3866       elfcpp::Shdr<32, big_endian> shdr(ps);
3867       if (shdr.get_sh_type() == elfcpp::SHT_ARM_ATTRIBUTES)
3868         {
3869           section_offset_type section_offset = shdr.get_sh_offset();
3870           section_size_type section_size =
3871             convert_to_section_size_type(shdr.get_sh_size());
3872           File_view* view = object->get_lasting_view(section_offset,
3873                                                      section_size, true, false);
3874           return new Attributes_section_data(view->data(), section_size);
3875         }
3876     }
3877   return NULL;
3878 }
3879
3880 // Read the symbol information.
3881
3882 template<bool big_endian>
3883 void
3884 Arm_relobj<big_endian>::do_read_symbols(Read_symbols_data* sd)
3885 {
3886   // Call parent class to read symbol information.
3887   Sized_relobj<32, big_endian>::do_read_symbols(sd);
3888
3889   // Read processor-specific flags in ELF file header.
3890   const unsigned char* pehdr = this->get_view(elfcpp::file_header_offset,
3891                                               elfcpp::Elf_sizes<32>::ehdr_size,
3892                                               true, false);
3893   elfcpp::Ehdr<32, big_endian> ehdr(pehdr);
3894   this->processor_specific_flags_ = ehdr.get_e_flags();
3895   this->attributes_section_data_ =
3896     read_arm_attributes_section<big_endian>(this, sd); 
3897 }
3898
3899 // Arm_dynobj methods.
3900
3901 // Read the symbol information.
3902
3903 template<bool big_endian>
3904 void
3905 Arm_dynobj<big_endian>::do_read_symbols(Read_symbols_data* sd)
3906 {
3907   // Call parent class to read symbol information.
3908   Sized_dynobj<32, big_endian>::do_read_symbols(sd);
3909
3910   // Read processor-specific flags in ELF file header.
3911   const unsigned char* pehdr = this->get_view(elfcpp::file_header_offset,
3912                                               elfcpp::Elf_sizes<32>::ehdr_size,
3913                                               true, false);
3914   elfcpp::Ehdr<32, big_endian> ehdr(pehdr);
3915   this->processor_specific_flags_ = ehdr.get_e_flags();
3916   this->attributes_section_data_ =
3917     read_arm_attributes_section<big_endian>(this, sd); 
3918 }
3919
3920 // Stub_addend_reader methods.
3921
3922 // Read the addend of a REL relocation of type R_TYPE at VIEW.
3923
3924 template<bool big_endian>
3925 elfcpp::Elf_types<32>::Elf_Swxword
3926 Stub_addend_reader<elfcpp::SHT_REL, big_endian>::operator()(
3927     unsigned int r_type,
3928     const unsigned char* view,
3929     const typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc&) const
3930 {
3931   switch (r_type)
3932     {
3933     case elfcpp::R_ARM_CALL:
3934     case elfcpp::R_ARM_JUMP24:
3935     case elfcpp::R_ARM_PLT32:
3936       {
3937         typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3938         const Valtype* wv = reinterpret_cast<const Valtype*>(view);
3939         Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3940         return utils::sign_extend<26>(val << 2);
3941       }
3942
3943     case elfcpp::R_ARM_THM_CALL:
3944     case elfcpp::R_ARM_THM_JUMP24:
3945     case elfcpp::R_ARM_THM_XPC22:
3946       {
3947         // Fetch the addend.  We use the Thumb-2 encoding (backwards
3948         // compatible with Thumb-1) involving the J1 and J2 bits.
3949         typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3950         const Valtype* wv = reinterpret_cast<const Valtype*>(view);
3951         Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
3952         Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
3953
3954         uint32_t s = (upper_insn & (1 << 10)) >> 10;
3955         uint32_t upper = upper_insn & 0x3ff;
3956         uint32_t lower = lower_insn & 0x7ff;
3957         uint32_t j1 = (lower_insn & (1 << 13)) >> 13;
3958         uint32_t j2 = (lower_insn & (1 << 11)) >> 11;
3959         uint32_t i1 = j1 ^ s ? 0 : 1;
3960         uint32_t i2 = j2 ^ s ? 0 : 1;
3961
3962         return utils::sign_extend<25>((s << 24) | (i1 << 23) | (i2 << 22)
3963                                       | (upper << 12) | (lower << 1));
3964       }
3965
3966     case elfcpp::R_ARM_THM_JUMP19:
3967       {
3968         typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3969         const Valtype* wv = reinterpret_cast<const Valtype*>(view);
3970         Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
3971         Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
3972
3973         // Reconstruct the top three bits and squish the two 11 bit pieces
3974         // together.
3975         uint32_t S = (upper_insn & 0x0400) >> 10;
3976         uint32_t J1 = (lower_insn & 0x2000) >> 13;
3977         uint32_t J2 = (lower_insn & 0x0800) >> 11;
3978         uint32_t upper =
3979           (S << 8) | (J2 << 7) | (J1 << 6) | (upper_insn & 0x003f);
3980         uint32_t lower = (lower_insn & 0x07ff);
3981         return utils::sign_extend<23>((upper << 12) | (lower << 1));
3982       }
3983
3984     default:
3985       gold_unreachable();
3986     }
3987 }
3988
3989 // A class to handle the PLT data.
3990
3991 template<bool big_endian>
3992 class Output_data_plt_arm : public Output_section_data
3993 {
3994  public:
3995   typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, big_endian>
3996     Reloc_section;
3997
3998   Output_data_plt_arm(Layout*, Output_data_space*);
3999
4000   // Add an entry to the PLT.
4001   void
4002   add_entry(Symbol* gsym);
4003
4004   // Return the .rel.plt section data.
4005   const Reloc_section*
4006   rel_plt() const
4007   { return this->rel_; }
4008
4009  protected:
4010   void
4011   do_adjust_output_section(Output_section* os);
4012
4013   // Write to a map file.
4014   void
4015   do_print_to_mapfile(Mapfile* mapfile) const
4016   { mapfile->print_output_data(this, _("** PLT")); }
4017
4018  private:
4019   // Template for the first PLT entry.
4020   static const uint32_t first_plt_entry[5];
4021
4022   // Template for subsequent PLT entries. 
4023   static const uint32_t plt_entry[3];
4024
4025   // Set the final size.
4026   void
4027   set_final_data_size()
4028   {
4029     this->set_data_size(sizeof(first_plt_entry)
4030                         + this->count_ * sizeof(plt_entry));
4031   }
4032
4033   // Write out the PLT data.
4034   void
4035   do_write(Output_file*);
4036
4037   // The reloc section.
4038   Reloc_section* rel_;
4039   // The .got.plt section.
4040   Output_data_space* got_plt_;
4041   // The number of PLT entries.
4042   unsigned int count_;
4043 };
4044
4045 // Create the PLT section.  The ordinary .got section is an argument,
4046 // since we need to refer to the start.  We also create our own .got
4047 // section just for PLT entries.
4048
4049 template<bool big_endian>
4050 Output_data_plt_arm<big_endian>::Output_data_plt_arm(Layout* layout,
4051                                                      Output_data_space* got_plt)
4052   : Output_section_data(4), got_plt_(got_plt), count_(0)
4053 {
4054   this->rel_ = new Reloc_section(false);
4055   layout->add_output_section_data(".rel.plt", elfcpp::SHT_REL,
4056                                   elfcpp::SHF_ALLOC, this->rel_, true, false,
4057                                   false, false);
4058 }
4059
4060 template<bool big_endian>
4061 void
4062 Output_data_plt_arm<big_endian>::do_adjust_output_section(Output_section* os)
4063 {
4064   os->set_entsize(0);
4065 }
4066
4067 // Add an entry to the PLT.
4068
4069 template<bool big_endian>
4070 void
4071 Output_data_plt_arm<big_endian>::add_entry(Symbol* gsym)
4072 {
4073   gold_assert(!gsym->has_plt_offset());
4074
4075   // Note that when setting the PLT offset we skip the initial
4076   // reserved PLT entry.
4077   gsym->set_plt_offset((this->count_) * sizeof(plt_entry)
4078                        + sizeof(first_plt_entry));
4079
4080   ++this->count_;
4081
4082   section_offset_type got_offset = this->got_plt_->current_data_size();
4083
4084   // Every PLT entry needs a GOT entry which points back to the PLT
4085   // entry (this will be changed by the dynamic linker, normally
4086   // lazily when the function is called).
4087   this->got_plt_->set_current_data_size(got_offset + 4);
4088
4089   // Every PLT entry needs a reloc.
4090   gsym->set_needs_dynsym_entry();
4091   this->rel_->add_global(gsym, elfcpp::R_ARM_JUMP_SLOT, this->got_plt_,
4092                          got_offset);
4093
4094   // Note that we don't need to save the symbol.  The contents of the
4095   // PLT are independent of which symbols are used.  The symbols only
4096   // appear in the relocations.
4097 }
4098
4099 // ARM PLTs.
4100 // FIXME:  This is not very flexible.  Right now this has only been tested
4101 // on armv5te.  If we are to support additional architecture features like
4102 // Thumb-2 or BE8, we need to make this more flexible like GNU ld.
4103
4104 // The first entry in the PLT.
4105 template<bool big_endian>
4106 const uint32_t Output_data_plt_arm<big_endian>::first_plt_entry[5] =
4107 {
4108   0xe52de004,   // str   lr, [sp, #-4]!
4109   0xe59fe004,   // ldr   lr, [pc, #4]
4110   0xe08fe00e,   // add   lr, pc, lr 
4111   0xe5bef008,   // ldr   pc, [lr, #8]!
4112   0x00000000,   // &GOT[0] - .
4113 };
4114
4115 // Subsequent entries in the PLT.
4116
4117 template<bool big_endian>
4118 const uint32_t Output_data_plt_arm<big_endian>::plt_entry[3] =
4119 {
4120   0xe28fc600,   // add   ip, pc, #0xNN00000
4121   0xe28cca00,   // add   ip, ip, #0xNN000
4122   0xe5bcf000,   // ldr   pc, [ip, #0xNNN]!
4123 };
4124
4125 // Write out the PLT.  This uses the hand-coded instructions above,
4126 // and adjusts them as needed.  This is all specified by the arm ELF
4127 // Processor Supplement.
4128
4129 template<bool big_endian>
4130 void
4131 Output_data_plt_arm<big_endian>::do_write(Output_file* of)
4132 {
4133   const off_t offset = this->offset();
4134   const section_size_type oview_size =
4135     convert_to_section_size_type(this->data_size());
4136   unsigned char* const oview = of->get_output_view(offset, oview_size);
4137
4138   const off_t got_file_offset = this->got_plt_->offset();
4139   const section_size_type got_size =
4140     convert_to_section_size_type(this->got_plt_->data_size());
4141   unsigned char* const got_view = of->get_output_view(got_file_offset,
4142                                                       got_size);
4143   unsigned char* pov = oview;
4144
4145   Arm_address plt_address = this->address();
4146   Arm_address got_address = this->got_plt_->address();
4147
4148   // Write first PLT entry.  All but the last word are constants.
4149   const size_t num_first_plt_words = (sizeof(first_plt_entry)
4150                                       / sizeof(plt_entry[0]));
4151   for (size_t i = 0; i < num_first_plt_words - 1; i++)
4152     elfcpp::Swap<32, big_endian>::writeval(pov + i * 4, first_plt_entry[i]);
4153   // Last word in first PLT entry is &GOT[0] - .
4154   elfcpp::Swap<32, big_endian>::writeval(pov + 16,
4155                                          got_address - (plt_address + 16));
4156   pov += sizeof(first_plt_entry);
4157
4158   unsigned char* got_pov = got_view;
4159
4160   memset(got_pov, 0, 12);
4161   got_pov += 12;
4162
4163   const int rel_size = elfcpp::Elf_sizes<32>::rel_size;
4164   unsigned int plt_offset = sizeof(first_plt_entry);
4165   unsigned int plt_rel_offset = 0;
4166   unsigned int got_offset = 12;
4167   const unsigned int count = this->count_;
4168   for (unsigned int i = 0;
4169        i < count;
4170        ++i,
4171          pov += sizeof(plt_entry),
4172          got_pov += 4,
4173          plt_offset += sizeof(plt_entry),
4174          plt_rel_offset += rel_size,
4175          got_offset += 4)
4176     {
4177       // Set and adjust the PLT entry itself.
4178       int32_t offset = ((got_address + got_offset)
4179                          - (plt_address + plt_offset + 8));
4180
4181       gold_assert(offset >= 0 && offset < 0x0fffffff);
4182       uint32_t plt_insn0 = plt_entry[0] | ((offset >> 20) & 0xff);
4183       elfcpp::Swap<32, big_endian>::writeval(pov, plt_insn0);
4184       uint32_t plt_insn1 = plt_entry[1] | ((offset >> 12) & 0xff);
4185       elfcpp::Swap<32, big_endian>::writeval(pov + 4, plt_insn1);
4186       uint32_t plt_insn2 = plt_entry[2] | (offset & 0xfff);
4187       elfcpp::Swap<32, big_endian>::writeval(pov + 8, plt_insn2);
4188
4189       // Set the entry in the GOT.
4190       elfcpp::Swap<32, big_endian>::writeval(got_pov, plt_address);
4191     }
4192
4193   gold_assert(static_cast<section_size_type>(pov - oview) == oview_size);
4194   gold_assert(static_cast<section_size_type>(got_pov - got_view) == got_size);
4195
4196   of->write_output_view(offset, oview_size, oview);
4197   of->write_output_view(got_file_offset, got_size, got_view);
4198 }
4199
4200 // Create a PLT entry for a global symbol.
4201
4202 template<bool big_endian>
4203 void
4204 Target_arm<big_endian>::make_plt_entry(Symbol_table* symtab, Layout* layout,
4205                                        Symbol* gsym)
4206 {
4207   if (gsym->has_plt_offset())
4208     return;
4209
4210   if (this->plt_ == NULL)
4211     {
4212       // Create the GOT sections first.
4213       this->got_section(symtab, layout);
4214
4215       this->plt_ = new Output_data_plt_arm<big_endian>(layout, this->got_plt_);
4216       layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS,
4217                                       (elfcpp::SHF_ALLOC
4218                                        | elfcpp::SHF_EXECINSTR),
4219                                       this->plt_, false, false, false, false);
4220     }
4221   this->plt_->add_entry(gsym);
4222 }
4223
4224 // Report an unsupported relocation against a local symbol.
4225
4226 template<bool big_endian>
4227 void
4228 Target_arm<big_endian>::Scan::unsupported_reloc_local(
4229     Sized_relobj<32, big_endian>* object,
4230     unsigned int r_type)
4231 {
4232   gold_error(_("%s: unsupported reloc %u against local symbol"),
4233              object->name().c_str(), r_type);
4234 }
4235
4236 // We are about to emit a dynamic relocation of type R_TYPE.  If the
4237 // dynamic linker does not support it, issue an error.  The GNU linker
4238 // only issues a non-PIC error for an allocated read-only section.
4239 // Here we know the section is allocated, but we don't know that it is
4240 // read-only.  But we check for all the relocation types which the
4241 // glibc dynamic linker supports, so it seems appropriate to issue an
4242 // error even if the section is not read-only.
4243
4244 template<bool big_endian>
4245 void
4246 Target_arm<big_endian>::Scan::check_non_pic(Relobj* object,
4247                                             unsigned int r_type)
4248 {
4249   switch (r_type)
4250     {
4251     // These are the relocation types supported by glibc for ARM.
4252     case elfcpp::R_ARM_RELATIVE:
4253     case elfcpp::R_ARM_COPY:
4254     case elfcpp::R_ARM_GLOB_DAT:
4255     case elfcpp::R_ARM_JUMP_SLOT:
4256     case elfcpp::R_ARM_ABS32:
4257     case elfcpp::R_ARM_ABS32_NOI:
4258     case elfcpp::R_ARM_PC24:
4259     // FIXME: The following 3 types are not supported by Android's dynamic
4260     // linker.
4261     case elfcpp::R_ARM_TLS_DTPMOD32:
4262     case elfcpp::R_ARM_TLS_DTPOFF32:
4263     case elfcpp::R_ARM_TLS_TPOFF32:
4264       return;
4265
4266     default:
4267       // This prevents us from issuing more than one error per reloc
4268       // section.  But we can still wind up issuing more than one
4269       // error per object file.
4270       if (this->issued_non_pic_error_)
4271         return;
4272       object->error(_("requires unsupported dynamic reloc; "
4273                       "recompile with -fPIC"));
4274       this->issued_non_pic_error_ = true;
4275       return;
4276
4277     case elfcpp::R_ARM_NONE:
4278       gold_unreachable();
4279     }
4280 }
4281
4282 // Scan a relocation for a local symbol.
4283 // FIXME: This only handles a subset of relocation types used by Android
4284 // on ARM v5te devices.
4285
4286 template<bool big_endian>
4287 inline void
4288 Target_arm<big_endian>::Scan::local(Symbol_table* symtab,
4289                                     Layout* layout,
4290                                     Target_arm* target,
4291                                     Sized_relobj<32, big_endian>* object,
4292                                     unsigned int data_shndx,
4293                                     Output_section* output_section,
4294                                     const elfcpp::Rel<32, big_endian>& reloc,
4295                                     unsigned int r_type,
4296                                     const elfcpp::Sym<32, big_endian>&)
4297 {
4298   r_type = get_real_reloc_type(r_type);
4299   switch (r_type)
4300     {
4301     case elfcpp::R_ARM_NONE:
4302       break;
4303
4304     case elfcpp::R_ARM_ABS32:
4305     case elfcpp::R_ARM_ABS32_NOI:
4306       // If building a shared library (or a position-independent
4307       // executable), we need to create a dynamic relocation for
4308       // this location. The relocation applied at link time will
4309       // apply the link-time value, so we flag the location with
4310       // an R_ARM_RELATIVE relocation so the dynamic loader can
4311       // relocate it easily.
4312       if (parameters->options().output_is_position_independent())
4313         {
4314           Reloc_section* rel_dyn = target->rel_dyn_section(layout);
4315           unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
4316           // If we are to add more other reloc types than R_ARM_ABS32,
4317           // we need to add check_non_pic(object, r_type) here.
4318           rel_dyn->add_local_relative(object, r_sym, elfcpp::R_ARM_RELATIVE,
4319                                       output_section, data_shndx,
4320                                       reloc.get_r_offset());
4321         }
4322       break;
4323
4324     case elfcpp::R_ARM_REL32:
4325     case elfcpp::R_ARM_THM_CALL:
4326     case elfcpp::R_ARM_CALL:
4327     case elfcpp::R_ARM_PREL31:
4328     case elfcpp::R_ARM_JUMP24:
4329     case elfcpp::R_ARM_PLT32:
4330     case elfcpp::R_ARM_THM_ABS5:
4331     case elfcpp::R_ARM_ABS8:
4332     case elfcpp::R_ARM_ABS12:
4333     case elfcpp::R_ARM_ABS16:
4334     case elfcpp::R_ARM_BASE_ABS:
4335     case elfcpp::R_ARM_MOVW_ABS_NC:
4336     case elfcpp::R_ARM_MOVT_ABS:
4337     case elfcpp::R_ARM_THM_MOVW_ABS_NC:
4338     case elfcpp::R_ARM_THM_MOVT_ABS:
4339     case elfcpp::R_ARM_MOVW_PREL_NC:
4340     case elfcpp::R_ARM_MOVT_PREL:
4341     case elfcpp::R_ARM_THM_MOVW_PREL_NC:
4342     case elfcpp::R_ARM_THM_MOVT_PREL:
4343       break;
4344
4345     case elfcpp::R_ARM_GOTOFF32:
4346       // We need a GOT section:
4347       target->got_section(symtab, layout);
4348       break;
4349
4350     case elfcpp::R_ARM_BASE_PREL:
4351       // FIXME: What about this?
4352       break;
4353
4354     case elfcpp::R_ARM_GOT_BREL:
4355     case elfcpp::R_ARM_GOT_PREL:
4356       {
4357         // The symbol requires a GOT entry.
4358         Output_data_got<32, big_endian>* got =
4359           target->got_section(symtab, layout);
4360         unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
4361         if (got->add_local(object, r_sym, GOT_TYPE_STANDARD))
4362           {
4363             // If we are generating a shared object, we need to add a
4364             // dynamic RELATIVE relocation for this symbol's GOT entry.
4365             if (parameters->options().output_is_position_independent())
4366               {
4367                 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
4368                 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
4369                 rel_dyn->add_local_relative(
4370                     object, r_sym, elfcpp::R_ARM_RELATIVE, got,
4371                     object->local_got_offset(r_sym, GOT_TYPE_STANDARD));
4372               }
4373           }
4374       }
4375       break;
4376
4377     case elfcpp::R_ARM_TARGET1:
4378       // This should have been mapped to another type already.
4379       // Fall through.
4380     case elfcpp::R_ARM_COPY:
4381     case elfcpp::R_ARM_GLOB_DAT:
4382     case elfcpp::R_ARM_JUMP_SLOT:
4383     case elfcpp::R_ARM_RELATIVE:
4384       // These are relocations which should only be seen by the
4385       // dynamic linker, and should never be seen here.
4386       gold_error(_("%s: unexpected reloc %u in object file"),
4387                  object->name().c_str(), r_type);
4388       break;
4389
4390     default:
4391       unsupported_reloc_local(object, r_type);
4392       break;
4393     }
4394 }
4395
4396 // Report an unsupported relocation against a global symbol.
4397
4398 template<bool big_endian>
4399 void
4400 Target_arm<big_endian>::Scan::unsupported_reloc_global(
4401     Sized_relobj<32, big_endian>* object,
4402     unsigned int r_type,
4403     Symbol* gsym)
4404 {
4405   gold_error(_("%s: unsupported reloc %u against global symbol %s"),
4406              object->name().c_str(), r_type, gsym->demangled_name().c_str());
4407 }
4408
4409 // Scan a relocation for a global symbol.
4410 // FIXME: This only handles a subset of relocation types used by Android
4411 // on ARM v5te devices.
4412
4413 template<bool big_endian>
4414 inline void
4415 Target_arm<big_endian>::Scan::global(Symbol_table* symtab,
4416                                      Layout* layout,
4417                                      Target_arm* target,
4418                                      Sized_relobj<32, big_endian>* object,
4419                                      unsigned int data_shndx,
4420                                      Output_section* output_section,
4421                                      const elfcpp::Rel<32, big_endian>& reloc,
4422                                      unsigned int r_type,
4423                                      Symbol* gsym)
4424 {
4425   r_type = get_real_reloc_type(r_type);
4426   switch (r_type)
4427     {
4428     case elfcpp::R_ARM_NONE:
4429       break;
4430
4431     case elfcpp::R_ARM_ABS32:
4432     case elfcpp::R_ARM_ABS32_NOI:
4433       {
4434         // Make a dynamic relocation if necessary.
4435         if (gsym->needs_dynamic_reloc(Symbol::ABSOLUTE_REF))
4436           {
4437             if (target->may_need_copy_reloc(gsym))
4438               {
4439                 target->copy_reloc(symtab, layout, object,
4440                                    data_shndx, output_section, gsym, reloc);
4441               }
4442             else if (gsym->can_use_relative_reloc(false))
4443               {
4444                 // If we are to add more other reloc types than R_ARM_ABS32,
4445                 // we need to add check_non_pic(object, r_type) here.
4446                 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
4447                 rel_dyn->add_global_relative(gsym, elfcpp::R_ARM_RELATIVE,
4448                                              output_section, object,
4449                                              data_shndx, reloc.get_r_offset());
4450               }
4451             else
4452               {
4453                 // If we are to add more other reloc types than R_ARM_ABS32,
4454                 // we need to add check_non_pic(object, r_type) here.
4455                 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
4456                 rel_dyn->add_global(gsym, r_type, output_section, object,
4457                                     data_shndx, reloc.get_r_offset());
4458               }
4459           }
4460       }
4461       break;
4462
4463     case elfcpp::R_ARM_MOVW_ABS_NC:
4464     case elfcpp::R_ARM_MOVT_ABS:
4465     case elfcpp::R_ARM_THM_MOVW_ABS_NC:
4466     case elfcpp::R_ARM_THM_MOVT_ABS:
4467     case elfcpp::R_ARM_MOVW_PREL_NC:
4468     case elfcpp::R_ARM_MOVT_PREL:
4469     case elfcpp::R_ARM_THM_MOVW_PREL_NC:
4470     case elfcpp::R_ARM_THM_MOVT_PREL:
4471       break;
4472
4473     case elfcpp::R_ARM_THM_ABS5:
4474     case elfcpp::R_ARM_ABS8:
4475     case elfcpp::R_ARM_ABS12:
4476     case elfcpp::R_ARM_ABS16:
4477     case elfcpp::R_ARM_BASE_ABS:
4478       {
4479         // No dynamic relocs of this kinds.
4480         // Report the error in case of PIC.
4481         int flags = Symbol::NON_PIC_REF;
4482         if (gsym->type() == elfcpp::STT_FUNC
4483             || gsym->type() == elfcpp::STT_ARM_TFUNC)
4484           flags |= Symbol::FUNCTION_CALL;
4485         if (gsym->needs_dynamic_reloc(flags))
4486           check_non_pic(object, r_type);
4487       }
4488       break;
4489
4490     case elfcpp::R_ARM_REL32:
4491     case elfcpp::R_ARM_PREL31:
4492       {
4493         // Make a dynamic relocation if necessary.
4494         int flags = Symbol::NON_PIC_REF;
4495         if (gsym->needs_dynamic_reloc(flags))
4496           {
4497             if (target->may_need_copy_reloc(gsym))
4498               {
4499                 target->copy_reloc(symtab, layout, object,
4500                                    data_shndx, output_section, gsym, reloc);
4501               }
4502             else
4503               {
4504                 check_non_pic(object, r_type);
4505                 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
4506                 rel_dyn->add_global(gsym, r_type, output_section, object,
4507                                     data_shndx, reloc.get_r_offset());
4508               }
4509           }
4510       }
4511       break;
4512
4513     case elfcpp::R_ARM_JUMP24:
4514     case elfcpp::R_ARM_THM_JUMP24:
4515     case elfcpp::R_ARM_CALL:
4516     case elfcpp::R_ARM_THM_CALL:
4517
4518       if (Target_arm<big_endian>::Scan::symbol_needs_plt_entry(gsym))
4519         target->make_plt_entry(symtab, layout, gsym);
4520       else
4521         {
4522            // Check to see if this is a function that would need a PLT
4523            // but does not get one because the function symbol is untyped.
4524            // This happens in assembly code missing a proper .type directive.
4525           if ((!gsym->is_undefined() || parameters->options().shared())
4526               && !parameters->doing_static_link()
4527               && gsym->type() == elfcpp::STT_NOTYPE
4528               && (gsym->is_from_dynobj()
4529                   || gsym->is_undefined()
4530                   || gsym->is_preemptible()))
4531             gold_error(_("%s is not a function."),
4532                        gsym->demangled_name().c_str());
4533         }
4534       break;
4535
4536     case elfcpp::R_ARM_PLT32:
4537       // If the symbol is fully resolved, this is just a relative
4538       // local reloc.  Otherwise we need a PLT entry.
4539       if (gsym->final_value_is_known())
4540         break;
4541       // If building a shared library, we can also skip the PLT entry
4542       // if the symbol is defined in the output file and is protected
4543       // or hidden.
4544       if (gsym->is_defined()
4545           && !gsym->is_from_dynobj()
4546           && !gsym->is_preemptible())
4547         break;
4548       target->make_plt_entry(symtab, layout, gsym);
4549       break;
4550
4551     case elfcpp::R_ARM_GOTOFF32:
4552       // We need a GOT section.
4553       target->got_section(symtab, layout);
4554       break;
4555
4556     case elfcpp::R_ARM_BASE_PREL:
4557       // FIXME: What about this?
4558       break;
4559       
4560     case elfcpp::R_ARM_GOT_BREL:
4561     case elfcpp::R_ARM_GOT_PREL:
4562       {
4563         // The symbol requires a GOT entry.
4564         Output_data_got<32, big_endian>* got =
4565           target->got_section(symtab, layout);
4566         if (gsym->final_value_is_known())
4567           got->add_global(gsym, GOT_TYPE_STANDARD);
4568         else
4569           {
4570             // If this symbol is not fully resolved, we need to add a
4571             // GOT entry with a dynamic relocation.
4572             Reloc_section* rel_dyn = target->rel_dyn_section(layout);
4573             if (gsym->is_from_dynobj()
4574                 || gsym->is_undefined()
4575                 || gsym->is_preemptible())
4576               got->add_global_with_rel(gsym, GOT_TYPE_STANDARD,
4577                                        rel_dyn, elfcpp::R_ARM_GLOB_DAT);
4578             else
4579               {
4580                 if (got->add_global(gsym, GOT_TYPE_STANDARD))
4581                   rel_dyn->add_global_relative(
4582                       gsym, elfcpp::R_ARM_RELATIVE, got,
4583                       gsym->got_offset(GOT_TYPE_STANDARD));
4584               }
4585           }
4586       }
4587       break;
4588
4589     case elfcpp::R_ARM_TARGET1:
4590       // This should have been mapped to another type already.
4591       // Fall through.
4592     case elfcpp::R_ARM_COPY:
4593     case elfcpp::R_ARM_GLOB_DAT:
4594     case elfcpp::R_ARM_JUMP_SLOT:
4595     case elfcpp::R_ARM_RELATIVE:
4596       // These are relocations which should only be seen by the
4597       // dynamic linker, and should never be seen here.
4598       gold_error(_("%s: unexpected reloc %u in object file"),
4599                  object->name().c_str(), r_type);
4600       break;
4601
4602     default:
4603       unsupported_reloc_global(object, r_type, gsym);
4604       break;
4605     }
4606 }
4607
4608 // Process relocations for gc.
4609
4610 template<bool big_endian>
4611 void
4612 Target_arm<big_endian>::gc_process_relocs(Symbol_table* symtab,
4613                                           Layout* layout,
4614                                           Sized_relobj<32, big_endian>* object,
4615                                           unsigned int data_shndx,
4616                                           unsigned int,
4617                                           const unsigned char* prelocs,
4618                                           size_t reloc_count,
4619                                           Output_section* output_section,
4620                                           bool needs_special_offset_handling,
4621                                           size_t local_symbol_count,
4622                                           const unsigned char* plocal_symbols)
4623 {
4624   typedef Target_arm<big_endian> Arm;
4625   typedef typename Target_arm<big_endian>::Scan Scan;
4626
4627   gold::gc_process_relocs<32, big_endian, Arm, elfcpp::SHT_REL, Scan>(
4628     symtab,
4629     layout,
4630     this,
4631     object,
4632     data_shndx,
4633     prelocs,
4634     reloc_count,
4635     output_section,
4636     needs_special_offset_handling,
4637     local_symbol_count,
4638     plocal_symbols);
4639 }
4640
4641 // Scan relocations for a section.
4642
4643 template<bool big_endian>
4644 void
4645 Target_arm<big_endian>::scan_relocs(Symbol_table* symtab,
4646                                     Layout* layout,
4647                                     Sized_relobj<32, big_endian>* object,
4648                                     unsigned int data_shndx,
4649                                     unsigned int sh_type,
4650                                     const unsigned char* prelocs,
4651                                     size_t reloc_count,
4652                                     Output_section* output_section,
4653                                     bool needs_special_offset_handling,
4654                                     size_t local_symbol_count,
4655                                     const unsigned char* plocal_symbols)
4656 {
4657   typedef typename Target_arm<big_endian>::Scan Scan;
4658   if (sh_type == elfcpp::SHT_RELA)
4659     {
4660       gold_error(_("%s: unsupported RELA reloc section"),
4661                  object->name().c_str());
4662       return;
4663     }
4664
4665   gold::scan_relocs<32, big_endian, Target_arm, elfcpp::SHT_REL, Scan>(
4666     symtab,
4667     layout,
4668     this,
4669     object,
4670     data_shndx,
4671     prelocs,
4672     reloc_count,
4673     output_section,
4674     needs_special_offset_handling,
4675     local_symbol_count,
4676     plocal_symbols);
4677 }
4678
4679 // Finalize the sections.
4680
4681 template<bool big_endian>
4682 void
4683 Target_arm<big_endian>::do_finalize_sections(
4684     Layout* layout,
4685     const Input_objects* input_objects,
4686     Symbol_table* symtab)
4687 {
4688   // Merge processor-specific flags.
4689   for (Input_objects::Relobj_iterator p = input_objects->relobj_begin();
4690        p != input_objects->relobj_end();
4691        ++p)
4692     {
4693       Arm_relobj<big_endian>* arm_relobj =
4694         Arm_relobj<big_endian>::as_arm_relobj(*p);
4695       this->merge_processor_specific_flags(
4696           arm_relobj->name(),
4697           arm_relobj->processor_specific_flags());
4698       this->merge_object_attributes(arm_relobj->name().c_str(),
4699                                     arm_relobj->attributes_section_data());
4700
4701     } 
4702
4703   for (Input_objects::Dynobj_iterator p = input_objects->dynobj_begin();
4704        p != input_objects->dynobj_end();
4705        ++p)
4706     {
4707       Arm_dynobj<big_endian>* arm_dynobj =
4708         Arm_dynobj<big_endian>::as_arm_dynobj(*p);
4709       this->merge_processor_specific_flags(
4710           arm_dynobj->name(),
4711           arm_dynobj->processor_specific_flags());
4712       this->merge_object_attributes(arm_dynobj->name().c_str(),
4713                                     arm_dynobj->attributes_section_data());
4714     }
4715
4716   // Check BLX use.
4717   Object_attribute* attr =
4718     this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
4719   if (attr->int_value() > elfcpp::TAG_CPU_ARCH_V4)
4720     this->set_may_use_blx(true);
4721  
4722   // Fill in some more dynamic tags.
4723   Output_data_dynamic* const odyn = layout->dynamic_data();
4724   if (odyn != NULL)
4725     {
4726       if (this->got_plt_ != NULL
4727           && this->got_plt_->output_section() != NULL)
4728         odyn->add_section_address(elfcpp::DT_PLTGOT, this->got_plt_);
4729
4730       if (this->plt_ != NULL
4731           && this->plt_->output_section() != NULL)
4732         {
4733           const Output_data* od = this->plt_->rel_plt();
4734           odyn->add_section_size(elfcpp::DT_PLTRELSZ, od);
4735           odyn->add_section_address(elfcpp::DT_JMPREL, od);
4736           odyn->add_constant(elfcpp::DT_PLTREL, elfcpp::DT_REL);
4737         }
4738
4739       if (this->rel_dyn_ != NULL
4740           && this->rel_dyn_->output_section() != NULL)
4741         {
4742           const Output_data* od = this->rel_dyn_;
4743           odyn->add_section_address(elfcpp::DT_REL, od);
4744           odyn->add_section_size(elfcpp::DT_RELSZ, od);
4745           odyn->add_constant(elfcpp::DT_RELENT,
4746                              elfcpp::Elf_sizes<32>::rel_size);
4747         }
4748
4749       if (!parameters->options().shared())
4750         {
4751           // The value of the DT_DEBUG tag is filled in by the dynamic
4752           // linker at run time, and used by the debugger.
4753           odyn->add_constant(elfcpp::DT_DEBUG, 0);
4754         }
4755     }
4756
4757   // Emit any relocs we saved in an attempt to avoid generating COPY
4758   // relocs.
4759   if (this->copy_relocs_.any_saved_relocs())
4760     this->copy_relocs_.emit(this->rel_dyn_section(layout));
4761
4762   // Handle the .ARM.exidx section.
4763   Output_section* exidx_section = layout->find_output_section(".ARM.exidx");
4764   if (exidx_section != NULL
4765       && exidx_section->type() == elfcpp::SHT_ARM_EXIDX
4766       && !parameters->options().relocatable())
4767     {
4768       // Create __exidx_start and __exdix_end symbols.
4769       symtab->define_in_output_data("__exidx_start", NULL,
4770                                     Symbol_table::PREDEFINED,
4771                                     exidx_section, 0, 0, elfcpp::STT_OBJECT,
4772                                     elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
4773                                     false, false);
4774       symtab->define_in_output_data("__exidx_end", NULL,
4775                                     Symbol_table::PREDEFINED,
4776                                     exidx_section, 0, 0, elfcpp::STT_OBJECT,
4777                                     elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
4778                                     true, false);
4779
4780       // For the ARM target, we need to add a PT_ARM_EXIDX segment for
4781       // the .ARM.exidx section.
4782       if (!layout->script_options()->saw_phdrs_clause())
4783         {
4784           gold_assert(layout->find_output_segment(elfcpp::PT_ARM_EXIDX, 0, 0)
4785                       == NULL);
4786           Output_segment*  exidx_segment =
4787             layout->make_output_segment(elfcpp::PT_ARM_EXIDX, elfcpp::PF_R);
4788           exidx_segment->add_output_section(exidx_section, elfcpp::PF_R,
4789                                             false);
4790         }
4791     }
4792
4793   // Create an .ARM.attributes section if there is not one already.
4794   Output_attributes_section_data* attributes_section =
4795     new Output_attributes_section_data(*this->attributes_section_data_);
4796   layout->add_output_section_data(".ARM.attributes",
4797                                   elfcpp::SHT_ARM_ATTRIBUTES, 0,
4798                                   attributes_section, false, false, false,
4799                                   false);
4800 }
4801
4802 // Return whether a direct absolute static relocation needs to be applied.
4803 // In cases where Scan::local() or Scan::global() has created
4804 // a dynamic relocation other than R_ARM_RELATIVE, the addend
4805 // of the relocation is carried in the data, and we must not
4806 // apply the static relocation.
4807
4808 template<bool big_endian>
4809 inline bool
4810 Target_arm<big_endian>::Relocate::should_apply_static_reloc(
4811     const Sized_symbol<32>* gsym,
4812     int ref_flags,
4813     bool is_32bit,
4814     Output_section* output_section)
4815 {
4816   // If the output section is not allocated, then we didn't call
4817   // scan_relocs, we didn't create a dynamic reloc, and we must apply
4818   // the reloc here.
4819   if ((output_section->flags() & elfcpp::SHF_ALLOC) == 0)
4820       return true;
4821
4822   // For local symbols, we will have created a non-RELATIVE dynamic
4823   // relocation only if (a) the output is position independent,
4824   // (b) the relocation is absolute (not pc- or segment-relative), and
4825   // (c) the relocation is not 32 bits wide.
4826   if (gsym == NULL)
4827     return !(parameters->options().output_is_position_independent()
4828              && (ref_flags & Symbol::ABSOLUTE_REF)
4829              && !is_32bit);
4830
4831   // For global symbols, we use the same helper routines used in the
4832   // scan pass.  If we did not create a dynamic relocation, or if we
4833   // created a RELATIVE dynamic relocation, we should apply the static
4834   // relocation.
4835   bool has_dyn = gsym->needs_dynamic_reloc(ref_flags);
4836   bool is_rel = (ref_flags & Symbol::ABSOLUTE_REF)
4837                  && gsym->can_use_relative_reloc(ref_flags
4838                                                  & Symbol::FUNCTION_CALL);
4839   return !has_dyn || is_rel;
4840 }
4841
4842 // Perform a relocation.
4843
4844 template<bool big_endian>
4845 inline bool
4846 Target_arm<big_endian>::Relocate::relocate(
4847     const Relocate_info<32, big_endian>* relinfo,
4848     Target_arm* target,
4849     Output_section *output_section,
4850     size_t relnum,
4851     const elfcpp::Rel<32, big_endian>& rel,
4852     unsigned int r_type,
4853     const Sized_symbol<32>* gsym,
4854     const Symbol_value<32>* psymval,
4855     unsigned char* view,
4856     Arm_address address,
4857     section_size_type /* view_size */ )
4858 {
4859   typedef Arm_relocate_functions<big_endian> Arm_relocate_functions;
4860
4861   r_type = get_real_reloc_type(r_type);
4862
4863   const Arm_relobj<big_endian>* object =
4864     Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
4865
4866   // If the final branch target of a relocation is THUMB instruction, this
4867   // is 1.  Otherwise it is 0.
4868   Arm_address thumb_bit = 0;
4869   Symbol_value<32> symval;
4870   bool is_weakly_undefined_without_plt = false;
4871   if (relnum != Target_arm<big_endian>::fake_relnum_for_stubs)
4872     {
4873       if (gsym != NULL)
4874         {
4875           // This is a global symbol.  Determine if we use PLT and if the
4876           // final target is THUMB.
4877           if (gsym->use_plt_offset(reloc_is_non_pic(r_type)))
4878             {
4879               // This uses a PLT, change the symbol value.
4880               symval.set_output_value(target->plt_section()->address()
4881                                       + gsym->plt_offset());
4882               psymval = &symval;
4883             }
4884           else if (gsym->is_weak_undefined())
4885             {
4886               // This is a weakly undefined symbol and we do not use PLT
4887               // for this relocation.  A branch targeting this symbol will
4888               // be converted into an NOP.
4889               is_weakly_undefined_without_plt = true;
4890             }
4891           else
4892             {
4893               // Set thumb bit if symbol:
4894               // -Has type STT_ARM_TFUNC or
4895               // -Has type STT_FUNC, is defined and with LSB in value set.
4896               thumb_bit =
4897                 (((gsym->type() == elfcpp::STT_ARM_TFUNC)
4898                  || (gsym->type() == elfcpp::STT_FUNC
4899                      && !gsym->is_undefined()
4900                      && ((psymval->value(object, 0) & 1) != 0)))
4901                 ? 1
4902                 : 0);
4903             }
4904         }
4905       else
4906         {
4907           // This is a local symbol.  Determine if the final target is THUMB.
4908           // We saved this information when all the local symbols were read.
4909           elfcpp::Elf_types<32>::Elf_WXword r_info = rel.get_r_info();
4910           unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
4911           thumb_bit = object->local_symbol_is_thumb_function(r_sym) ? 1 : 0;
4912         }
4913     }
4914   else
4915     {
4916       // This is a fake relocation synthesized for a stub.  It does not have
4917       // a real symbol.  We just look at the LSB of the symbol value to
4918       // determine if the target is THUMB or not.
4919       thumb_bit = ((psymval->value(object, 0) & 1) != 0);
4920     }
4921
4922   // Strip LSB if this points to a THUMB target.
4923   if (thumb_bit != 0
4924       && Target_arm<big_endian>::reloc_uses_thumb_bit(r_type) 
4925       && ((psymval->value(object, 0) & 1) != 0))
4926     {
4927       Arm_address stripped_value =
4928         psymval->value(object, 0) & ~static_cast<Arm_address>(1);
4929       symval.set_output_value(stripped_value);
4930       psymval = &symval;
4931     } 
4932
4933   // Get the GOT offset if needed.
4934   // The GOT pointer points to the end of the GOT section.
4935   // We need to subtract the size of the GOT section to get
4936   // the actual offset to use in the relocation.
4937   bool have_got_offset = false;
4938   unsigned int got_offset = 0;
4939   switch (r_type)
4940     {
4941     case elfcpp::R_ARM_GOT_BREL:
4942     case elfcpp::R_ARM_GOT_PREL:
4943       if (gsym != NULL)
4944         {
4945           gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD));
4946           got_offset = (gsym->got_offset(GOT_TYPE_STANDARD)
4947                         - target->got_size());
4948         }
4949       else
4950         {
4951           unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
4952           gold_assert(object->local_has_got_offset(r_sym, GOT_TYPE_STANDARD));
4953           got_offset = (object->local_got_offset(r_sym, GOT_TYPE_STANDARD)
4954                         - target->got_size());
4955         }
4956       have_got_offset = true;
4957       break;
4958
4959     default:
4960       break;
4961     }
4962
4963   // To look up relocation stubs, we need to pass the symbol table index of
4964   // a local symbol.
4965   unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
4966
4967   typename Arm_relocate_functions::Status reloc_status =
4968         Arm_relocate_functions::STATUS_OKAY;
4969   switch (r_type)
4970     {
4971     case elfcpp::R_ARM_NONE:
4972       break;
4973
4974     case elfcpp::R_ARM_ABS8:
4975       if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
4976                                     output_section))
4977         reloc_status = Arm_relocate_functions::abs8(view, object, psymval);
4978       break;
4979
4980     case elfcpp::R_ARM_ABS12:
4981       if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
4982                                     output_section))
4983         reloc_status = Arm_relocate_functions::abs12(view, object, psymval);
4984       break;
4985
4986     case elfcpp::R_ARM_ABS16:
4987       if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
4988                                     output_section))
4989         reloc_status = Arm_relocate_functions::abs16(view, object, psymval);
4990       break;
4991
4992     case elfcpp::R_ARM_ABS32:
4993       if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, true,
4994                                     output_section))
4995         reloc_status = Arm_relocate_functions::abs32(view, object, psymval,
4996                                                      thumb_bit);
4997       break;
4998
4999     case elfcpp::R_ARM_ABS32_NOI:
5000       if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, true,
5001                                     output_section))
5002         // No thumb bit for this relocation: (S + A)
5003         reloc_status = Arm_relocate_functions::abs32(view, object, psymval,
5004                                                      0);
5005       break;
5006
5007     case elfcpp::R_ARM_MOVW_ABS_NC:
5008       if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, true,
5009                                     output_section))
5010         reloc_status = Arm_relocate_functions::movw_abs_nc(view, object,
5011                                                            psymval,
5012                                                            thumb_bit);
5013       else
5014         gold_error(_("relocation R_ARM_MOVW_ABS_NC cannot be used when making"
5015                      "a shared object; recompile with -fPIC"));
5016       break;
5017
5018     case elfcpp::R_ARM_MOVT_ABS:
5019       if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, true,
5020                                     output_section))
5021         reloc_status = Arm_relocate_functions::movt_abs(view, object, psymval);
5022       else
5023         gold_error(_("relocation R_ARM_MOVT_ABS cannot be used when making"
5024                      "a shared object; recompile with -fPIC"));
5025       break;
5026
5027     case elfcpp::R_ARM_THM_MOVW_ABS_NC:
5028       if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, true,
5029                                     output_section))
5030         reloc_status = Arm_relocate_functions::thm_movw_abs_nc(view, object,
5031                                                                psymval,
5032                                                                thumb_bit);
5033       else
5034         gold_error(_("relocation R_ARM_THM_MOVW_ABS_NC cannot be used when"
5035                      "making a shared object; recompile with -fPIC"));
5036       break;
5037
5038     case elfcpp::R_ARM_THM_MOVT_ABS:
5039       if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, true,
5040                                     output_section))
5041         reloc_status = Arm_relocate_functions::thm_movt_abs(view, object,
5042                                                             psymval);
5043       else
5044         gold_error(_("relocation R_ARM_THM_MOVT_ABS cannot be used when"
5045                      "making a shared object; recompile with -fPIC"));
5046       break;
5047
5048     case elfcpp::R_ARM_MOVW_PREL_NC:
5049       reloc_status = Arm_relocate_functions::movw_prel_nc(view, object,
5050                                                           psymval, address,
5051                                                           thumb_bit);
5052       break;
5053
5054     case elfcpp::R_ARM_MOVT_PREL:
5055       reloc_status = Arm_relocate_functions::movt_prel(view, object,
5056                                                        psymval, address);
5057       break;
5058
5059     case elfcpp::R_ARM_THM_MOVW_PREL_NC:
5060       reloc_status = Arm_relocate_functions::thm_movw_prel_nc(view, object,
5061                                                               psymval, address,
5062                                                               thumb_bit);
5063       break;
5064
5065     case elfcpp::R_ARM_THM_MOVT_PREL:
5066       reloc_status = Arm_relocate_functions::thm_movt_prel(view, object,
5067                                                            psymval, address);
5068       break;
5069         
5070     case elfcpp::R_ARM_REL32:
5071       reloc_status = Arm_relocate_functions::rel32(view, object, psymval,
5072                                                    address, thumb_bit);
5073       break;
5074
5075     case elfcpp::R_ARM_THM_ABS5:
5076       if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
5077                                     output_section))
5078         reloc_status = Arm_relocate_functions::thm_abs5(view, object, psymval);
5079       break;
5080
5081     case elfcpp::R_ARM_THM_CALL:
5082       reloc_status =
5083         Arm_relocate_functions::thm_call(relinfo, view, gsym, object, r_sym,
5084                                          psymval, address, thumb_bit,
5085                                          is_weakly_undefined_without_plt);
5086       break;
5087
5088     case elfcpp::R_ARM_XPC25:
5089       reloc_status =
5090         Arm_relocate_functions::xpc25(relinfo, view, gsym, object, r_sym,
5091                                       psymval, address, thumb_bit,
5092                                       is_weakly_undefined_without_plt);
5093       break;
5094
5095     case elfcpp::R_ARM_THM_XPC22:
5096       reloc_status =
5097         Arm_relocate_functions::thm_xpc22(relinfo, view, gsym, object, r_sym,
5098                                           psymval, address, thumb_bit,
5099                                           is_weakly_undefined_without_plt);
5100       break;
5101
5102     case elfcpp::R_ARM_GOTOFF32:
5103       {
5104         Arm_address got_origin;
5105         got_origin = target->got_plt_section()->address();
5106         reloc_status = Arm_relocate_functions::rel32(view, object, psymval,
5107                                                      got_origin, thumb_bit);
5108       }
5109       break;
5110
5111     case elfcpp::R_ARM_BASE_PREL:
5112       {
5113         uint32_t origin;
5114         // Get the addressing origin of the output segment defining the 
5115         // symbol gsym (AAELF 4.6.1.2 Relocation types)
5116         gold_assert(gsym != NULL); 
5117         if (gsym->source() == Symbol::IN_OUTPUT_SEGMENT)
5118           origin = gsym->output_segment()->vaddr();
5119         else if (gsym->source () == Symbol::IN_OUTPUT_DATA)
5120           origin = gsym->output_data()->address();
5121         else
5122           {
5123             gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
5124                                    _("cannot find origin of R_ARM_BASE_PREL"));
5125             return true;
5126           }
5127         reloc_status = Arm_relocate_functions::base_prel(view, origin, address);
5128       }
5129       break;
5130
5131     case elfcpp::R_ARM_BASE_ABS:
5132       {
5133         if (!should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, true,
5134                                       output_section))
5135           break;
5136
5137         uint32_t origin;
5138         // Get the addressing origin of the output segment defining
5139         // the symbol gsym (AAELF 4.6.1.2 Relocation types).
5140         if (gsym == NULL)
5141           // R_ARM_BASE_ABS with the NULL symbol will give the
5142           // absolute address of the GOT origin (GOT_ORG) (see ARM IHI
5143           // 0044C (AAELF): 4.6.1.8 Proxy generating relocations).
5144           origin = target->got_plt_section()->address();
5145         else if (gsym->source() == Symbol::IN_OUTPUT_SEGMENT)
5146           origin = gsym->output_segment()->vaddr();
5147         else if (gsym->source () == Symbol::IN_OUTPUT_DATA)
5148           origin = gsym->output_data()->address();
5149         else
5150           {
5151             gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
5152                                    _("cannot find origin of R_ARM_BASE_ABS"));
5153             return true;
5154           }
5155
5156         reloc_status = Arm_relocate_functions::base_abs(view, origin);
5157       }
5158       break;
5159
5160     case elfcpp::R_ARM_GOT_BREL:
5161       gold_assert(have_got_offset);
5162       reloc_status = Arm_relocate_functions::got_brel(view, got_offset);
5163       break;
5164
5165     case elfcpp::R_ARM_GOT_PREL:
5166       gold_assert(have_got_offset);
5167       // Get the address origin for GOT PLT, which is allocated right
5168       // after the GOT section, to calculate an absolute address of
5169       // the symbol GOT entry (got_origin + got_offset).
5170       Arm_address got_origin;
5171       got_origin = target->got_plt_section()->address();
5172       reloc_status = Arm_relocate_functions::got_prel(view,
5173                                                       got_origin + got_offset,
5174                                                       address);
5175       break;
5176
5177     case elfcpp::R_ARM_PLT32:
5178       gold_assert(gsym == NULL
5179                   || gsym->has_plt_offset()
5180                   || gsym->final_value_is_known()
5181                   || (gsym->is_defined()
5182                       && !gsym->is_from_dynobj()
5183                       && !gsym->is_preemptible()));
5184       reloc_status =
5185         Arm_relocate_functions::plt32(relinfo, view, gsym, object, r_sym,
5186                                       psymval, address, thumb_bit,
5187                                       is_weakly_undefined_without_plt);
5188       break;
5189
5190     case elfcpp::R_ARM_CALL:
5191       reloc_status =
5192         Arm_relocate_functions::call(relinfo, view, gsym, object, r_sym,
5193                                      psymval, address, thumb_bit,
5194                                      is_weakly_undefined_without_plt);
5195       break;
5196
5197     case elfcpp::R_ARM_JUMP24:
5198       reloc_status =
5199         Arm_relocate_functions::jump24(relinfo, view, gsym, object, r_sym,
5200                                        psymval, address, thumb_bit,
5201                                        is_weakly_undefined_without_plt);
5202       break;
5203
5204     case elfcpp::R_ARM_THM_JUMP24:
5205       reloc_status =
5206         Arm_relocate_functions::thm_jump24(relinfo, view, gsym, object, r_sym,
5207                                            psymval, address, thumb_bit,
5208                                            is_weakly_undefined_without_plt);
5209       break;
5210
5211     case elfcpp::R_ARM_PREL31:
5212       reloc_status = Arm_relocate_functions::prel31(view, object, psymval,
5213                                                     address, thumb_bit);
5214       break;
5215
5216     case elfcpp::R_ARM_TARGET1:
5217       // This should have been mapped to another type already.
5218       // Fall through.
5219     case elfcpp::R_ARM_COPY:
5220     case elfcpp::R_ARM_GLOB_DAT:
5221     case elfcpp::R_ARM_JUMP_SLOT:
5222     case elfcpp::R_ARM_RELATIVE:
5223       // These are relocations which should only be seen by the
5224       // dynamic linker, and should never be seen here.
5225       gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
5226                              _("unexpected reloc %u in object file"),
5227                              r_type);
5228       break;
5229
5230     default:
5231       gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
5232                              _("unsupported reloc %u"),
5233                              r_type);
5234       break;
5235     }
5236
5237   // Report any errors.
5238   switch (reloc_status)
5239     {
5240     case Arm_relocate_functions::STATUS_OKAY:
5241       break;
5242     case Arm_relocate_functions::STATUS_OVERFLOW:
5243       gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
5244                              _("relocation overflow in relocation %u"),
5245                              r_type);
5246       break;
5247     case Arm_relocate_functions::STATUS_BAD_RELOC:
5248       gold_error_at_location(
5249         relinfo,
5250         relnum,
5251         rel.get_r_offset(),
5252         _("unexpected opcode while processing relocation %u"),
5253         r_type);
5254       break;
5255     default:
5256       gold_unreachable();
5257     }
5258
5259   return true;
5260 }
5261
5262 // Relocate section data.
5263
5264 template<bool big_endian>
5265 void
5266 Target_arm<big_endian>::relocate_section(
5267     const Relocate_info<32, big_endian>* relinfo,
5268     unsigned int sh_type,
5269     const unsigned char* prelocs,
5270     size_t reloc_count,
5271     Output_section* output_section,
5272     bool needs_special_offset_handling,
5273     unsigned char* view,
5274     Arm_address address,
5275     section_size_type view_size,
5276     const Reloc_symbol_changes* reloc_symbol_changes)
5277 {
5278   typedef typename Target_arm<big_endian>::Relocate Arm_relocate;
5279   gold_assert(sh_type == elfcpp::SHT_REL);
5280
5281   Arm_input_section<big_endian>* arm_input_section =
5282     this->find_arm_input_section(relinfo->object, relinfo->data_shndx);
5283
5284   // This is an ARM input section and the view covers the whole output
5285   // section.
5286   if (arm_input_section != NULL)
5287     {
5288       gold_assert(needs_special_offset_handling);
5289       Arm_address section_address = arm_input_section->address();
5290       section_size_type section_size = arm_input_section->data_size();
5291
5292       gold_assert((arm_input_section->address() >= address)
5293                   && ((arm_input_section->address()
5294                        + arm_input_section->data_size())
5295                       <= (address + view_size)));
5296
5297       off_t offset = section_address - address;
5298       view += offset;
5299       address += offset;
5300       view_size = section_size;
5301     }
5302
5303   gold::relocate_section<32, big_endian, Target_arm, elfcpp::SHT_REL,
5304                          Arm_relocate>(
5305     relinfo,
5306     this,
5307     prelocs,
5308     reloc_count,
5309     output_section,
5310     needs_special_offset_handling,
5311     view,
5312     address,
5313     view_size,
5314     reloc_symbol_changes);
5315 }
5316
5317 // Return the size of a relocation while scanning during a relocatable
5318 // link.
5319
5320 template<bool big_endian>
5321 unsigned int
5322 Target_arm<big_endian>::Relocatable_size_for_reloc::get_size_for_reloc(
5323     unsigned int r_type,
5324     Relobj* object)
5325 {
5326   r_type = get_real_reloc_type(r_type);
5327   switch (r_type)
5328     {
5329     case elfcpp::R_ARM_NONE:
5330       return 0;
5331
5332     case elfcpp::R_ARM_ABS8:
5333       return 1;
5334
5335     case elfcpp::R_ARM_ABS16:
5336     case elfcpp::R_ARM_THM_ABS5:
5337       return 2;
5338
5339     case elfcpp::R_ARM_ABS32:
5340     case elfcpp::R_ARM_ABS32_NOI:
5341     case elfcpp::R_ARM_ABS12:
5342     case elfcpp::R_ARM_BASE_ABS:
5343     case elfcpp::R_ARM_REL32:
5344     case elfcpp::R_ARM_THM_CALL:
5345     case elfcpp::R_ARM_GOTOFF32:
5346     case elfcpp::R_ARM_BASE_PREL:
5347     case elfcpp::R_ARM_GOT_BREL:
5348     case elfcpp::R_ARM_GOT_PREL:
5349     case elfcpp::R_ARM_PLT32:
5350     case elfcpp::R_ARM_CALL:
5351     case elfcpp::R_ARM_JUMP24:
5352     case elfcpp::R_ARM_PREL31:
5353     case elfcpp::R_ARM_MOVW_ABS_NC:
5354     case elfcpp::R_ARM_MOVT_ABS:
5355     case elfcpp::R_ARM_THM_MOVW_ABS_NC:
5356     case elfcpp::R_ARM_THM_MOVT_ABS:
5357     case elfcpp::R_ARM_MOVW_PREL_NC:
5358     case elfcpp::R_ARM_MOVT_PREL:
5359     case elfcpp::R_ARM_THM_MOVW_PREL_NC:
5360     case elfcpp::R_ARM_THM_MOVT_PREL:
5361       return 4;
5362
5363     case elfcpp::R_ARM_TARGET1:
5364       // This should have been mapped to another type already.
5365       // Fall through.
5366     case elfcpp::R_ARM_COPY:
5367     case elfcpp::R_ARM_GLOB_DAT:
5368     case elfcpp::R_ARM_JUMP_SLOT:
5369     case elfcpp::R_ARM_RELATIVE:
5370       // These are relocations which should only be seen by the
5371       // dynamic linker, and should never be seen here.
5372       gold_error(_("%s: unexpected reloc %u in object file"),
5373                  object->name().c_str(), r_type);
5374       return 0;
5375
5376     default:
5377       object->error(_("unsupported reloc %u in object file"), r_type);
5378       return 0;
5379     }
5380 }
5381
5382 // Scan the relocs during a relocatable link.
5383
5384 template<bool big_endian>
5385 void
5386 Target_arm<big_endian>::scan_relocatable_relocs(
5387     Symbol_table* symtab,
5388     Layout* layout,
5389     Sized_relobj<32, big_endian>* object,
5390     unsigned int data_shndx,
5391     unsigned int sh_type,
5392     const unsigned char* prelocs,
5393     size_t reloc_count,
5394     Output_section* output_section,
5395     bool needs_special_offset_handling,
5396     size_t local_symbol_count,
5397     const unsigned char* plocal_symbols,
5398     Relocatable_relocs* rr)
5399 {
5400   gold_assert(sh_type == elfcpp::SHT_REL);
5401
5402   typedef gold::Default_scan_relocatable_relocs<elfcpp::SHT_REL,
5403     Relocatable_size_for_reloc> Scan_relocatable_relocs;
5404
5405   gold::scan_relocatable_relocs<32, big_endian, elfcpp::SHT_REL,
5406       Scan_relocatable_relocs>(
5407     symtab,
5408     layout,
5409     object,
5410     data_shndx,
5411     prelocs,
5412     reloc_count,
5413     output_section,
5414     needs_special_offset_handling,
5415     local_symbol_count,
5416     plocal_symbols,
5417     rr);
5418 }
5419
5420 // Relocate a section during a relocatable link.
5421
5422 template<bool big_endian>
5423 void
5424 Target_arm<big_endian>::relocate_for_relocatable(
5425     const Relocate_info<32, big_endian>* relinfo,
5426     unsigned int sh_type,
5427     const unsigned char* prelocs,
5428     size_t reloc_count,
5429     Output_section* output_section,
5430     off_t offset_in_output_section,
5431     const Relocatable_relocs* rr,
5432     unsigned char* view,
5433     Arm_address view_address,
5434     section_size_type view_size,
5435     unsigned char* reloc_view,
5436     section_size_type reloc_view_size)
5437 {
5438   gold_assert(sh_type == elfcpp::SHT_REL);
5439
5440   gold::relocate_for_relocatable<32, big_endian, elfcpp::SHT_REL>(
5441     relinfo,
5442     prelocs,
5443     reloc_count,
5444     output_section,
5445     offset_in_output_section,
5446     rr,
5447     view,
5448     view_address,
5449     view_size,
5450     reloc_view,
5451     reloc_view_size);
5452 }
5453
5454 // Return the value to use for a dynamic symbol which requires special
5455 // treatment.  This is how we support equality comparisons of function
5456 // pointers across shared library boundaries, as described in the
5457 // processor specific ABI supplement.
5458
5459 template<bool big_endian>
5460 uint64_t
5461 Target_arm<big_endian>::do_dynsym_value(const Symbol* gsym) const
5462 {
5463   gold_assert(gsym->is_from_dynobj() && gsym->has_plt_offset());
5464   return this->plt_section()->address() + gsym->plt_offset();
5465 }
5466
5467 // Map platform-specific relocs to real relocs
5468 //
5469 template<bool big_endian>
5470 unsigned int
5471 Target_arm<big_endian>::get_real_reloc_type (unsigned int r_type)
5472 {
5473   switch (r_type)
5474     {
5475     case elfcpp::R_ARM_TARGET1:
5476       // This is either R_ARM_ABS32 or R_ARM_REL32;
5477       return elfcpp::R_ARM_ABS32;
5478
5479     case elfcpp::R_ARM_TARGET2:
5480       // This can be any reloc type but ususally is R_ARM_GOT_PREL
5481       return elfcpp::R_ARM_GOT_PREL;
5482
5483     default:
5484       return r_type;
5485     }
5486 }
5487
5488 // Whether if two EABI versions V1 and V2 are compatible.
5489
5490 template<bool big_endian>
5491 bool
5492 Target_arm<big_endian>::are_eabi_versions_compatible(
5493     elfcpp::Elf_Word v1,
5494     elfcpp::Elf_Word v2)
5495 {
5496   // v4 and v5 are the same spec before and after it was released,
5497   // so allow mixing them.
5498   if ((v1 == elfcpp::EF_ARM_EABI_VER4 && v2 == elfcpp::EF_ARM_EABI_VER5)
5499       || (v1 == elfcpp::EF_ARM_EABI_VER5 && v2 == elfcpp::EF_ARM_EABI_VER4))
5500     return true;
5501
5502   return v1 == v2;
5503 }
5504
5505 // Combine FLAGS from an input object called NAME and the processor-specific
5506 // flags in the ELF header of the output.  Much of this is adapted from the
5507 // processor-specific flags merging code in elf32_arm_merge_private_bfd_data
5508 // in bfd/elf32-arm.c.
5509
5510 template<bool big_endian>
5511 void
5512 Target_arm<big_endian>::merge_processor_specific_flags(
5513     const std::string& name,
5514     elfcpp::Elf_Word flags)
5515 {
5516   if (this->are_processor_specific_flags_set())
5517     {
5518       elfcpp::Elf_Word out_flags = this->processor_specific_flags();
5519
5520       // Nothing to merge if flags equal to those in output.
5521       if (flags == out_flags)
5522         return;
5523
5524       // Complain about various flag mismatches.
5525       elfcpp::Elf_Word version1 = elfcpp::arm_eabi_version(flags);
5526       elfcpp::Elf_Word version2 = elfcpp::arm_eabi_version(out_flags);
5527       if (!this->are_eabi_versions_compatible(version1, version2))
5528         gold_error(_("Source object %s has EABI version %d but output has "
5529                      "EABI version %d."),
5530                    name.c_str(),
5531                    (flags & elfcpp::EF_ARM_EABIMASK) >> 24,
5532                    (out_flags & elfcpp::EF_ARM_EABIMASK) >> 24);
5533     }
5534   else
5535     {
5536       // If the input is the default architecture and had the default
5537       // flags then do not bother setting the flags for the output
5538       // architecture, instead allow future merges to do this.  If no
5539       // future merges ever set these flags then they will retain their
5540       // uninitialised values, which surprise surprise, correspond
5541       // to the default values.
5542       if (flags == 0)
5543         return;
5544
5545       // This is the first time, just copy the flags.
5546       // We only copy the EABI version for now.
5547       this->set_processor_specific_flags(flags & elfcpp::EF_ARM_EABIMASK);
5548     }
5549 }
5550
5551 // Adjust ELF file header.
5552 template<bool big_endian>
5553 void
5554 Target_arm<big_endian>::do_adjust_elf_header(
5555     unsigned char* view,
5556     int len) const
5557 {
5558   gold_assert(len == elfcpp::Elf_sizes<32>::ehdr_size);
5559
5560   elfcpp::Ehdr<32, big_endian> ehdr(view);
5561   unsigned char e_ident[elfcpp::EI_NIDENT];
5562   memcpy(e_ident, ehdr.get_e_ident(), elfcpp::EI_NIDENT);
5563
5564   if (elfcpp::arm_eabi_version(this->processor_specific_flags())
5565       == elfcpp::EF_ARM_EABI_UNKNOWN)
5566     e_ident[elfcpp::EI_OSABI] = elfcpp::ELFOSABI_ARM;
5567   else
5568     e_ident[elfcpp::EI_OSABI] = 0;
5569   e_ident[elfcpp::EI_ABIVERSION] = 0;
5570
5571   // FIXME: Do EF_ARM_BE8 adjustment.
5572
5573   elfcpp::Ehdr_write<32, big_endian> oehdr(view);
5574   oehdr.put_e_ident(e_ident);
5575 }
5576
5577 // do_make_elf_object to override the same function in the base class.
5578 // We need to use a target-specific sub-class of Sized_relobj<32, big_endian>
5579 // to store ARM specific information.  Hence we need to have our own
5580 // ELF object creation.
5581
5582 template<bool big_endian>
5583 Object*
5584 Target_arm<big_endian>::do_make_elf_object(
5585     const std::string& name,
5586     Input_file* input_file,
5587     off_t offset, const elfcpp::Ehdr<32, big_endian>& ehdr)
5588 {
5589   int et = ehdr.get_e_type();
5590   if (et == elfcpp::ET_REL)
5591     {
5592       Arm_relobj<big_endian>* obj =
5593         new Arm_relobj<big_endian>(name, input_file, offset, ehdr);
5594       obj->setup();
5595       return obj;
5596     }
5597   else if (et == elfcpp::ET_DYN)
5598     {
5599       Sized_dynobj<32, big_endian>* obj =
5600         new Arm_dynobj<big_endian>(name, input_file, offset, ehdr);
5601       obj->setup();
5602       return obj;
5603     }
5604   else
5605     {
5606       gold_error(_("%s: unsupported ELF file type %d"),
5607                  name.c_str(), et);
5608       return NULL;
5609     }
5610 }
5611
5612 // Read the architecture from the Tag_also_compatible_with attribute, if any.
5613 // Returns -1 if no architecture could be read.
5614 // This is adapted from get_secondary_compatible_arch() in bfd/elf32-arm.c.
5615
5616 template<bool big_endian>
5617 int
5618 Target_arm<big_endian>::get_secondary_compatible_arch(
5619     const Attributes_section_data* pasd)
5620 {
5621   const Object_attribute *known_attributes =
5622     pasd->known_attributes(Object_attribute::OBJ_ATTR_PROC);
5623
5624   // Note: the tag and its argument below are uleb128 values, though
5625   // currently-defined values fit in one byte for each.
5626   const std::string& sv =
5627     known_attributes[elfcpp::Tag_also_compatible_with].string_value();
5628   if (sv.size() == 2
5629       && sv.data()[0] == elfcpp::Tag_CPU_arch
5630       && (sv.data()[1] & 128) != 128)
5631    return sv.data()[1];
5632
5633   // This tag is "safely ignorable", so don't complain if it looks funny.
5634   return -1;
5635 }
5636
5637 // Set, or unset, the architecture of the Tag_also_compatible_with attribute.
5638 // The tag is removed if ARCH is -1.
5639 // This is adapted from set_secondary_compatible_arch() in bfd/elf32-arm.c.
5640
5641 template<bool big_endian>
5642 void
5643 Target_arm<big_endian>::set_secondary_compatible_arch(
5644     Attributes_section_data* pasd,
5645     int arch)
5646 {
5647   Object_attribute *known_attributes =
5648     pasd->known_attributes(Object_attribute::OBJ_ATTR_PROC);
5649
5650   if (arch == -1)
5651     {
5652       known_attributes[elfcpp::Tag_also_compatible_with].set_string_value("");
5653       return;
5654     }
5655
5656   // Note: the tag and its argument below are uleb128 values, though
5657   // currently-defined values fit in one byte for each.
5658   char sv[3];
5659   sv[0] = elfcpp::Tag_CPU_arch;
5660   gold_assert(arch != 0);
5661   sv[1] = arch;
5662   sv[2] = '\0';
5663
5664   known_attributes[elfcpp::Tag_also_compatible_with].set_string_value(sv);
5665 }
5666
5667 // Combine two values for Tag_CPU_arch, taking secondary compatibility tags
5668 // into account.
5669 // This is adapted from tag_cpu_arch_combine() in bfd/elf32-arm.c.
5670
5671 template<bool big_endian>
5672 int
5673 Target_arm<big_endian>::tag_cpu_arch_combine(
5674     const char* name,
5675     int oldtag,
5676     int* secondary_compat_out,
5677     int newtag,
5678     int secondary_compat)
5679 {
5680 #define T(X) elfcpp::TAG_CPU_ARCH_##X
5681   static const int v6t2[] =
5682     {
5683       T(V6T2),   // PRE_V4.
5684       T(V6T2),   // V4.
5685       T(V6T2),   // V4T.
5686       T(V6T2),   // V5T.
5687       T(V6T2),   // V5TE.
5688       T(V6T2),   // V5TEJ.
5689       T(V6T2),   // V6.
5690       T(V7),     // V6KZ.
5691       T(V6T2)    // V6T2.
5692     };
5693   static const int v6k[] =
5694     {
5695       T(V6K),    // PRE_V4.
5696       T(V6K),    // V4.
5697       T(V6K),    // V4T.
5698       T(V6K),    // V5T.
5699       T(V6K),    // V5TE.
5700       T(V6K),    // V5TEJ.
5701       T(V6K),    // V6.
5702       T(V6KZ),   // V6KZ.
5703       T(V7),     // V6T2.
5704       T(V6K)     // V6K.
5705     };
5706   static const int v7[] =
5707     {
5708       T(V7),     // PRE_V4.
5709       T(V7),     // V4.
5710       T(V7),     // V4T.
5711       T(V7),     // V5T.
5712       T(V7),     // V5TE.
5713       T(V7),     // V5TEJ.
5714       T(V7),     // V6.
5715       T(V7),     // V6KZ.
5716       T(V7),     // V6T2.
5717       T(V7),     // V6K.
5718       T(V7)      // V7.
5719     };
5720   static const int v6_m[] =
5721     {
5722       -1,        // PRE_V4.
5723       -1,        // V4.
5724       T(V6K),    // V4T.
5725       T(V6K),    // V5T.
5726       T(V6K),    // V5TE.
5727       T(V6K),    // V5TEJ.
5728       T(V6K),    // V6.
5729       T(V6KZ),   // V6KZ.
5730       T(V7),     // V6T2.
5731       T(V6K),    // V6K.
5732       T(V7),     // V7.
5733       T(V6_M)    // V6_M.
5734     };
5735   static const int v6s_m[] =
5736     {
5737       -1,        // PRE_V4.
5738       -1,        // V4.
5739       T(V6K),    // V4T.
5740       T(V6K),    // V5T.
5741       T(V6K),    // V5TE.
5742       T(V6K),    // V5TEJ.
5743       T(V6K),    // V6.
5744       T(V6KZ),   // V6KZ.
5745       T(V7),     // V6T2.
5746       T(V6K),    // V6K.
5747       T(V7),     // V7.
5748       T(V6S_M),  // V6_M.
5749       T(V6S_M)   // V6S_M.
5750     };
5751   static const int v7e_m[] =
5752     {
5753       -1,       // PRE_V4.
5754       -1,       // V4.
5755       T(V7E_M), // V4T.
5756       T(V7E_M), // V5T.
5757       T(V7E_M), // V5TE.
5758       T(V7E_M), // V5TEJ.
5759       T(V7E_M), // V6.
5760       T(V7E_M), // V6KZ.
5761       T(V7E_M), // V6T2.
5762       T(V7E_M), // V6K.
5763       T(V7E_M), // V7.
5764       T(V7E_M), // V6_M.
5765       T(V7E_M), // V6S_M.
5766       T(V7E_M)  // V7E_M.
5767     };
5768   static const int v4t_plus_v6_m[] =
5769     {
5770       -1,               // PRE_V4.
5771       -1,               // V4.
5772       T(V4T),           // V4T.
5773       T(V5T),           // V5T.
5774       T(V5TE),          // V5TE.
5775       T(V5TEJ),         // V5TEJ.
5776       T(V6),            // V6.
5777       T(V6KZ),          // V6KZ.
5778       T(V6T2),          // V6T2.
5779       T(V6K),           // V6K.
5780       T(V7),            // V7.
5781       T(V6_M),          // V6_M.
5782       T(V6S_M),         // V6S_M.
5783       T(V7E_M),         // V7E_M.
5784       T(V4T_PLUS_V6_M)  // V4T plus V6_M.
5785     };
5786   static const int *comb[] =
5787     {
5788       v6t2,
5789       v6k,
5790       v7,
5791       v6_m,
5792       v6s_m,
5793       v7e_m,
5794       // Pseudo-architecture.
5795       v4t_plus_v6_m
5796     };
5797
5798   // Check we've not got a higher architecture than we know about.
5799
5800   if (oldtag >= elfcpp::MAX_TAG_CPU_ARCH || newtag >= elfcpp::MAX_TAG_CPU_ARCH)
5801     {
5802       gold_error(_("%s: unknown CPU architecture"), name);
5803       return -1;
5804     }
5805
5806   // Override old tag if we have a Tag_also_compatible_with on the output.
5807
5808   if ((oldtag == T(V6_M) && *secondary_compat_out == T(V4T))
5809       || (oldtag == T(V4T) && *secondary_compat_out == T(V6_M)))
5810     oldtag = T(V4T_PLUS_V6_M);
5811
5812   // And override the new tag if we have a Tag_also_compatible_with on the
5813   // input.
5814
5815   if ((newtag == T(V6_M) && secondary_compat == T(V4T))
5816       || (newtag == T(V4T) && secondary_compat == T(V6_M)))
5817     newtag = T(V4T_PLUS_V6_M);
5818
5819   // Architectures before V6KZ add features monotonically.
5820   int tagh = std::max(oldtag, newtag);
5821   if (tagh <= elfcpp::TAG_CPU_ARCH_V6KZ)
5822     return tagh;
5823
5824   int tagl = std::min(oldtag, newtag);
5825   int result = comb[tagh - T(V6T2)][tagl];
5826
5827   // Use Tag_CPU_arch == V4T and Tag_also_compatible_with (Tag_CPU_arch V6_M)
5828   // as the canonical version.
5829   if (result == T(V4T_PLUS_V6_M))
5830     {
5831       result = T(V4T);
5832       *secondary_compat_out = T(V6_M);
5833     }
5834   else
5835     *secondary_compat_out = -1;
5836
5837   if (result == -1)
5838     {
5839       gold_error(_("%s: conflicting CPU architectures %d/%d"),
5840                  name, oldtag, newtag);
5841       return -1;
5842     }
5843
5844   return result;
5845 #undef T
5846 }
5847
5848 // Helper to print AEABI enum tag value.
5849
5850 template<bool big_endian>
5851 std::string
5852 Target_arm<big_endian>::aeabi_enum_name(unsigned int value)
5853 {
5854   static const char *aeabi_enum_names[] =
5855     { "", "variable-size", "32-bit", "" };
5856   const size_t aeabi_enum_names_size =
5857     sizeof(aeabi_enum_names) / sizeof(aeabi_enum_names[0]);
5858
5859   if (value < aeabi_enum_names_size)
5860     return std::string(aeabi_enum_names[value]);
5861   else
5862     {
5863       char buffer[100];
5864       sprintf(buffer, "<unknown value %u>", value);
5865       return std::string(buffer);
5866     }
5867 }
5868
5869 // Return the string value to store in TAG_CPU_name.
5870
5871 template<bool big_endian>
5872 std::string
5873 Target_arm<big_endian>::tag_cpu_name_value(unsigned int value)
5874 {
5875   static const char *name_table[] = {
5876     // These aren't real CPU names, but we can't guess
5877     // that from the architecture version alone.
5878    "Pre v4",
5879    "ARM v4",
5880    "ARM v4T",
5881    "ARM v5T",
5882    "ARM v5TE",
5883    "ARM v5TEJ",
5884    "ARM v6",
5885    "ARM v6KZ",
5886    "ARM v6T2",
5887    "ARM v6K",
5888    "ARM v7",
5889    "ARM v6-M",
5890    "ARM v6S-M",
5891    "ARM v7E-M"
5892  };
5893  const size_t name_table_size = sizeof(name_table) / sizeof(name_table[0]);
5894
5895   if (value < name_table_size)
5896     return std::string(name_table[value]);
5897   else
5898     {
5899       char buffer[100];
5900       sprintf(buffer, "<unknown CPU value %u>", value);
5901       return std::string(buffer);
5902     } 
5903 }
5904
5905 // Merge object attributes from input file called NAME with those of the
5906 // output.  The input object attributes are in the object pointed by PASD.
5907
5908 template<bool big_endian>
5909 void
5910 Target_arm<big_endian>::merge_object_attributes(
5911     const char* name,
5912     const Attributes_section_data* pasd)
5913 {
5914   // Return if there is no attributes section data.
5915   if (pasd == NULL)
5916     return;
5917
5918   // If output has no object attributes, just copy.
5919   if (this->attributes_section_data_ == NULL)
5920     {
5921       this->attributes_section_data_ = new Attributes_section_data(*pasd);
5922       return;
5923     }
5924
5925   const int vendor = Object_attribute::OBJ_ATTR_PROC;
5926   const Object_attribute* in_attr = pasd->known_attributes(vendor);
5927   Object_attribute* out_attr =
5928     this->attributes_section_data_->known_attributes(vendor);
5929
5930   // This needs to happen before Tag_ABI_FP_number_model is merged.  */
5931   if (in_attr[elfcpp::Tag_ABI_VFP_args].int_value()
5932       != out_attr[elfcpp::Tag_ABI_VFP_args].int_value())
5933     {
5934       // Ignore mismatches if the object doesn't use floating point.  */
5935       if (out_attr[elfcpp::Tag_ABI_FP_number_model].int_value() == 0)
5936         out_attr[elfcpp::Tag_ABI_VFP_args].set_int_value(
5937             in_attr[elfcpp::Tag_ABI_VFP_args].int_value());
5938       else if (in_attr[elfcpp::Tag_ABI_FP_number_model].int_value() != 0)
5939         gold_error(_("%s uses VFP register arguments, output does not"),
5940                    name);
5941     }
5942
5943   for (int i = 4; i < Vendor_object_attributes::NUM_KNOWN_ATTRIBUTES; ++i)
5944     {
5945       // Merge this attribute with existing attributes.
5946       switch (i)
5947         {
5948         case elfcpp::Tag_CPU_raw_name:
5949         case elfcpp::Tag_CPU_name:
5950           // These are merged after Tag_CPU_arch.
5951           break;
5952
5953         case elfcpp::Tag_ABI_optimization_goals:
5954         case elfcpp::Tag_ABI_FP_optimization_goals:
5955           // Use the first value seen.
5956           break;
5957
5958         case elfcpp::Tag_CPU_arch:
5959           {
5960             unsigned int saved_out_attr = out_attr->int_value();
5961             // Merge Tag_CPU_arch and Tag_also_compatible_with.
5962             int secondary_compat =
5963               this->get_secondary_compatible_arch(pasd);
5964             int secondary_compat_out =
5965               this->get_secondary_compatible_arch(
5966                   this->attributes_section_data_);
5967             out_attr[i].set_int_value(
5968                 tag_cpu_arch_combine(name, out_attr[i].int_value(),
5969                                      &secondary_compat_out,
5970                                      in_attr[i].int_value(),
5971                                      secondary_compat));
5972             this->set_secondary_compatible_arch(this->attributes_section_data_,
5973                                                 secondary_compat_out);
5974
5975             // Merge Tag_CPU_name and Tag_CPU_raw_name.
5976             if (out_attr[i].int_value() == saved_out_attr)
5977               ; // Leave the names alone.
5978             else if (out_attr[i].int_value() == in_attr[i].int_value())
5979               {
5980                 // The output architecture has been changed to match the
5981                 // input architecture.  Use the input names.
5982                 out_attr[elfcpp::Tag_CPU_name].set_string_value(
5983                     in_attr[elfcpp::Tag_CPU_name].string_value());
5984                 out_attr[elfcpp::Tag_CPU_raw_name].set_string_value(
5985                     in_attr[elfcpp::Tag_CPU_raw_name].string_value());
5986               }
5987             else
5988               {
5989                 out_attr[elfcpp::Tag_CPU_name].set_string_value("");
5990                 out_attr[elfcpp::Tag_CPU_raw_name].set_string_value("");
5991               }
5992
5993             // If we still don't have a value for Tag_CPU_name,
5994             // make one up now.  Tag_CPU_raw_name remains blank.
5995             if (out_attr[elfcpp::Tag_CPU_name].string_value() == "")
5996               {
5997                 const std::string cpu_name =
5998                   this->tag_cpu_name_value(out_attr[i].int_value());
5999                 // FIXME:  If we see an unknown CPU, this will be set
6000                 // to "<unknown CPU n>", where n is the attribute value.
6001                 // This is different from BFD, which leaves the name alone.
6002                 out_attr[elfcpp::Tag_CPU_name].set_string_value(cpu_name);
6003               }
6004           }
6005           break;
6006
6007         case elfcpp::Tag_ARM_ISA_use:
6008         case elfcpp::Tag_THUMB_ISA_use:
6009         case elfcpp::Tag_WMMX_arch:
6010         case elfcpp::Tag_Advanced_SIMD_arch:
6011           // ??? Do Advanced_SIMD (NEON) and WMMX conflict?
6012         case elfcpp::Tag_ABI_FP_rounding:
6013         case elfcpp::Tag_ABI_FP_exceptions:
6014         case elfcpp::Tag_ABI_FP_user_exceptions:
6015         case elfcpp::Tag_ABI_FP_number_model:
6016         case elfcpp::Tag_VFP_HP_extension:
6017         case elfcpp::Tag_CPU_unaligned_access:
6018         case elfcpp::Tag_T2EE_use:
6019         case elfcpp::Tag_Virtualization_use:
6020         case elfcpp::Tag_MPextension_use:
6021           // Use the largest value specified.
6022           if (in_attr[i].int_value() > out_attr[i].int_value())
6023             out_attr[i].set_int_value(in_attr[i].int_value());
6024           break;
6025
6026         case elfcpp::Tag_ABI_align8_preserved:
6027         case elfcpp::Tag_ABI_PCS_RO_data:
6028           // Use the smallest value specified.
6029           if (in_attr[i].int_value() < out_attr[i].int_value())
6030             out_attr[i].set_int_value(in_attr[i].int_value());
6031           break;
6032
6033         case elfcpp::Tag_ABI_align8_needed:
6034           if ((in_attr[i].int_value() > 0 || out_attr[i].int_value() > 0)
6035               && (in_attr[elfcpp::Tag_ABI_align8_preserved].int_value() == 0
6036                   || (out_attr[elfcpp::Tag_ABI_align8_preserved].int_value()
6037                       == 0)))
6038             {
6039               // This error message should be enabled once all non-conformant
6040               // binaries in the toolchain have had the attributes set
6041               // properly.
6042               // gold_error(_("output 8-byte data alignment conflicts with %s"),
6043               //            name);
6044             }
6045           // Fall through.
6046         case elfcpp::Tag_ABI_FP_denormal:
6047         case elfcpp::Tag_ABI_PCS_GOT_use:
6048           {
6049             // These tags have 0 = don't care, 1 = strong requirement,
6050             // 2 = weak requirement.
6051             static const int order_021[3] = {0, 2, 1};
6052
6053             // Use the "greatest" from the sequence 0, 2, 1, or the largest
6054             // value if greater than 2 (for future-proofing).
6055             if ((in_attr[i].int_value() > 2
6056                  && in_attr[i].int_value() > out_attr[i].int_value())
6057                 || (in_attr[i].int_value() <= 2
6058                     && out_attr[i].int_value() <= 2
6059                     && (order_021[in_attr[i].int_value()]
6060                         > order_021[out_attr[i].int_value()])))
6061               out_attr[i].set_int_value(in_attr[i].int_value());
6062           }
6063           break;
6064
6065         case elfcpp::Tag_CPU_arch_profile:
6066           if (out_attr[i].int_value() != in_attr[i].int_value())
6067             {
6068               // 0 will merge with anything.
6069               // 'A' and 'S' merge to 'A'.
6070               // 'R' and 'S' merge to 'R'.
6071               // 'M' and 'A|R|S' is an error.
6072               if (out_attr[i].int_value() == 0
6073                   || (out_attr[i].int_value() == 'S'
6074                       && (in_attr[i].int_value() == 'A'
6075                           || in_attr[i].int_value() == 'R')))
6076                 out_attr[i].set_int_value(in_attr[i].int_value());
6077               else if (in_attr[i].int_value() == 0
6078                        || (in_attr[i].int_value() == 'S'
6079                            && (out_attr[i].int_value() == 'A'
6080                                || out_attr[i].int_value() == 'R')))
6081                 ; // Do nothing.
6082               else
6083                 {
6084                   gold_error
6085                     (_("conflicting architecture profiles %c/%c"),
6086                      in_attr[i].int_value() ? in_attr[i].int_value() : '0',
6087                      out_attr[i].int_value() ? out_attr[i].int_value() : '0');
6088                 }
6089             }
6090           break;
6091         case elfcpp::Tag_VFP_arch:
6092             {
6093               static const struct
6094               {
6095                   int ver;
6096                   int regs;
6097               } vfp_versions[7] =
6098                 {
6099                   {0, 0},
6100                   {1, 16},
6101                   {2, 16},
6102                   {3, 32},
6103                   {3, 16},
6104                   {4, 32},
6105                   {4, 16}
6106                 };
6107
6108               // Values greater than 6 aren't defined, so just pick the
6109               // biggest.
6110               if (in_attr[i].int_value() > 6
6111                   && in_attr[i].int_value() > out_attr[i].int_value())
6112                 {
6113                   *out_attr = *in_attr;
6114                   break;
6115                 }
6116               // The output uses the superset of input features
6117               // (ISA version) and registers.
6118               int ver = std::max(vfp_versions[in_attr[i].int_value()].ver,
6119                                  vfp_versions[out_attr[i].int_value()].ver);
6120               int regs = std::max(vfp_versions[in_attr[i].int_value()].regs,
6121                                   vfp_versions[out_attr[i].int_value()].regs);
6122               // This assumes all possible supersets are also a valid
6123               // options.
6124               int newval;
6125               for (newval = 6; newval > 0; newval--)
6126                 {
6127                   if (regs == vfp_versions[newval].regs
6128                       && ver == vfp_versions[newval].ver)
6129                     break;
6130                 }
6131               out_attr[i].set_int_value(newval);
6132             }
6133           break;
6134         case elfcpp::Tag_PCS_config:
6135           if (out_attr[i].int_value() == 0)
6136             out_attr[i].set_int_value(in_attr[i].int_value());
6137           else if (in_attr[i].int_value() != 0 && out_attr[i].int_value() != 0)
6138             {
6139               // It's sometimes ok to mix different configs, so this is only
6140               // a warning.
6141               gold_warning(_("%s: conflicting platform configuration"), name);
6142             }
6143           break;
6144         case elfcpp::Tag_ABI_PCS_R9_use:
6145           if (in_attr[i].int_value() != out_attr[i].int_value()
6146               && out_attr[i].int_value() != elfcpp::AEABI_R9_unused
6147               && in_attr[i].int_value() != elfcpp::AEABI_R9_unused)
6148             {
6149               gold_error(_("%s: conflicting use of R9"), name);
6150             }
6151           if (out_attr[i].int_value() == elfcpp::AEABI_R9_unused)
6152             out_attr[i].set_int_value(in_attr[i].int_value());
6153           break;
6154         case elfcpp::Tag_ABI_PCS_RW_data:
6155           if (in_attr[i].int_value() == elfcpp::AEABI_PCS_RW_data_SBrel
6156               && (in_attr[elfcpp::Tag_ABI_PCS_R9_use].int_value()
6157                   != elfcpp::AEABI_R9_SB)
6158               && (out_attr[elfcpp::Tag_ABI_PCS_R9_use].int_value()
6159                   != elfcpp::AEABI_R9_unused))
6160             {
6161               gold_error(_("%s: SB relative addressing conflicts with use "
6162                            "of R9"),
6163                          name);
6164             }
6165           // Use the smallest value specified.
6166           if (in_attr[i].int_value() < out_attr[i].int_value())
6167             out_attr[i].set_int_value(in_attr[i].int_value());
6168           break;
6169         case elfcpp::Tag_ABI_PCS_wchar_t:
6170           // FIXME: Make it possible to turn off this warning.
6171           if (out_attr[i].int_value()
6172               && in_attr[i].int_value()
6173               && out_attr[i].int_value() != in_attr[i].int_value())
6174             {
6175               gold_warning(_("%s uses %u-byte wchar_t yet the output is to "
6176                              "use %u-byte wchar_t; use of wchar_t values "
6177                              "across objects may fail"),
6178                            name, in_attr[i].int_value(),
6179                            out_attr[i].int_value());
6180             }
6181           else if (in_attr[i].int_value() && !out_attr[i].int_value())
6182             out_attr[i].set_int_value(in_attr[i].int_value());
6183           break;
6184         case elfcpp::Tag_ABI_enum_size:
6185           if (in_attr[i].int_value() != elfcpp::AEABI_enum_unused)
6186             {
6187               if (out_attr[i].int_value() == elfcpp::AEABI_enum_unused
6188                   || out_attr[i].int_value() == elfcpp::AEABI_enum_forced_wide)
6189                 {
6190                   // The existing object is compatible with anything.
6191                   // Use whatever requirements the new object has.
6192                   out_attr[i].set_int_value(in_attr[i].int_value());
6193                 }
6194               // FIXME: Make it possible to turn off this warning.
6195               else if (in_attr[i].int_value() != elfcpp::AEABI_enum_forced_wide
6196                        && out_attr[i].int_value() != in_attr[i].int_value())
6197                 {
6198                   unsigned int in_value = in_attr[i].int_value();
6199                   unsigned int out_value = out_attr[i].int_value();
6200                   gold_warning(_("%s uses %s enums yet the output is to use "
6201                                  "%s enums; use of enum values across objects "
6202                                  "may fail"),
6203                                name,
6204                                this->aeabi_enum_name(in_value).c_str(),
6205                                this->aeabi_enum_name(out_value).c_str());
6206                 }
6207             }
6208           break;
6209         case elfcpp::Tag_ABI_VFP_args:
6210           // Aready done.
6211           break;
6212         case elfcpp::Tag_ABI_WMMX_args:
6213           if (in_attr[i].int_value() != out_attr[i].int_value())
6214             {
6215               gold_error(_("%s uses iWMMXt register arguments, output does "
6216                            "not"),
6217                          name);
6218             }
6219           break;
6220         case Object_attribute::Tag_compatibility:
6221           // Merged in target-independent code.
6222           break;
6223         case elfcpp::Tag_ABI_HardFP_use:
6224           // 1 (SP) and 2 (DP) conflict, so combine to 3 (SP & DP).
6225           if ((in_attr[i].int_value() == 1 && out_attr[i].int_value() == 2)
6226               || (in_attr[i].int_value() == 2 && out_attr[i].int_value() == 1))
6227             out_attr[i].set_int_value(3);
6228           else if (in_attr[i].int_value() > out_attr[i].int_value())
6229             out_attr[i].set_int_value(in_attr[i].int_value());
6230           break;
6231         case elfcpp::Tag_ABI_FP_16bit_format:
6232           if (in_attr[i].int_value() != 0 && out_attr[i].int_value() != 0)
6233             {
6234               if (in_attr[i].int_value() != out_attr[i].int_value())
6235                 gold_error(_("fp16 format mismatch between %s and output"),
6236                            name);
6237             }
6238           if (in_attr[i].int_value() != 0)
6239             out_attr[i].set_int_value(in_attr[i].int_value());
6240           break;
6241
6242         case elfcpp::Tag_nodefaults:
6243           // This tag is set if it exists, but the value is unused (and is
6244           // typically zero).  We don't actually need to do anything here -
6245           // the merge happens automatically when the type flags are merged
6246           // below.
6247           break;
6248         case elfcpp::Tag_also_compatible_with:
6249           // Already done in Tag_CPU_arch.
6250           break;
6251         case elfcpp::Tag_conformance:
6252           // Keep the attribute if it matches.  Throw it away otherwise.
6253           // No attribute means no claim to conform.
6254           if (in_attr[i].string_value() != out_attr[i].string_value())
6255             out_attr[i].set_string_value("");
6256           break;
6257
6258         default:
6259           {
6260             const char* err_object = NULL;
6261
6262             // The "known_obj_attributes" table does contain some undefined
6263             // attributes.  Ensure that there are unused.
6264             if (out_attr[i].int_value() != 0
6265                 || out_attr[i].string_value() != "")
6266               err_object = "output";
6267             else if (in_attr[i].int_value() != 0
6268                      || in_attr[i].string_value() != "")
6269               err_object = name;
6270
6271             if (err_object != NULL)
6272               {
6273                 // Attribute numbers >=64 (mod 128) can be safely ignored.
6274                 if ((i & 127) < 64)
6275                   gold_error(_("%s: unknown mandatory EABI object attribute "
6276                                "%d"),
6277                              err_object, i);
6278                 else
6279                   gold_warning(_("%s: unknown EABI object attribute %d"),
6280                                err_object, i);
6281               }
6282
6283             // Only pass on attributes that match in both inputs.
6284             if (!in_attr[i].matches(out_attr[i]))
6285               {
6286                 out_attr[i].set_int_value(0);
6287                 out_attr[i].set_string_value("");
6288               }
6289           }
6290         }
6291
6292       // If out_attr was copied from in_attr then it won't have a type yet.
6293       if (in_attr[i].type() && !out_attr[i].type())
6294         out_attr[i].set_type(in_attr[i].type());
6295     }
6296
6297   // Merge Tag_compatibility attributes and any common GNU ones.
6298   this->attributes_section_data_->merge(name, pasd);
6299
6300   // Check for any attributes not known on ARM.
6301   typedef Vendor_object_attributes::Other_attributes Other_attributes;
6302   const Other_attributes* in_other_attributes = pasd->other_attributes(vendor);
6303   Other_attributes::const_iterator in_iter = in_other_attributes->begin();
6304   Other_attributes* out_other_attributes =
6305     this->attributes_section_data_->other_attributes(vendor);
6306   Other_attributes::iterator out_iter = out_other_attributes->begin();
6307
6308   while (in_iter != in_other_attributes->end()
6309          || out_iter != out_other_attributes->end())
6310     {
6311       const char* err_object = NULL;
6312       int err_tag = 0;
6313
6314       // The tags for each list are in numerical order.
6315       // If the tags are equal, then merge.
6316       if (out_iter != out_other_attributes->end()
6317           && (in_iter == in_other_attributes->end()
6318               || in_iter->first > out_iter->first))
6319         {
6320           // This attribute only exists in output.  We can't merge, and we
6321           // don't know what the tag means, so delete it.
6322           err_object = "output";
6323           err_tag = out_iter->first;
6324           int saved_tag = out_iter->first;
6325           delete out_iter->second;
6326           out_other_attributes->erase(out_iter); 
6327           out_iter = out_other_attributes->upper_bound(saved_tag);
6328         }
6329       else if (in_iter != in_other_attributes->end()
6330                && (out_iter != out_other_attributes->end()
6331                    || in_iter->first < out_iter->first))
6332         {
6333           // This attribute only exists in input. We can't merge, and we
6334           // don't know what the tag means, so ignore it.
6335           err_object = name;
6336           err_tag = in_iter->first;
6337           ++in_iter;
6338         }
6339       else // The tags are equal.
6340         {
6341           // As present, all attributes in the list are unknown, and
6342           // therefore can't be merged meaningfully.
6343           err_object = "output";
6344           err_tag = out_iter->first;
6345
6346           //  Only pass on attributes that match in both inputs.
6347           if (!in_iter->second->matches(*(out_iter->second)))
6348             {
6349               // No match.  Delete the attribute.
6350               int saved_tag = out_iter->first;
6351               delete out_iter->second;
6352               out_other_attributes->erase(out_iter);
6353               out_iter = out_other_attributes->upper_bound(saved_tag);
6354             }
6355           else
6356             {
6357               // Matched.  Keep the attribute and move to the next.
6358               ++out_iter;
6359               ++in_iter;
6360             }
6361         }
6362
6363       if (err_object)
6364         {
6365           // Attribute numbers >=64 (mod 128) can be safely ignored.  */
6366           if ((err_tag & 127) < 64)
6367             {
6368               gold_error(_("%s: unknown mandatory EABI object attribute %d"),
6369                          err_object, err_tag);
6370             }
6371           else
6372             {
6373               gold_warning(_("%s: unknown EABI object attribute %d"),
6374                            err_object, err_tag);
6375             }
6376         }
6377     }
6378 }
6379
6380 // Return whether a relocation type used the LSB to distinguish THUMB
6381 // addresses.
6382 template<bool big_endian>
6383 bool
6384 Target_arm<big_endian>::reloc_uses_thumb_bit(unsigned int r_type)
6385 {
6386   switch (r_type)
6387     {
6388     case elfcpp::R_ARM_PC24:
6389     case elfcpp::R_ARM_ABS32:
6390     case elfcpp::R_ARM_REL32:
6391     case elfcpp::R_ARM_SBREL32:
6392     case elfcpp::R_ARM_THM_CALL:
6393     case elfcpp::R_ARM_GLOB_DAT:
6394     case elfcpp::R_ARM_JUMP_SLOT:
6395     case elfcpp::R_ARM_GOTOFF32:
6396     case elfcpp::R_ARM_PLT32:
6397     case elfcpp::R_ARM_CALL:
6398     case elfcpp::R_ARM_JUMP24:
6399     case elfcpp::R_ARM_THM_JUMP24:
6400     case elfcpp::R_ARM_SBREL31:
6401     case elfcpp::R_ARM_PREL31:
6402     case elfcpp::R_ARM_MOVW_ABS_NC:
6403     case elfcpp::R_ARM_MOVW_PREL_NC:
6404     case elfcpp::R_ARM_THM_MOVW_ABS_NC:
6405     case elfcpp::R_ARM_THM_MOVW_PREL_NC:
6406     case elfcpp::R_ARM_THM_JUMP19:
6407     case elfcpp::R_ARM_THM_ALU_PREL_11_0:
6408     case elfcpp::R_ARM_ALU_PC_G0_NC:
6409     case elfcpp::R_ARM_ALU_PC_G0:
6410     case elfcpp::R_ARM_ALU_PC_G1_NC:
6411     case elfcpp::R_ARM_ALU_PC_G1:
6412     case elfcpp::R_ARM_ALU_PC_G2:
6413     case elfcpp::R_ARM_ALU_SB_G0_NC:
6414     case elfcpp::R_ARM_ALU_SB_G0:
6415     case elfcpp::R_ARM_ALU_SB_G1_NC:
6416     case elfcpp::R_ARM_ALU_SB_G1:
6417     case elfcpp::R_ARM_ALU_SB_G2:
6418     case elfcpp::R_ARM_MOVW_BREL_NC:
6419     case elfcpp::R_ARM_MOVW_BREL:
6420     case elfcpp::R_ARM_THM_MOVW_BREL_NC:
6421     case elfcpp::R_ARM_THM_MOVW_BREL:
6422       return true;
6423     default:
6424       return false;
6425     }
6426 }
6427
6428 // Stub-generation methods for Target_arm.
6429
6430 // Make a new Arm_input_section object.
6431
6432 template<bool big_endian>
6433 Arm_input_section<big_endian>*
6434 Target_arm<big_endian>::new_arm_input_section(
6435     Relobj* relobj,
6436     unsigned int shndx)
6437 {
6438   Input_section_specifier iss(relobj, shndx);
6439
6440   Arm_input_section<big_endian>* arm_input_section =
6441     new Arm_input_section<big_endian>(relobj, shndx);
6442   arm_input_section->init();
6443
6444   // Register new Arm_input_section in map for look-up.
6445   std::pair<typename Arm_input_section_map::iterator, bool> ins =
6446     this->arm_input_section_map_.insert(std::make_pair(iss, arm_input_section));
6447
6448   // Make sure that it we have not created another Arm_input_section
6449   // for this input section already.
6450   gold_assert(ins.second);
6451
6452   return arm_input_section; 
6453 }
6454
6455 // Find the Arm_input_section object corresponding to the SHNDX-th input
6456 // section of RELOBJ.
6457
6458 template<bool big_endian>
6459 Arm_input_section<big_endian>*
6460 Target_arm<big_endian>::find_arm_input_section(
6461     Relobj* relobj,
6462     unsigned int shndx) const
6463 {
6464   Input_section_specifier iss(relobj, shndx);
6465   typename Arm_input_section_map::const_iterator p =
6466     this->arm_input_section_map_.find(iss);
6467   return (p != this->arm_input_section_map_.end()) ? p->second : NULL;
6468 }
6469
6470 // Make a new stub table.
6471
6472 template<bool big_endian>
6473 Stub_table<big_endian>*
6474 Target_arm<big_endian>::new_stub_table(Arm_input_section<big_endian>* owner)
6475 {
6476   Stub_table<big_endian>* stub_table =
6477     new Stub_table<big_endian>(owner);
6478   this->stub_tables_.push_back(stub_table);
6479
6480   stub_table->set_address(owner->address() + owner->data_size());
6481   stub_table->set_file_offset(owner->offset() + owner->data_size());
6482   stub_table->finalize_data_size();
6483
6484   return stub_table;
6485 }
6486
6487 // Scan a relocation for stub generation.
6488
6489 template<bool big_endian>
6490 void
6491 Target_arm<big_endian>::scan_reloc_for_stub(
6492     const Relocate_info<32, big_endian>* relinfo,
6493     unsigned int r_type,
6494     const Sized_symbol<32>* gsym,
6495     unsigned int r_sym,
6496     const Symbol_value<32>* psymval,
6497     elfcpp::Elf_types<32>::Elf_Swxword addend,
6498     Arm_address address)
6499 {
6500   typedef typename Target_arm<big_endian>::Relocate Relocate;
6501
6502   const Arm_relobj<big_endian>* arm_relobj =
6503     Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
6504
6505   bool target_is_thumb;
6506   Symbol_value<32> symval;
6507   if (gsym != NULL)
6508     {
6509       // This is a global symbol.  Determine if we use PLT and if the
6510       // final target is THUMB.
6511       if (gsym->use_plt_offset(Relocate::reloc_is_non_pic(r_type)))
6512         {
6513           // This uses a PLT, change the symbol value.
6514           symval.set_output_value(this->plt_section()->address()
6515                                   + gsym->plt_offset());
6516           psymval = &symval;
6517           target_is_thumb = false;
6518         }
6519       else if (gsym->is_undefined())
6520         // There is no need to generate a stub symbol is undefined.
6521         return;
6522       else
6523         {
6524           target_is_thumb =
6525             ((gsym->type() == elfcpp::STT_ARM_TFUNC)
6526              || (gsym->type() == elfcpp::STT_FUNC
6527                  && !gsym->is_undefined()
6528                  && ((psymval->value(arm_relobj, 0) & 1) != 0)));
6529         }
6530     }
6531   else
6532     {
6533       // This is a local symbol.  Determine if the final target is THUMB.
6534       target_is_thumb = arm_relobj->local_symbol_is_thumb_function(r_sym);
6535     }
6536
6537   // Strip LSB if this points to a THUMB target.
6538   if (target_is_thumb
6539       && Target_arm<big_endian>::reloc_uses_thumb_bit(r_type)
6540       && ((psymval->value(arm_relobj, 0) & 1) != 0))
6541     {
6542       Arm_address stripped_value =
6543         psymval->value(arm_relobj, 0) & ~static_cast<Arm_address>(1);
6544       symval.set_output_value(stripped_value);
6545       psymval = &symval;
6546     } 
6547
6548   // Get the symbol value.
6549   Symbol_value<32>::Value value = psymval->value(arm_relobj, 0);
6550
6551   // Owing to pipelining, the PC relative branches below actually skip
6552   // two instructions when the branch offset is 0.
6553   Arm_address destination;
6554   switch (r_type)
6555     {
6556     case elfcpp::R_ARM_CALL:
6557     case elfcpp::R_ARM_JUMP24:
6558     case elfcpp::R_ARM_PLT32:
6559       // ARM branches.
6560       destination = value + addend + 8;
6561       break;
6562     case elfcpp::R_ARM_THM_CALL:
6563     case elfcpp::R_ARM_THM_XPC22:
6564     case elfcpp::R_ARM_THM_JUMP24:
6565     case elfcpp::R_ARM_THM_JUMP19:
6566       // THUMB branches.
6567       destination = value + addend + 4;
6568       break;
6569     default:
6570       gold_unreachable();
6571     }
6572
6573   Stub_type stub_type =
6574     Reloc_stub::stub_type_for_reloc(r_type, address, destination,
6575                                     target_is_thumb);
6576
6577   // This reloc does not need a stub.
6578   if (stub_type == arm_stub_none)
6579     return;
6580
6581   // Try looking up an existing stub from a stub table.
6582   Stub_table<big_endian>* stub_table = 
6583     arm_relobj->stub_table(relinfo->data_shndx);
6584   gold_assert(stub_table != NULL);
6585    
6586   // Locate stub by destination.
6587   Reloc_stub::Key stub_key(stub_type, gsym, arm_relobj, r_sym, addend);
6588
6589   // Create a stub if there is not one already
6590   Reloc_stub* stub = stub_table->find_reloc_stub(stub_key);
6591   if (stub == NULL)
6592     {
6593       // create a new stub and add it to stub table.
6594       stub = this->stub_factory().make_reloc_stub(stub_type);
6595       stub_table->add_reloc_stub(stub, stub_key);
6596     }
6597
6598   // Record the destination address.
6599   stub->set_destination_address(destination
6600                                 | (target_is_thumb ? 1 : 0));
6601 }
6602
6603 // This function scans a relocation sections for stub generation.
6604 // The template parameter Relocate must be a class type which provides
6605 // a single function, relocate(), which implements the machine
6606 // specific part of a relocation.
6607
6608 // BIG_ENDIAN is the endianness of the data.  SH_TYPE is the section type:
6609 // SHT_REL or SHT_RELA.
6610
6611 // PRELOCS points to the relocation data.  RELOC_COUNT is the number
6612 // of relocs.  OUTPUT_SECTION is the output section.
6613 // NEEDS_SPECIAL_OFFSET_HANDLING is true if input offsets need to be
6614 // mapped to output offsets.
6615
6616 // VIEW is the section data, VIEW_ADDRESS is its memory address, and
6617 // VIEW_SIZE is the size.  These refer to the input section, unless
6618 // NEEDS_SPECIAL_OFFSET_HANDLING is true, in which case they refer to
6619 // the output section.
6620
6621 template<bool big_endian>
6622 template<int sh_type>
6623 void inline
6624 Target_arm<big_endian>::scan_reloc_section_for_stubs(
6625     const Relocate_info<32, big_endian>* relinfo,
6626     const unsigned char* prelocs,
6627     size_t reloc_count,
6628     Output_section* output_section,
6629     bool needs_special_offset_handling,
6630     const unsigned char* view,
6631     elfcpp::Elf_types<32>::Elf_Addr view_address,
6632     section_size_type)
6633 {
6634   typedef typename Reloc_types<sh_type, 32, big_endian>::Reloc Reltype;
6635   const int reloc_size =
6636     Reloc_types<sh_type, 32, big_endian>::reloc_size;
6637
6638   Arm_relobj<big_endian>* arm_object =
6639     Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
6640   unsigned int local_count = arm_object->local_symbol_count();
6641
6642   Comdat_behavior comdat_behavior = CB_UNDETERMINED;
6643
6644   for (size_t i = 0; i < reloc_count; ++i, prelocs += reloc_size)
6645     {
6646       Reltype reloc(prelocs);
6647
6648       typename elfcpp::Elf_types<32>::Elf_WXword r_info = reloc.get_r_info();
6649       unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
6650       unsigned int r_type = elfcpp::elf_r_type<32>(r_info);
6651
6652       r_type = this->get_real_reloc_type(r_type);
6653
6654       // Only a few relocation types need stubs.
6655       if ((r_type != elfcpp::R_ARM_CALL)
6656          && (r_type != elfcpp::R_ARM_JUMP24)
6657          && (r_type != elfcpp::R_ARM_PLT32)
6658          && (r_type != elfcpp::R_ARM_THM_CALL)
6659          && (r_type != elfcpp::R_ARM_THM_XPC22)
6660          && (r_type != elfcpp::R_ARM_THM_JUMP24)
6661          && (r_type != elfcpp::R_ARM_THM_JUMP19))
6662         continue;
6663
6664       section_offset_type offset =
6665         convert_to_section_size_type(reloc.get_r_offset());
6666
6667       if (needs_special_offset_handling)
6668         {
6669           offset = output_section->output_offset(relinfo->object,
6670                                                  relinfo->data_shndx,
6671                                                  offset);
6672           if (offset == -1)
6673             continue;
6674         }
6675
6676       // Get the addend.
6677       Stub_addend_reader<sh_type, big_endian> stub_addend_reader;
6678       elfcpp::Elf_types<32>::Elf_Swxword addend =
6679         stub_addend_reader(r_type, view + offset, reloc);
6680
6681       const Sized_symbol<32>* sym;
6682
6683       Symbol_value<32> symval;
6684       const Symbol_value<32> *psymval;
6685       if (r_sym < local_count)
6686         {
6687           sym = NULL;
6688           psymval = arm_object->local_symbol(r_sym);
6689
6690           // If the local symbol belongs to a section we are discarding,
6691           // and that section is a debug section, try to find the
6692           // corresponding kept section and map this symbol to its
6693           // counterpart in the kept section.  The symbol must not 
6694           // correspond to a section we are folding.
6695           bool is_ordinary;
6696           unsigned int shndx = psymval->input_shndx(&is_ordinary);
6697           if (is_ordinary
6698               && shndx != elfcpp::SHN_UNDEF
6699               && !arm_object->is_section_included(shndx) 
6700               && !(relinfo->symtab->is_section_folded(arm_object, shndx)))
6701             {
6702               if (comdat_behavior == CB_UNDETERMINED)
6703                 {
6704                   std::string name =
6705                     arm_object->section_name(relinfo->data_shndx);
6706                   comdat_behavior = get_comdat_behavior(name.c_str());
6707                 }
6708               if (comdat_behavior == CB_PRETEND)
6709                 {
6710                   bool found;
6711                   typename elfcpp::Elf_types<32>::Elf_Addr value =
6712                     arm_object->map_to_kept_section(shndx, &found);
6713                   if (found)
6714                     symval.set_output_value(value + psymval->input_value());
6715                   else
6716                     symval.set_output_value(0);
6717                 }
6718               else
6719                 {
6720                   symval.set_output_value(0);
6721                 }
6722               symval.set_no_output_symtab_entry();
6723               psymval = &symval;
6724             }
6725         }
6726       else
6727         {
6728           const Symbol* gsym = arm_object->global_symbol(r_sym);
6729           gold_assert(gsym != NULL);
6730           if (gsym->is_forwarder())
6731             gsym = relinfo->symtab->resolve_forwards(gsym);
6732
6733           sym = static_cast<const Sized_symbol<32>*>(gsym);
6734           if (sym->has_symtab_index())
6735             symval.set_output_symtab_index(sym->symtab_index());
6736           else
6737             symval.set_no_output_symtab_entry();
6738
6739           // We need to compute the would-be final value of this global
6740           // symbol.
6741           const Symbol_table* symtab = relinfo->symtab;
6742           const Sized_symbol<32>* sized_symbol =
6743             symtab->get_sized_symbol<32>(gsym);
6744           Symbol_table::Compute_final_value_status status;
6745           Arm_address value =
6746             symtab->compute_final_value<32>(sized_symbol, &status);
6747
6748           // Skip this if the symbol has not output section.
6749           if (status == Symbol_table::CFVS_NO_OUTPUT_SECTION)
6750             continue;
6751
6752           symval.set_output_value(value);
6753           psymval = &symval;
6754         }
6755
6756       // If symbol is a section symbol, we don't know the actual type of
6757       // destination.  Give up.
6758       if (psymval->is_section_symbol())
6759         continue;
6760
6761       this->scan_reloc_for_stub(relinfo, r_type, sym, r_sym, psymval,
6762                                 addend, view_address + offset);
6763     }
6764 }
6765
6766 // Scan an input section for stub generation.
6767
6768 template<bool big_endian>
6769 void
6770 Target_arm<big_endian>::scan_section_for_stubs(
6771     const Relocate_info<32, big_endian>* relinfo,
6772     unsigned int sh_type,
6773     const unsigned char* prelocs,
6774     size_t reloc_count,
6775     Output_section* output_section,
6776     bool needs_special_offset_handling,
6777     const unsigned char* view,
6778     Arm_address view_address,
6779     section_size_type view_size)
6780 {
6781   if (sh_type == elfcpp::SHT_REL)
6782     this->scan_reloc_section_for_stubs<elfcpp::SHT_REL>(
6783         relinfo,
6784         prelocs,
6785         reloc_count,
6786         output_section,
6787         needs_special_offset_handling,
6788         view,
6789         view_address,
6790         view_size);
6791   else if (sh_type == elfcpp::SHT_RELA)
6792     // We do not support RELA type relocations yet.  This is provided for
6793     // completeness.
6794     this->scan_reloc_section_for_stubs<elfcpp::SHT_RELA>(
6795         relinfo,
6796         prelocs,
6797         reloc_count,
6798         output_section,
6799         needs_special_offset_handling,
6800         view,
6801         view_address,
6802         view_size);
6803   else
6804     gold_unreachable();
6805 }
6806
6807 // Group input sections for stub generation.
6808 //
6809 // We goup input sections in an output sections so that the total size,
6810 // including any padding space due to alignment is smaller than GROUP_SIZE
6811 // unless the only input section in group is bigger than GROUP_SIZE already.
6812 // Then an ARM stub table is created to follow the last input section
6813 // in group.  For each group an ARM stub table is created an is placed
6814 // after the last group.  If STUB_ALWATS_AFTER_BRANCH is false, we further
6815 // extend the group after the stub table.
6816
6817 template<bool big_endian>
6818 void
6819 Target_arm<big_endian>::group_sections(
6820     Layout* layout,
6821     section_size_type group_size,
6822     bool stubs_always_after_branch)
6823 {
6824   // Group input sections and insert stub table
6825   Layout::Section_list section_list;
6826   layout->get_allocated_sections(&section_list);
6827   for (Layout::Section_list::const_iterator p = section_list.begin();
6828        p != section_list.end();
6829        ++p)
6830     {
6831       Arm_output_section<big_endian>* output_section =
6832         Arm_output_section<big_endian>::as_arm_output_section(*p);
6833       output_section->group_sections(group_size, stubs_always_after_branch,
6834                                      this);
6835     }
6836 }
6837
6838 // Relaxation hook.  This is where we do stub generation.
6839
6840 template<bool big_endian>
6841 bool
6842 Target_arm<big_endian>::do_relax(
6843     int pass,
6844     const Input_objects* input_objects,
6845     Symbol_table* symtab,
6846     Layout* layout)
6847 {
6848   // No need to generate stubs if this is a relocatable link.
6849   gold_assert(!parameters->options().relocatable());
6850
6851   // If this is the first pass, we need to group input sections into
6852   // stub groups.
6853   if (pass == 1)
6854     {
6855       // Determine the stub group size.  The group size is the absolute
6856       // value of the parameter --stub-group-size.  If --stub-group-size
6857       // is passed a negative value, we restict stubs to be always after
6858       // the stubbed branches.
6859       int32_t stub_group_size_param =
6860         parameters->options().stub_group_size();
6861       bool stubs_always_after_branch = stub_group_size_param < 0;
6862       section_size_type stub_group_size = abs(stub_group_size_param);
6863
6864       if (stub_group_size == 1)
6865         {
6866           // Default value.
6867           // Thumb branch range is +-4MB has to be used as the default
6868           // maximum size (a given section can contain both ARM and Thumb
6869           // code, so the worst case has to be taken into account).
6870           //
6871           // This value is 24K less than that, which allows for 2025
6872           // 12-byte stubs.  If we exceed that, then we will fail to link.
6873           // The user will have to relink with an explicit group size
6874           // option.
6875           stub_group_size = 4170000;
6876         }
6877
6878       group_sections(layout, stub_group_size, stubs_always_after_branch);
6879     }
6880
6881   // clear changed flags for all stub_tables
6882   typedef typename Stub_table_list::iterator Stub_table_iterator;
6883   for (Stub_table_iterator sp = this->stub_tables_.begin();
6884        sp != this->stub_tables_.end();
6885        ++sp)
6886     (*sp)->set_has_been_changed(false);
6887
6888   // scan relocs for stubs
6889   for (Input_objects::Relobj_iterator op = input_objects->relobj_begin();
6890        op != input_objects->relobj_end();
6891        ++op)
6892     {
6893       Arm_relobj<big_endian>* arm_relobj =
6894         Arm_relobj<big_endian>::as_arm_relobj(*op);
6895       arm_relobj->scan_sections_for_stubs(this, symtab, layout);
6896     }
6897
6898   bool any_stub_table_changed = false;
6899   for (Stub_table_iterator sp = this->stub_tables_.begin();
6900        (sp != this->stub_tables_.end()) && !any_stub_table_changed;
6901        ++sp)
6902     {
6903       if ((*sp)->has_been_changed())
6904         any_stub_table_changed = true;
6905     }
6906
6907   return any_stub_table_changed;
6908 }
6909
6910 // Relocate a stub.
6911
6912 template<bool big_endian>
6913 void
6914 Target_arm<big_endian>::relocate_stub(
6915     Reloc_stub* stub,
6916     const Relocate_info<32, big_endian>* relinfo,
6917     Output_section* output_section,
6918     unsigned char* view,
6919     Arm_address address,
6920     section_size_type view_size)
6921 {
6922   Relocate relocate;
6923   const Stub_template* stub_template = stub->stub_template();
6924   for (size_t i = 0; i < stub_template->reloc_count(); i++)
6925     {
6926       size_t reloc_insn_index = stub_template->reloc_insn_index(i);
6927       const Insn_template* insn = &stub_template->insns()[reloc_insn_index];
6928
6929       unsigned int r_type = insn->r_type();
6930       section_size_type reloc_offset = stub_template->reloc_offset(i);
6931       section_size_type reloc_size = insn->size();
6932       gold_assert(reloc_offset + reloc_size <= view_size);
6933
6934       // This is the address of the stub destination.
6935       Arm_address target = stub->reloc_target(i);
6936       Symbol_value<32> symval;
6937       symval.set_output_value(target);
6938
6939       // Synthesize a fake reloc just in case.  We don't have a symbol so
6940       // we use 0.
6941       unsigned char reloc_buffer[elfcpp::Elf_sizes<32>::rel_size];
6942       memset(reloc_buffer, 0, sizeof(reloc_buffer));
6943       elfcpp::Rel_write<32, big_endian> reloc_write(reloc_buffer);
6944       reloc_write.put_r_offset(reloc_offset);
6945       reloc_write.put_r_info(elfcpp::elf_r_info<32>(0, r_type));
6946       elfcpp::Rel<32, big_endian> rel(reloc_buffer);
6947
6948       relocate.relocate(relinfo, this, output_section,
6949                         this->fake_relnum_for_stubs, rel, r_type,
6950                         NULL, &symval, view + reloc_offset,
6951                         address + reloc_offset, reloc_size);
6952     }
6953 }
6954
6955 // Determine whether an object attribute tag takes an integer, a
6956 // string or both.
6957
6958 template<bool big_endian>
6959 int
6960 Target_arm<big_endian>::do_attribute_arg_type(int tag) const
6961 {
6962   if (tag == Object_attribute::Tag_compatibility)
6963     return (Object_attribute::ATTR_TYPE_FLAG_INT_VAL
6964             | Object_attribute::ATTR_TYPE_FLAG_STR_VAL);
6965   else if (tag == elfcpp::Tag_nodefaults)
6966     return (Object_attribute::ATTR_TYPE_FLAG_INT_VAL
6967             | Object_attribute::ATTR_TYPE_FLAG_NO_DEFAULT);
6968   else if (tag == elfcpp::Tag_CPU_raw_name || tag == elfcpp::Tag_CPU_name)
6969     return Object_attribute::ATTR_TYPE_FLAG_STR_VAL;
6970   else if (tag < 32)
6971     return Object_attribute::ATTR_TYPE_FLAG_INT_VAL;
6972   else
6973     return ((tag & 1) != 0
6974             ? Object_attribute::ATTR_TYPE_FLAG_STR_VAL
6975             : Object_attribute::ATTR_TYPE_FLAG_INT_VAL);
6976 }
6977
6978 // Reorder attributes.
6979 //
6980 // The ABI defines that Tag_conformance should be emitted first, and that
6981 // Tag_nodefaults should be second (if either is defined).  This sets those
6982 // two positions, and bumps up the position of all the remaining tags to
6983 // compensate.
6984
6985 template<bool big_endian>
6986 int
6987 Target_arm<big_endian>::do_attributes_order(int num) const
6988 {
6989   // Reorder the known object attributes in output.  We want to move
6990   // Tag_conformance to position 4 and Tag_conformance to position 5
6991   // and shift eveything between 4 .. Tag_conformance - 1 to make room.
6992   if (num == 4)
6993     return elfcpp::Tag_conformance;
6994   if (num == 5)
6995     return elfcpp::Tag_nodefaults;
6996   if ((num - 2) < elfcpp::Tag_nodefaults)
6997     return num - 2;
6998   if ((num - 1) < elfcpp::Tag_conformance)
6999     return num - 1;
7000   return num;
7001 }
7002
7003 template<bool big_endian>
7004 class Target_selector_arm : public Target_selector
7005 {
7006  public:
7007   Target_selector_arm()
7008     : Target_selector(elfcpp::EM_ARM, 32, big_endian,
7009                       (big_endian ? "elf32-bigarm" : "elf32-littlearm"))
7010   { }
7011
7012   Target*
7013   do_instantiate_target()
7014   { return new Target_arm<big_endian>(); }
7015 };
7016
7017 Target_selector_arm<false> target_selector_arm;
7018 Target_selector_arm<true> target_selector_armbe;
7019
7020 } // End anonymous namespace.