PR breakpoint/12803
[deliverable/binutils-gdb.git] / gold / arm.cc
CommitLineData
4a657b0d
DK
1// arm.cc -- arm target support for gold.
2
b10d2873 3// Copyright 2009, 2010 Free Software Foundation, Inc.
4a657b0d
DK
4// Written by Doug Kwan <dougkwan@google.com> based on the i386 code
5// by Ian Lance Taylor <iant@google.com>.
b569affa
DK
6// This file also contains borrowed and adapted code from
7// bfd/elf32-arm.c.
4a657b0d
DK
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>
56ee5e00 32#include <algorithm>
41263c05
DK
33#include <map>
34#include <utility>
2b328d4e 35#include <set>
4a657b0d
DK
36
37#include "elfcpp.h"
38#include "parameters.h"
39#include "reloc.h"
40#include "arm.h"
41#include "object.h"
42#include "symtab.h"
43#include "layout.h"
44#include "output.h"
45#include "copy-relocs.h"
46#include "target.h"
47#include "target-reloc.h"
48#include "target-select.h"
49#include "tls.h"
50#include "defstd.h"
f345227a 51#include "gc.h"
a0351a69 52#include "attributes.h"
0d31c79d 53#include "arm-reloc-property.h"
4a657b0d
DK
54
55namespace
56{
57
58using namespace gold;
59
94cdfcff
DK
60template<bool big_endian>
61class Output_data_plt_arm;
62
56ee5e00
DK
63template<bool big_endian>
64class Stub_table;
65
66template<bool big_endian>
67class Arm_input_section;
68
af2cdeae
DK
69class Arm_exidx_cantunwind;
70
71class Arm_exidx_merged_section;
72
80d0d023
DK
73class Arm_exidx_fixup;
74
07f508a2
DK
75template<bool big_endian>
76class Arm_output_section;
77
993d07c1
DK
78class Arm_exidx_input_section;
79
07f508a2
DK
80template<bool big_endian>
81class Arm_relobj;
82
f96accdf
DK
83template<bool big_endian>
84class Arm_relocate_functions;
85
4a54abbb
DK
86template<bool big_endian>
87class Arm_output_data_got;
88
b569affa
DK
89template<bool big_endian>
90class Target_arm;
91
92// For convenience.
93typedef elfcpp::Elf_types<32>::Elf_Addr Arm_address;
94
95// Maximum branch offsets for ARM, THUMB and THUMB2.
96const int32_t ARM_MAX_FWD_BRANCH_OFFSET = ((((1 << 23) - 1) << 2) + 8);
97const int32_t ARM_MAX_BWD_BRANCH_OFFSET = ((-((1 << 23) << 2)) + 8);
98const int32_t THM_MAX_FWD_BRANCH_OFFSET = ((1 << 22) -2 + 4);
99const int32_t THM_MAX_BWD_BRANCH_OFFSET = (-(1 << 22) + 4);
100const int32_t THM2_MAX_FWD_BRANCH_OFFSET = (((1 << 24) - 2) + 4);
101const int32_t THM2_MAX_BWD_BRANCH_OFFSET = (-(1 << 24) + 4);
102
4a54abbb
DK
103// Thread Control Block size.
104const size_t ARM_TCB_SIZE = 8;
105
4a657b0d
DK
106// The arm target class.
107//
108// This is a very simple port of gold for ARM-EABI. It is intended for
b10d2873 109// supporting Android only for the time being.
4a657b0d 110//
4a657b0d 111// TODOs:
0d31c79d 112// - Implement all static relocation types documented in arm-reloc.def.
94cdfcff
DK
113// - Make PLTs more flexible for different architecture features like
114// Thumb-2 and BE8.
11af873f 115// There are probably a lot more.
4a657b0d 116
0d31c79d
DK
117// Ideally we would like to avoid using global variables but this is used
118// very in many places and sometimes in loops. If we use a function
9b547ce6 119// returning a static instance of Arm_reloc_property_table, it will be very
0d31c79d
DK
120// slow in an threaded environment since the static instance needs to be
121// locked. The pointer is below initialized in the
122// Target::do_select_as_default_target() hook so that we do not spend time
123// building the table if we are not linking ARM objects.
124//
125// An alternative is to to process the information in arm-reloc.def in
126// compilation time and generate a representation of it in PODs only. That
127// way we can avoid initialization when the linker starts.
128
ca09d69a 129Arm_reloc_property_table* arm_reloc_property_table = NULL;
0d31c79d 130
b569affa
DK
131// Instruction template class. This class is similar to the insn_sequence
132// struct in bfd/elf32-arm.c.
133
134class Insn_template
135{
136 public:
137 // Types of instruction templates.
138 enum Type
139 {
140 THUMB16_TYPE = 1,
bb0d3eb0
DK
141 // THUMB16_SPECIAL_TYPE is used by sub-classes of Stub for instruction
142 // templates with class-specific semantics. Currently this is used
143 // only by the Cortex_a8_stub class for handling condition codes in
144 // conditional branches.
145 THUMB16_SPECIAL_TYPE,
b569affa
DK
146 THUMB32_TYPE,
147 ARM_TYPE,
148 DATA_TYPE
149 };
150
bb0d3eb0 151 // Factory methods to create instruction templates in different formats.
b569affa
DK
152
153 static const Insn_template
154 thumb16_insn(uint32_t data)
155 { return Insn_template(data, THUMB16_TYPE, elfcpp::R_ARM_NONE, 0); }
156
bb0d3eb0
DK
157 // A Thumb conditional branch, in which the proper condition is inserted
158 // when we build the stub.
b569affa
DK
159 static const Insn_template
160 thumb16_bcond_insn(uint32_t data)
bb0d3eb0 161 { return Insn_template(data, THUMB16_SPECIAL_TYPE, elfcpp::R_ARM_NONE, 1); }
b569affa
DK
162
163 static const Insn_template
164 thumb32_insn(uint32_t data)
165 { return Insn_template(data, THUMB32_TYPE, elfcpp::R_ARM_NONE, 0); }
166
167 static const Insn_template
168 thumb32_b_insn(uint32_t data, int reloc_addend)
169 {
170 return Insn_template(data, THUMB32_TYPE, elfcpp::R_ARM_THM_JUMP24,
171 reloc_addend);
172 }
173
174 static const Insn_template
175 arm_insn(uint32_t data)
176 { return Insn_template(data, ARM_TYPE, elfcpp::R_ARM_NONE, 0); }
177
178 static const Insn_template
179 arm_rel_insn(unsigned data, int reloc_addend)
180 { return Insn_template(data, ARM_TYPE, elfcpp::R_ARM_JUMP24, reloc_addend); }
181
182 static const Insn_template
183 data_word(unsigned data, unsigned int r_type, int reloc_addend)
184 { return Insn_template(data, DATA_TYPE, r_type, reloc_addend); }
185
186 // Accessors. This class is used for read-only objects so no modifiers
187 // are provided.
188
189 uint32_t
190 data() const
191 { return this->data_; }
192
193 // Return the instruction sequence type of this.
194 Type
195 type() const
196 { return this->type_; }
197
198 // Return the ARM relocation type of this.
199 unsigned int
200 r_type() const
201 { return this->r_type_; }
202
203 int32_t
204 reloc_addend() const
205 { return this->reloc_addend_; }
206
bb0d3eb0 207 // Return size of instruction template in bytes.
b569affa
DK
208 size_t
209 size() const;
210
bb0d3eb0 211 // Return byte-alignment of instruction template.
b569affa
DK
212 unsigned
213 alignment() const;
214
215 private:
216 // We make the constructor private to ensure that only the factory
217 // methods are used.
218 inline
2ea97941
ILT
219 Insn_template(unsigned data, Type type, unsigned int r_type, int reloc_addend)
220 : data_(data), type_(type), r_type_(r_type), reloc_addend_(reloc_addend)
b569affa
DK
221 { }
222
223 // Instruction specific data. This is used to store information like
224 // some of the instruction bits.
225 uint32_t data_;
226 // Instruction template type.
227 Type type_;
228 // Relocation type if there is a relocation or R_ARM_NONE otherwise.
229 unsigned int r_type_;
230 // Relocation addend.
231 int32_t reloc_addend_;
232};
233
234// Macro for generating code to stub types. One entry per long/short
235// branch stub
236
237#define DEF_STUBS \
238 DEF_STUB(long_branch_any_any) \
239 DEF_STUB(long_branch_v4t_arm_thumb) \
240 DEF_STUB(long_branch_thumb_only) \
241 DEF_STUB(long_branch_v4t_thumb_thumb) \
242 DEF_STUB(long_branch_v4t_thumb_arm) \
243 DEF_STUB(short_branch_v4t_thumb_arm) \
244 DEF_STUB(long_branch_any_arm_pic) \
245 DEF_STUB(long_branch_any_thumb_pic) \
246 DEF_STUB(long_branch_v4t_thumb_thumb_pic) \
247 DEF_STUB(long_branch_v4t_arm_thumb_pic) \
248 DEF_STUB(long_branch_v4t_thumb_arm_pic) \
249 DEF_STUB(long_branch_thumb_only_pic) \
250 DEF_STUB(a8_veneer_b_cond) \
251 DEF_STUB(a8_veneer_b) \
252 DEF_STUB(a8_veneer_bl) \
a2162063
ILT
253 DEF_STUB(a8_veneer_blx) \
254 DEF_STUB(v4_veneer_bx)
b569affa
DK
255
256// Stub types.
257
258#define DEF_STUB(x) arm_stub_##x,
259typedef enum
260 {
261 arm_stub_none,
262 DEF_STUBS
263
264 // First reloc stub type.
265 arm_stub_reloc_first = arm_stub_long_branch_any_any,
266 // Last reloc stub type.
267 arm_stub_reloc_last = arm_stub_long_branch_thumb_only_pic,
268
269 // First Cortex-A8 stub type.
270 arm_stub_cortex_a8_first = arm_stub_a8_veneer_b_cond,
271 // Last Cortex-A8 stub type.
272 arm_stub_cortex_a8_last = arm_stub_a8_veneer_blx,
273
274 // Last stub type.
a2162063 275 arm_stub_type_last = arm_stub_v4_veneer_bx
b569affa
DK
276 } Stub_type;
277#undef DEF_STUB
278
279// Stub template class. Templates are meant to be read-only objects.
280// A stub template for a stub type contains all read-only attributes
281// common to all stubs of the same type.
282
283class Stub_template
284{
285 public:
286 Stub_template(Stub_type, const Insn_template*, size_t);
287
288 ~Stub_template()
289 { }
290
291 // Return stub type.
292 Stub_type
293 type() const
294 { return this->type_; }
295
296 // Return an array of instruction templates.
297 const Insn_template*
298 insns() const
299 { return this->insns_; }
300
301 // Return size of template in number of instructions.
302 size_t
303 insn_count() const
304 { return this->insn_count_; }
305
306 // Return size of template in bytes.
307 size_t
308 size() const
309 { return this->size_; }
310
311 // Return alignment of the stub template.
312 unsigned
313 alignment() const
314 { return this->alignment_; }
315
316 // Return whether entry point is in thumb mode.
317 bool
318 entry_in_thumb_mode() const
319 { return this->entry_in_thumb_mode_; }
320
321 // Return number of relocations in this template.
322 size_t
323 reloc_count() const
324 { return this->relocs_.size(); }
325
326 // Return index of the I-th instruction with relocation.
327 size_t
328 reloc_insn_index(size_t i) const
329 {
330 gold_assert(i < this->relocs_.size());
331 return this->relocs_[i].first;
332 }
333
334 // Return the offset of the I-th instruction with relocation from the
335 // beginning of the stub.
336 section_size_type
337 reloc_offset(size_t i) const
338 {
339 gold_assert(i < this->relocs_.size());
340 return this->relocs_[i].second;
341 }
342
343 private:
344 // This contains information about an instruction template with a relocation
345 // and its offset from start of stub.
346 typedef std::pair<size_t, section_size_type> Reloc;
347
348 // A Stub_template may not be copied. We want to share templates as much
349 // as possible.
350 Stub_template(const Stub_template&);
351 Stub_template& operator=(const Stub_template&);
352
353 // Stub type.
354 Stub_type type_;
355 // Points to an array of Insn_templates.
356 const Insn_template* insns_;
357 // Number of Insn_templates in insns_[].
358 size_t insn_count_;
359 // Size of templated instructions in bytes.
360 size_t size_;
361 // Alignment of templated instructions.
362 unsigned alignment_;
363 // Flag to indicate if entry is in thumb mode.
364 bool entry_in_thumb_mode_;
365 // A table of reloc instruction indices and offsets. We can find these by
366 // looking at the instruction templates but we pre-compute and then stash
367 // them here for speed.
368 std::vector<Reloc> relocs_;
369};
370
371//
372// A class for code stubs. This is a base class for different type of
373// stubs used in the ARM target.
374//
375
376class Stub
377{
378 private:
379 static const section_offset_type invalid_offset =
380 static_cast<section_offset_type>(-1);
381
382 public:
2ea97941
ILT
383 Stub(const Stub_template* stub_template)
384 : stub_template_(stub_template), offset_(invalid_offset)
b569affa
DK
385 { }
386
387 virtual
388 ~Stub()
389 { }
390
391 // Return the stub template.
392 const Stub_template*
393 stub_template() const
394 { return this->stub_template_; }
395
396 // Return offset of code stub from beginning of its containing stub table.
397 section_offset_type
398 offset() const
399 {
400 gold_assert(this->offset_ != invalid_offset);
401 return this->offset_;
402 }
403
404 // Set offset of code stub from beginning of its containing stub table.
405 void
2ea97941
ILT
406 set_offset(section_offset_type offset)
407 { this->offset_ = offset; }
b569affa
DK
408
409 // Return the relocation target address of the i-th relocation in the
410 // stub. This must be defined in a child class.
411 Arm_address
412 reloc_target(size_t i)
413 { return this->do_reloc_target(i); }
414
415 // Write a stub at output VIEW. BIG_ENDIAN select how a stub is written.
416 void
417 write(unsigned char* view, section_size_type view_size, bool big_endian)
418 { this->do_write(view, view_size, big_endian); }
419
bb0d3eb0
DK
420 // Return the instruction for THUMB16_SPECIAL_TYPE instruction template
421 // for the i-th instruction.
422 uint16_t
423 thumb16_special(size_t i)
424 { return this->do_thumb16_special(i); }
425
b569affa
DK
426 protected:
427 // This must be defined in the child class.
428 virtual Arm_address
429 do_reloc_target(size_t) = 0;
430
bb0d3eb0 431 // This may be overridden in the child class.
b569affa 432 virtual void
bb0d3eb0
DK
433 do_write(unsigned char* view, section_size_type view_size, bool big_endian)
434 {
435 if (big_endian)
436 this->do_fixed_endian_write<true>(view, view_size);
437 else
438 this->do_fixed_endian_write<false>(view, view_size);
439 }
b569affa 440
bb0d3eb0
DK
441 // This must be overridden if a child class uses the THUMB16_SPECIAL_TYPE
442 // instruction template.
443 virtual uint16_t
444 do_thumb16_special(size_t)
445 { gold_unreachable(); }
446
b569affa 447 private:
bb0d3eb0
DK
448 // A template to implement do_write.
449 template<bool big_endian>
450 void inline
451 do_fixed_endian_write(unsigned char*, section_size_type);
452
b569affa
DK
453 // Its template.
454 const Stub_template* stub_template_;
455 // Offset within the section of containing this stub.
456 section_offset_type offset_;
457};
458
459// Reloc stub class. These are stubs we use to fix up relocation because
460// of limited branch ranges.
461
462class Reloc_stub : public Stub
463{
464 public:
465 static const unsigned int invalid_index = static_cast<unsigned int>(-1);
466 // We assume we never jump to this address.
467 static const Arm_address invalid_address = static_cast<Arm_address>(-1);
468
469 // Return destination address.
470 Arm_address
471 destination_address() const
472 {
473 gold_assert(this->destination_address_ != this->invalid_address);
474 return this->destination_address_;
475 }
476
477 // Set destination address.
478 void
479 set_destination_address(Arm_address address)
480 {
481 gold_assert(address != this->invalid_address);
482 this->destination_address_ = address;
483 }
484
485 // Reset destination address.
486 void
487 reset_destination_address()
488 { this->destination_address_ = this->invalid_address; }
489
490 // Determine stub type for a branch of a relocation of R_TYPE going
491 // from BRANCH_ADDRESS to BRANCH_TARGET. If TARGET_IS_THUMB is set,
492 // the branch target is a thumb instruction. TARGET is used for look
493 // up ARM-specific linker settings.
494 static Stub_type
495 stub_type_for_reloc(unsigned int r_type, Arm_address branch_address,
496 Arm_address branch_target, bool target_is_thumb);
497
498 // Reloc_stub key. A key is logically a triplet of a stub type, a symbol
499 // and an addend. Since we treat global and local symbol differently, we
500 // use a Symbol object for a global symbol and a object-index pair for
501 // a local symbol.
502 class Key
503 {
504 public:
505 // If SYMBOL is not null, this is a global symbol, we ignore RELOBJ and
506 // R_SYM. Otherwise, this is a local symbol and RELOBJ must non-NULL
507 // and R_SYM must not be invalid_index.
2ea97941
ILT
508 Key(Stub_type stub_type, const Symbol* symbol, const Relobj* relobj,
509 unsigned int r_sym, int32_t addend)
510 : stub_type_(stub_type), addend_(addend)
b569affa 511 {
2ea97941 512 if (symbol != NULL)
b569affa
DK
513 {
514 this->r_sym_ = Reloc_stub::invalid_index;
2ea97941 515 this->u_.symbol = symbol;
b569affa
DK
516 }
517 else
518 {
2ea97941
ILT
519 gold_assert(relobj != NULL && r_sym != invalid_index);
520 this->r_sym_ = r_sym;
521 this->u_.relobj = relobj;
b569affa
DK
522 }
523 }
524
525 ~Key()
526 { }
527
528 // Accessors: Keys are meant to be read-only object so no modifiers are
529 // provided.
530
531 // Return stub type.
532 Stub_type
533 stub_type() const
534 { return this->stub_type_; }
535
536 // Return the local symbol index or invalid_index.
537 unsigned int
538 r_sym() const
539 { return this->r_sym_; }
540
541 // Return the symbol if there is one.
542 const Symbol*
543 symbol() const
544 { return this->r_sym_ == invalid_index ? this->u_.symbol : NULL; }
545
546 // Return the relobj if there is one.
547 const Relobj*
548 relobj() const
549 { return this->r_sym_ != invalid_index ? this->u_.relobj : NULL; }
550
551 // Whether this equals to another key k.
552 bool
553 eq(const Key& k) const
554 {
555 return ((this->stub_type_ == k.stub_type_)
556 && (this->r_sym_ == k.r_sym_)
557 && ((this->r_sym_ != Reloc_stub::invalid_index)
558 ? (this->u_.relobj == k.u_.relobj)
559 : (this->u_.symbol == k.u_.symbol))
560 && (this->addend_ == k.addend_));
561 }
562
563 // Return a hash value.
564 size_t
565 hash_value() const
566 {
567 return (this->stub_type_
568 ^ this->r_sym_
569 ^ gold::string_hash<char>(
570 (this->r_sym_ != Reloc_stub::invalid_index)
571 ? this->u_.relobj->name().c_str()
572 : this->u_.symbol->name())
573 ^ this->addend_);
574 }
575
576 // Functors for STL associative containers.
577 struct hash
578 {
579 size_t
580 operator()(const Key& k) const
581 { return k.hash_value(); }
582 };
583
584 struct equal_to
585 {
586 bool
587 operator()(const Key& k1, const Key& k2) const
588 { return k1.eq(k2); }
589 };
590
591 // Name of key. This is mainly for debugging.
592 std::string
593 name() const;
594
595 private:
596 // Stub type.
597 Stub_type stub_type_;
598 // If this is a local symbol, this is the index in the defining object.
599 // Otherwise, it is invalid_index for a global symbol.
600 unsigned int r_sym_;
9b547ce6
RW
601 // If r_sym_ is an invalid index, this points to a global symbol.
602 // Otherwise, it points to a relobj. We used the unsized and target
eb44217c 603 // independent Symbol and Relobj classes instead of Sized_symbol<32> and
9b547ce6 604 // Arm_relobj, in order to avoid making the stub class a template
7296d933 605 // as most of the stub machinery is endianness-neutral. However, it
b569affa
DK
606 // may require a bit of casting done by users of this class.
607 union
608 {
609 const Symbol* symbol;
610 const Relobj* relobj;
611 } u_;
612 // Addend associated with a reloc.
613 int32_t addend_;
614 };
615
616 protected:
617 // Reloc_stubs are created via a stub factory. So these are protected.
2ea97941
ILT
618 Reloc_stub(const Stub_template* stub_template)
619 : Stub(stub_template), destination_address_(invalid_address)
b569affa
DK
620 { }
621
622 ~Reloc_stub()
623 { }
624
625 friend class Stub_factory;
626
b569affa
DK
627 // Return the relocation target address of the i-th relocation in the
628 // stub.
629 Arm_address
630 do_reloc_target(size_t i)
631 {
632 // All reloc stub have only one relocation.
633 gold_assert(i == 0);
634 return this->destination_address_;
635 }
636
bb0d3eb0
DK
637 private:
638 // Address of destination.
639 Arm_address destination_address_;
640};
b569affa 641
bb0d3eb0
DK
642// Cortex-A8 stub class. We need a Cortex-A8 stub to redirect any 32-bit
643// THUMB branch that meets the following conditions:
644//
645// 1. The branch straddles across a page boundary. i.e. lower 12-bit of
646// branch address is 0xffe.
647// 2. The branch target address is in the same page as the first word of the
648// branch.
649// 3. The branch follows a 32-bit instruction which is not a branch.
650//
651// To do the fix up, we need to store the address of the branch instruction
652// and its target at least. We also need to store the original branch
653// instruction bits for the condition code in a conditional branch. The
654// condition code is used in a special instruction template. We also want
655// to identify input sections needing Cortex-A8 workaround quickly. We store
656// extra information about object and section index of the code section
657// containing a branch being fixed up. The information is used to mark
658// the code section when we finalize the Cortex-A8 stubs.
659//
b569affa 660
bb0d3eb0
DK
661class Cortex_a8_stub : public Stub
662{
663 public:
664 ~Cortex_a8_stub()
665 { }
666
667 // Return the object of the code section containing the branch being fixed
668 // up.
669 Relobj*
670 relobj() const
671 { return this->relobj_; }
672
673 // Return the section index of the code section containing the branch being
674 // fixed up.
675 unsigned int
676 shndx() const
677 { return this->shndx_; }
678
679 // Return the source address of stub. This is the address of the original
680 // branch instruction. LSB is 1 always set to indicate that it is a THUMB
681 // instruction.
682 Arm_address
683 source_address() const
684 { return this->source_address_; }
685
686 // Return the destination address of the stub. This is the branch taken
687 // address of the original branch instruction. LSB is 1 if it is a THUMB
688 // instruction address.
689 Arm_address
690 destination_address() const
691 { return this->destination_address_; }
692
693 // Return the instruction being fixed up.
694 uint32_t
695 original_insn() const
696 { return this->original_insn_; }
697
698 protected:
699 // Cortex_a8_stubs are created via a stub factory. So these are protected.
700 Cortex_a8_stub(const Stub_template* stub_template, Relobj* relobj,
701 unsigned int shndx, Arm_address source_address,
702 Arm_address destination_address, uint32_t original_insn)
703 : Stub(stub_template), relobj_(relobj), shndx_(shndx),
704 source_address_(source_address | 1U),
705 destination_address_(destination_address),
706 original_insn_(original_insn)
707 { }
708
709 friend class Stub_factory;
710
711 // Return the relocation target address of the i-th relocation in the
712 // stub.
713 Arm_address
714 do_reloc_target(size_t i)
715 {
716 if (this->stub_template()->type() == arm_stub_a8_veneer_b_cond)
717 {
718 // The conditional branch veneer has two relocations.
719 gold_assert(i < 2);
720 return i == 0 ? this->source_address_ + 4 : this->destination_address_;
721 }
722 else
723 {
724 // All other Cortex-A8 stubs have only one relocation.
725 gold_assert(i == 0);
726 return this->destination_address_;
727 }
728 }
729
730 // Return an instruction for the THUMB16_SPECIAL_TYPE instruction template.
731 uint16_t
732 do_thumb16_special(size_t);
733
734 private:
735 // Object of the code section containing the branch being fixed up.
736 Relobj* relobj_;
737 // Section index of the code section containing the branch begin fixed up.
738 unsigned int shndx_;
739 // Source address of original branch.
740 Arm_address source_address_;
741 // Destination address of the original branch.
b569affa 742 Arm_address destination_address_;
bb0d3eb0
DK
743 // Original branch instruction. This is needed for copying the condition
744 // code from a condition branch to its stub.
745 uint32_t original_insn_;
b569affa
DK
746};
747
a2162063
ILT
748// ARMv4 BX Rx branch relocation stub class.
749class Arm_v4bx_stub : public Stub
750{
751 public:
752 ~Arm_v4bx_stub()
753 { }
754
755 // Return the associated register.
756 uint32_t
757 reg() const
758 { return this->reg_; }
759
760 protected:
761 // Arm V4BX stubs are created via a stub factory. So these are protected.
762 Arm_v4bx_stub(const Stub_template* stub_template, const uint32_t reg)
763 : Stub(stub_template), reg_(reg)
764 { }
765
766 friend class Stub_factory;
767
768 // Return the relocation target address of the i-th relocation in the
769 // stub.
770 Arm_address
771 do_reloc_target(size_t)
772 { gold_unreachable(); }
773
774 // This may be overridden in the child class.
775 virtual void
776 do_write(unsigned char* view, section_size_type view_size, bool big_endian)
777 {
778 if (big_endian)
779 this->do_fixed_endian_v4bx_write<true>(view, view_size);
780 else
781 this->do_fixed_endian_v4bx_write<false>(view, view_size);
782 }
783
784 private:
785 // A template to implement do_write.
786 template<bool big_endian>
787 void inline
788 do_fixed_endian_v4bx_write(unsigned char* view, section_size_type)
789 {
790 const Insn_template* insns = this->stub_template()->insns();
791 elfcpp::Swap<32, big_endian>::writeval(view,
792 (insns[0].data()
793 + (this->reg_ << 16)));
794 view += insns[0].size();
795 elfcpp::Swap<32, big_endian>::writeval(view,
796 (insns[1].data() + this->reg_));
797 view += insns[1].size();
798 elfcpp::Swap<32, big_endian>::writeval(view,
799 (insns[2].data() + this->reg_));
800 }
801
802 // A register index (r0-r14), which is associated with the stub.
803 uint32_t reg_;
804};
805
b569affa
DK
806// Stub factory class.
807
808class Stub_factory
809{
810 public:
811 // Return the unique instance of this class.
812 static const Stub_factory&
813 get_instance()
814 {
815 static Stub_factory singleton;
816 return singleton;
817 }
818
819 // Make a relocation stub.
820 Reloc_stub*
821 make_reloc_stub(Stub_type stub_type) const
822 {
823 gold_assert(stub_type >= arm_stub_reloc_first
824 && stub_type <= arm_stub_reloc_last);
825 return new Reloc_stub(this->stub_templates_[stub_type]);
826 }
827
bb0d3eb0
DK
828 // Make a Cortex-A8 stub.
829 Cortex_a8_stub*
830 make_cortex_a8_stub(Stub_type stub_type, Relobj* relobj, unsigned int shndx,
831 Arm_address source, Arm_address destination,
832 uint32_t original_insn) const
833 {
834 gold_assert(stub_type >= arm_stub_cortex_a8_first
835 && stub_type <= arm_stub_cortex_a8_last);
836 return new Cortex_a8_stub(this->stub_templates_[stub_type], relobj, shndx,
837 source, destination, original_insn);
838 }
839
a2162063
ILT
840 // Make an ARM V4BX relocation stub.
841 // This method creates a stub from the arm_stub_v4_veneer_bx template only.
842 Arm_v4bx_stub*
843 make_arm_v4bx_stub(uint32_t reg) const
844 {
845 gold_assert(reg < 0xf);
846 return new Arm_v4bx_stub(this->stub_templates_[arm_stub_v4_veneer_bx],
847 reg);
848 }
849
b569affa
DK
850 private:
851 // Constructor and destructor are protected since we only return a single
852 // instance created in Stub_factory::get_instance().
853
854 Stub_factory();
855
856 // A Stub_factory may not be copied since it is a singleton.
857 Stub_factory(const Stub_factory&);
858 Stub_factory& operator=(Stub_factory&);
859
860 // Stub templates. These are initialized in the constructor.
861 const Stub_template* stub_templates_[arm_stub_type_last+1];
862};
863
56ee5e00
DK
864// A class to hold stubs for the ARM target.
865
866template<bool big_endian>
867class Stub_table : public Output_data
868{
869 public:
2ea97941 870 Stub_table(Arm_input_section<big_endian>* owner)
d099120c
DK
871 : Output_data(), owner_(owner), reloc_stubs_(), reloc_stubs_size_(0),
872 reloc_stubs_addralign_(1), cortex_a8_stubs_(), arm_v4bx_stubs_(0xf),
873 prev_data_size_(0), prev_addralign_(1)
56ee5e00
DK
874 { }
875
876 ~Stub_table()
877 { }
878
879 // Owner of this stub table.
880 Arm_input_section<big_endian>*
881 owner() const
882 { return this->owner_; }
883
884 // Whether this stub table is empty.
885 bool
886 empty() const
a2162063
ILT
887 {
888 return (this->reloc_stubs_.empty()
889 && this->cortex_a8_stubs_.empty()
890 && this->arm_v4bx_stubs_.empty());
891 }
56ee5e00
DK
892
893 // Return the current data size.
894 off_t
895 current_data_size() const
896 { return this->current_data_size_for_child(); }
897
9b547ce6
RW
898 // Add a STUB using KEY. The caller is responsible for avoiding addition
899 // if a STUB with the same key has already been added.
56ee5e00 900 void
2fb7225c
DK
901 add_reloc_stub(Reloc_stub* stub, const Reloc_stub::Key& key)
902 {
903 const Stub_template* stub_template = stub->stub_template();
904 gold_assert(stub_template->type() == key.stub_type());
905 this->reloc_stubs_[key] = stub;
d099120c
DK
906
907 // Assign stub offset early. We can do this because we never remove
908 // reloc stubs and they are in the beginning of the stub table.
909 uint64_t align = stub_template->alignment();
910 this->reloc_stubs_size_ = align_address(this->reloc_stubs_size_, align);
911 stub->set_offset(this->reloc_stubs_size_);
912 this->reloc_stubs_size_ += stub_template->size();
913 this->reloc_stubs_addralign_ =
914 std::max(this->reloc_stubs_addralign_, align);
2fb7225c
DK
915 }
916
917 // Add a Cortex-A8 STUB that fixes up a THUMB branch at ADDRESS.
9b547ce6
RW
918 // The caller is responsible for avoiding addition if a STUB with the same
919 // address has already been added.
2fb7225c
DK
920 void
921 add_cortex_a8_stub(Arm_address address, Cortex_a8_stub* stub)
922 {
923 std::pair<Arm_address, Cortex_a8_stub*> value(address, stub);
924 this->cortex_a8_stubs_.insert(value);
925 }
926
a2162063
ILT
927 // Add an ARM V4BX relocation stub. A register index will be retrieved
928 // from the stub.
929 void
930 add_arm_v4bx_stub(Arm_v4bx_stub* stub)
931 {
932 gold_assert(stub != NULL && this->arm_v4bx_stubs_[stub->reg()] == NULL);
933 this->arm_v4bx_stubs_[stub->reg()] = stub;
934 }
935
2fb7225c
DK
936 // Remove all Cortex-A8 stubs.
937 void
938 remove_all_cortex_a8_stubs();
56ee5e00
DK
939
940 // Look up a relocation stub using KEY. Return NULL if there is none.
941 Reloc_stub*
942 find_reloc_stub(const Reloc_stub::Key& key) const
943 {
944 typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.find(key);
945 return (p != this->reloc_stubs_.end()) ? p->second : NULL;
946 }
947
a2162063
ILT
948 // Look up an arm v4bx relocation stub using the register index.
949 // Return NULL if there is none.
950 Arm_v4bx_stub*
951 find_arm_v4bx_stub(const uint32_t reg) const
952 {
953 gold_assert(reg < 0xf);
954 return this->arm_v4bx_stubs_[reg];
955 }
956
56ee5e00
DK
957 // Relocate stubs in this stub table.
958 void
959 relocate_stubs(const Relocate_info<32, big_endian>*,
960 Target_arm<big_endian>*, Output_section*,
961 unsigned char*, Arm_address, section_size_type);
962
2fb7225c
DK
963 // Update data size and alignment at the end of a relaxation pass. Return
964 // true if either data size or alignment is different from that of the
965 // previous relaxation pass.
966 bool
967 update_data_size_and_addralign();
968
969 // Finalize stubs. Set the offsets of all stubs and mark input sections
970 // needing the Cortex-A8 workaround.
971 void
972 finalize_stubs();
973
974 // Apply Cortex-A8 workaround to an address range.
975 void
976 apply_cortex_a8_workaround_to_address_range(Target_arm<big_endian>*,
977 unsigned char*, Arm_address,
978 section_size_type);
979
56ee5e00
DK
980 protected:
981 // Write out section contents.
982 void
983 do_write(Output_file*);
984
985 // Return the required alignment.
986 uint64_t
987 do_addralign() const
2fb7225c 988 { return this->prev_addralign_; }
56ee5e00
DK
989
990 // Reset address and file offset.
991 void
2fb7225c
DK
992 do_reset_address_and_file_offset()
993 { this->set_current_data_size_for_child(this->prev_data_size_); }
56ee5e00 994
2fb7225c
DK
995 // Set final data size.
996 void
997 set_final_data_size()
998 { this->set_data_size(this->current_data_size()); }
999
56ee5e00 1000 private:
2fb7225c
DK
1001 // Relocate one stub.
1002 void
1003 relocate_stub(Stub*, const Relocate_info<32, big_endian>*,
1004 Target_arm<big_endian>*, Output_section*,
1005 unsigned char*, Arm_address, section_size_type);
1006
1007 // Unordered map of relocation stubs.
56ee5e00
DK
1008 typedef
1009 Unordered_map<Reloc_stub::Key, Reloc_stub*, Reloc_stub::Key::hash,
1010 Reloc_stub::Key::equal_to>
1011 Reloc_stub_map;
1012
2fb7225c
DK
1013 // List of Cortex-A8 stubs ordered by addresses of branches being
1014 // fixed up in output.
1015 typedef std::map<Arm_address, Cortex_a8_stub*> Cortex_a8_stub_list;
a2162063
ILT
1016 // List of Arm V4BX relocation stubs ordered by associated registers.
1017 typedef std::vector<Arm_v4bx_stub*> Arm_v4bx_stub_list;
2fb7225c 1018
56ee5e00
DK
1019 // Owner of this stub table.
1020 Arm_input_section<big_endian>* owner_;
56ee5e00
DK
1021 // The relocation stubs.
1022 Reloc_stub_map reloc_stubs_;
d099120c
DK
1023 // Size of reloc stubs.
1024 off_t reloc_stubs_size_;
1025 // Maximum address alignment of reloc stubs.
1026 uint64_t reloc_stubs_addralign_;
2fb7225c
DK
1027 // The cortex_a8_stubs.
1028 Cortex_a8_stub_list cortex_a8_stubs_;
a2162063
ILT
1029 // The Arm V4BX relocation stubs.
1030 Arm_v4bx_stub_list arm_v4bx_stubs_;
2fb7225c
DK
1031 // data size of this in the previous pass.
1032 off_t prev_data_size_;
1033 // address alignment of this in the previous pass.
1034 uint64_t prev_addralign_;
56ee5e00
DK
1035};
1036
af2cdeae
DK
1037// Arm_exidx_cantunwind class. This represents an EXIDX_CANTUNWIND entry
1038// we add to the end of an EXIDX input section that goes into the output.
1039
1040class Arm_exidx_cantunwind : public Output_section_data
1041{
1042 public:
1043 Arm_exidx_cantunwind(Relobj* relobj, unsigned int shndx)
1044 : Output_section_data(8, 4, true), relobj_(relobj), shndx_(shndx)
1045 { }
1046
1047 // Return the object containing the section pointed by this.
1048 Relobj*
1049 relobj() const
1050 { return this->relobj_; }
1051
1052 // Return the section index of the section pointed by this.
1053 unsigned int
1054 shndx() const
1055 { return this->shndx_; }
1056
1057 protected:
1058 void
1059 do_write(Output_file* of)
1060 {
1061 if (parameters->target().is_big_endian())
1062 this->do_fixed_endian_write<true>(of);
1063 else
1064 this->do_fixed_endian_write<false>(of);
1065 }
1066
aa98ff75
DK
1067 // Write to a map file.
1068 void
1069 do_print_to_mapfile(Mapfile* mapfile) const
1070 { mapfile->print_output_data(this, _("** ARM cantunwind")); }
1071
af2cdeae 1072 private:
7296d933 1073 // Implement do_write for a given endianness.
af2cdeae
DK
1074 template<bool big_endian>
1075 void inline
1076 do_fixed_endian_write(Output_file*);
1077
1078 // The object containing the section pointed by this.
1079 Relobj* relobj_;
1080 // The section index of the section pointed by this.
1081 unsigned int shndx_;
1082};
1083
1084// During EXIDX coverage fix-up, we compact an EXIDX section. The
1085// Offset map is used to map input section offset within the EXIDX section
1086// to the output offset from the start of this EXIDX section.
1087
1088typedef std::map<section_offset_type, section_offset_type>
1089 Arm_exidx_section_offset_map;
1090
1091// Arm_exidx_merged_section class. This represents an EXIDX input section
1092// with some of its entries merged.
1093
1094class Arm_exidx_merged_section : public Output_relaxed_input_section
1095{
1096 public:
1097 // Constructor for Arm_exidx_merged_section.
1098 // EXIDX_INPUT_SECTION points to the unmodified EXIDX input section.
1099 // SECTION_OFFSET_MAP points to a section offset map describing how
1100 // parts of the input section are mapped to output. DELETED_BYTES is
1101 // the number of bytes deleted from the EXIDX input section.
1102 Arm_exidx_merged_section(
1103 const Arm_exidx_input_section& exidx_input_section,
1104 const Arm_exidx_section_offset_map& section_offset_map,
1105 uint32_t deleted_bytes);
1106
f625ae50
DK
1107 // Build output contents.
1108 void
1109 build_contents(const unsigned char*, section_size_type);
1110
af2cdeae
DK
1111 // Return the original EXIDX input section.
1112 const Arm_exidx_input_section&
1113 exidx_input_section() const
1114 { return this->exidx_input_section_; }
1115
1116 // Return the section offset map.
1117 const Arm_exidx_section_offset_map&
1118 section_offset_map() const
1119 { return this->section_offset_map_; }
1120
1121 protected:
1122 // Write merged section into file OF.
1123 void
1124 do_write(Output_file* of);
1125
1126 bool
1127 do_output_offset(const Relobj*, unsigned int, section_offset_type,
1128 section_offset_type*) const;
1129
1130 private:
1131 // Original EXIDX input section.
1132 const Arm_exidx_input_section& exidx_input_section_;
1133 // Section offset map.
1134 const Arm_exidx_section_offset_map& section_offset_map_;
f625ae50
DK
1135 // Merged section contents. We need to keep build the merged section
1136 // and save it here to avoid accessing the original EXIDX section when
1137 // we cannot lock the sections' object.
1138 unsigned char* section_contents_;
af2cdeae
DK
1139};
1140
10ad9fe5
DK
1141// A class to wrap an ordinary input section containing executable code.
1142
1143template<bool big_endian>
1144class Arm_input_section : public Output_relaxed_input_section
1145{
1146 public:
2ea97941
ILT
1147 Arm_input_section(Relobj* relobj, unsigned int shndx)
1148 : Output_relaxed_input_section(relobj, shndx, 1),
f625ae50
DK
1149 original_addralign_(1), original_size_(0), stub_table_(NULL),
1150 original_contents_(NULL)
10ad9fe5
DK
1151 { }
1152
1153 ~Arm_input_section()
f625ae50 1154 { delete[] this->original_contents_; }
10ad9fe5
DK
1155
1156 // Initialize.
1157 void
1158 init();
1159
1160 // Whether this is a stub table owner.
1161 bool
1162 is_stub_table_owner() const
1163 { return this->stub_table_ != NULL && this->stub_table_->owner() == this; }
1164
1165 // Return the stub table.
1166 Stub_table<big_endian>*
1167 stub_table() const
1168 { return this->stub_table_; }
1169
1170 // Set the stub_table.
1171 void
2ea97941
ILT
1172 set_stub_table(Stub_table<big_endian>* stub_table)
1173 { this->stub_table_ = stub_table; }
10ad9fe5 1174
07f508a2
DK
1175 // Downcast a base pointer to an Arm_input_section pointer. This is
1176 // not type-safe but we only use Arm_input_section not the base class.
1177 static Arm_input_section<big_endian>*
1178 as_arm_input_section(Output_relaxed_input_section* poris)
1179 { return static_cast<Arm_input_section<big_endian>*>(poris); }
1180
6625d24e
DK
1181 // Return the original size of the section.
1182 uint32_t
1183 original_size() const
1184 { return this->original_size_; }
1185
10ad9fe5
DK
1186 protected:
1187 // Write data to output file.
1188 void
1189 do_write(Output_file*);
1190
1191 // Return required alignment of this.
1192 uint64_t
1193 do_addralign() const
1194 {
1195 if (this->is_stub_table_owner())
1196 return std::max(this->stub_table_->addralign(),
6625d24e 1197 static_cast<uint64_t>(this->original_addralign_));
10ad9fe5
DK
1198 else
1199 return this->original_addralign_;
1200 }
1201
1202 // Finalize data size.
1203 void
1204 set_final_data_size();
1205
1206 // Reset address and file offset.
1207 void
1208 do_reset_address_and_file_offset();
1209
1210 // Output offset.
1211 bool
2ea97941
ILT
1212 do_output_offset(const Relobj* object, unsigned int shndx,
1213 section_offset_type offset,
10ad9fe5
DK
1214 section_offset_type* poutput) const
1215 {
1216 if ((object == this->relobj())
2ea97941
ILT
1217 && (shndx == this->shndx())
1218 && (offset >= 0)
0439c796
DK
1219 && (offset <=
1220 convert_types<section_offset_type, uint32_t>(this->original_size_)))
10ad9fe5 1221 {
2ea97941 1222 *poutput = offset;
10ad9fe5
DK
1223 return true;
1224 }
1225 else
1226 return false;
1227 }
1228
1229 private:
1230 // Copying is not allowed.
1231 Arm_input_section(const Arm_input_section&);
1232 Arm_input_section& operator=(const Arm_input_section&);
1233
1234 // Address alignment of the original input section.
6625d24e 1235 uint32_t original_addralign_;
10ad9fe5 1236 // Section size of the original input section.
6625d24e 1237 uint32_t original_size_;
10ad9fe5
DK
1238 // Stub table.
1239 Stub_table<big_endian>* stub_table_;
f625ae50
DK
1240 // Original section contents. We have to make a copy here since the file
1241 // containing the original section may not be locked when we need to access
1242 // the contents.
1243 unsigned char* original_contents_;
10ad9fe5
DK
1244};
1245
80d0d023
DK
1246// Arm_exidx_fixup class. This is used to define a number of methods
1247// and keep states for fixing up EXIDX coverage.
1248
1249class Arm_exidx_fixup
1250{
1251 public:
85fdf906
AH
1252 Arm_exidx_fixup(Output_section* exidx_output_section,
1253 bool merge_exidx_entries = true)
80d0d023
DK
1254 : exidx_output_section_(exidx_output_section), last_unwind_type_(UT_NONE),
1255 last_inlined_entry_(0), last_input_section_(NULL),
85fdf906
AH
1256 section_offset_map_(NULL), first_output_text_section_(NULL),
1257 merge_exidx_entries_(merge_exidx_entries)
80d0d023
DK
1258 { }
1259
1260 ~Arm_exidx_fixup()
1261 { delete this->section_offset_map_; }
1262
f625ae50
DK
1263 // Process an EXIDX section for entry merging. SECTION_CONTENTS points
1264 // to the EXIDX contents and SECTION_SIZE is the size of the contents. Return
1265 // number of bytes to be deleted in output. If parts of the input EXIDX
1266 // section are merged a heap allocated Arm_exidx_section_offset_map is store
1267 // in the located PSECTION_OFFSET_MAP. The caller owns the map and is
9b547ce6 1268 // responsible for releasing it.
80d0d023
DK
1269 template<bool big_endian>
1270 uint32_t
1271 process_exidx_section(const Arm_exidx_input_section* exidx_input_section,
f625ae50
DK
1272 const unsigned char* section_contents,
1273 section_size_type section_size,
80d0d023
DK
1274 Arm_exidx_section_offset_map** psection_offset_map);
1275
1276 // Append an EXIDX_CANTUNWIND entry pointing at the end of the last
1277 // input section, if there is not one already.
1278 void
1279 add_exidx_cantunwind_as_needed();
1280
546c7457
DK
1281 // Return the output section for the text section which is linked to the
1282 // first exidx input in output.
1283 Output_section*
1284 first_output_text_section() const
1285 { return this->first_output_text_section_; }
1286
80d0d023
DK
1287 private:
1288 // Copying is not allowed.
1289 Arm_exidx_fixup(const Arm_exidx_fixup&);
1290 Arm_exidx_fixup& operator=(const Arm_exidx_fixup&);
1291
1292 // Type of EXIDX unwind entry.
1293 enum Unwind_type
1294 {
1295 // No type.
1296 UT_NONE,
1297 // EXIDX_CANTUNWIND.
1298 UT_EXIDX_CANTUNWIND,
1299 // Inlined entry.
1300 UT_INLINED_ENTRY,
1301 // Normal entry.
1302 UT_NORMAL_ENTRY,
1303 };
1304
1305 // Process an EXIDX entry. We only care about the second word of the
1306 // entry. Return true if the entry can be deleted.
1307 bool
1308 process_exidx_entry(uint32_t second_word);
1309
1310 // Update the current section offset map during EXIDX section fix-up.
1311 // If there is no map, create one. INPUT_OFFSET is the offset of a
1312 // reference point, DELETED_BYTES is the number of deleted by in the
1313 // section so far. If DELETE_ENTRY is true, the reference point and
1314 // all offsets after the previous reference point are discarded.
1315 void
1316 update_offset_map(section_offset_type input_offset,
1317 section_size_type deleted_bytes, bool delete_entry);
1318
1319 // EXIDX output section.
1320 Output_section* exidx_output_section_;
1321 // Unwind type of the last EXIDX entry processed.
1322 Unwind_type last_unwind_type_;
1323 // Last seen inlined EXIDX entry.
1324 uint32_t last_inlined_entry_;
1325 // Last processed EXIDX input section.
2b328d4e 1326 const Arm_exidx_input_section* last_input_section_;
80d0d023
DK
1327 // Section offset map created in process_exidx_section.
1328 Arm_exidx_section_offset_map* section_offset_map_;
546c7457
DK
1329 // Output section for the text section which is linked to the first exidx
1330 // input in output.
1331 Output_section* first_output_text_section_;
85fdf906
AH
1332
1333 bool merge_exidx_entries_;
80d0d023
DK
1334};
1335
07f508a2
DK
1336// Arm output section class. This is defined mainly to add a number of
1337// stub generation methods.
1338
1339template<bool big_endian>
1340class Arm_output_section : public Output_section
1341{
1342 public:
2b328d4e
DK
1343 typedef std::vector<std::pair<Relobj*, unsigned int> > Text_section_list;
1344
c87e4302 1345 // We need to force SHF_LINK_ORDER in a SHT_ARM_EXIDX section.
2ea97941
ILT
1346 Arm_output_section(const char* name, elfcpp::Elf_Word type,
1347 elfcpp::Elf_Xword flags)
c87e4302
DK
1348 : Output_section(name, type,
1349 (type == elfcpp::SHT_ARM_EXIDX
1350 ? flags | elfcpp::SHF_LINK_ORDER
1351 : flags))
131687b4
DK
1352 {
1353 if (type == elfcpp::SHT_ARM_EXIDX)
1354 this->set_always_keeps_input_sections();
1355 }
07f508a2
DK
1356
1357 ~Arm_output_section()
1358 { }
1359
1360 // Group input sections for stub generation.
1361 void
f625ae50 1362 group_sections(section_size_type, bool, Target_arm<big_endian>*, const Task*);
07f508a2
DK
1363
1364 // Downcast a base pointer to an Arm_output_section pointer. This is
1365 // not type-safe but we only use Arm_output_section not the base class.
1366 static Arm_output_section<big_endian>*
1367 as_arm_output_section(Output_section* os)
1368 { return static_cast<Arm_output_section<big_endian>*>(os); }
1369
2b328d4e
DK
1370 // Append all input text sections in this into LIST.
1371 void
1372 append_text_sections_to_list(Text_section_list* list);
1373
1374 // Fix EXIDX coverage of this EXIDX output section. SORTED_TEXT_SECTION
1375 // is a list of text input sections sorted in ascending order of their
1376 // output addresses.
1377 void
4a54abbb
DK
1378 fix_exidx_coverage(Layout* layout,
1379 const Text_section_list& sorted_text_section,
85fdf906 1380 Symbol_table* symtab,
f625ae50
DK
1381 bool merge_exidx_entries,
1382 const Task* task);
2b328d4e 1383
131687b4
DK
1384 // Link an EXIDX section into its corresponding text section.
1385 void
1386 set_exidx_section_link();
1387
07f508a2
DK
1388 private:
1389 // For convenience.
1390 typedef Output_section::Input_section Input_section;
1391 typedef Output_section::Input_section_list Input_section_list;
1392
1393 // Create a stub group.
1394 void create_stub_group(Input_section_list::const_iterator,
1395 Input_section_list::const_iterator,
1396 Input_section_list::const_iterator,
1397 Target_arm<big_endian>*,
f625ae50
DK
1398 std::vector<Output_relaxed_input_section*>*,
1399 const Task* task);
07f508a2
DK
1400};
1401
993d07c1
DK
1402// Arm_exidx_input_section class. This represents an EXIDX input section.
1403
1404class Arm_exidx_input_section
1405{
1406 public:
1407 static const section_offset_type invalid_offset =
1408 static_cast<section_offset_type>(-1);
1409
1410 Arm_exidx_input_section(Relobj* relobj, unsigned int shndx,
f625ae50
DK
1411 unsigned int link, uint32_t size,
1412 uint32_t addralign, uint32_t text_size)
993d07c1 1413 : relobj_(relobj), shndx_(shndx), link_(link), size_(size),
f625ae50 1414 addralign_(addralign), text_size_(text_size), has_errors_(false)
993d07c1
DK
1415 { }
1416
1417 ~Arm_exidx_input_section()
1418 { }
1419
1420 // Accessors: This is a read-only class.
1421
1422 // Return the object containing this EXIDX input section.
1423 Relobj*
1424 relobj() const
1425 { return this->relobj_; }
1426
1427 // Return the section index of this EXIDX input section.
1428 unsigned int
1429 shndx() const
1430 { return this->shndx_; }
1431
1432 // Return the section index of linked text section in the same object.
1433 unsigned int
1434 link() const
1435 { return this->link_; }
1436
1437 // Return size of the EXIDX input section.
1438 uint32_t
1439 size() const
1440 { return this->size_; }
1441
f625ae50 1442 // Return address alignment of EXIDX input section.
993d07c1
DK
1443 uint32_t
1444 addralign() const
1445 { return this->addralign_; }
1446
f625ae50
DK
1447 // Return size of the associated text input section.
1448 uint32_t
1449 text_size() const
1450 { return this->text_size_; }
1451
131687b4
DK
1452 // Whether there are any errors in the EXIDX input section.
1453 bool
1454 has_errors() const
1455 { return this->has_errors_; }
1456
1457 // Set has-errors flag.
1458 void
1459 set_has_errors()
1460 { this->has_errors_ = true; }
1461
993d07c1
DK
1462 private:
1463 // Object containing this.
1464 Relobj* relobj_;
1465 // Section index of this.
1466 unsigned int shndx_;
1467 // text section linked to this in the same object.
1468 unsigned int link_;
1469 // Size of this. For ARM 32-bit is sufficient.
1470 uint32_t size_;
1471 // Address alignment of this. For ARM 32-bit is sufficient.
1472 uint32_t addralign_;
f625ae50
DK
1473 // Size of associated text section.
1474 uint32_t text_size_;
131687b4
DK
1475 // Whether this has any errors.
1476 bool has_errors_;
993d07c1
DK
1477};
1478
8ffa3667
DK
1479// Arm_relobj class.
1480
1481template<bool big_endian>
1482class Arm_relobj : public Sized_relobj<32, big_endian>
1483{
1484 public:
1485 static const Arm_address invalid_address = static_cast<Arm_address>(-1);
1486
2ea97941 1487 Arm_relobj(const std::string& name, Input_file* input_file, off_t offset,
8ffa3667 1488 const typename elfcpp::Ehdr<32, big_endian>& ehdr)
2ea97941 1489 : Sized_relobj<32, big_endian>(name, input_file, offset, ehdr),
a0351a69 1490 stub_tables_(), local_symbol_is_thumb_function_(),
20138696 1491 attributes_section_data_(NULL), mapping_symbols_info_(),
e7eca48c 1492 section_has_cortex_a8_workaround_(NULL), exidx_section_map_(),
7296d933
DK
1493 output_local_symbol_count_needs_update_(false),
1494 merge_flags_and_attributes_(true)
8ffa3667
DK
1495 { }
1496
1497 ~Arm_relobj()
a0351a69 1498 { delete this->attributes_section_data_; }
8ffa3667
DK
1499
1500 // Return the stub table of the SHNDX-th section if there is one.
1501 Stub_table<big_endian>*
2ea97941 1502 stub_table(unsigned int shndx) const
8ffa3667 1503 {
2ea97941
ILT
1504 gold_assert(shndx < this->stub_tables_.size());
1505 return this->stub_tables_[shndx];
8ffa3667
DK
1506 }
1507
1508 // Set STUB_TABLE to be the stub_table of the SHNDX-th section.
1509 void
2ea97941 1510 set_stub_table(unsigned int shndx, Stub_table<big_endian>* stub_table)
8ffa3667 1511 {
2ea97941
ILT
1512 gold_assert(shndx < this->stub_tables_.size());
1513 this->stub_tables_[shndx] = stub_table;
8ffa3667
DK
1514 }
1515
1516 // Whether a local symbol is a THUMB function. R_SYM is the symbol table
1517 // index. This is only valid after do_count_local_symbol is called.
1518 bool
1519 local_symbol_is_thumb_function(unsigned int r_sym) const
1520 {
1521 gold_assert(r_sym < this->local_symbol_is_thumb_function_.size());
1522 return this->local_symbol_is_thumb_function_[r_sym];
1523 }
1524
1525 // Scan all relocation sections for stub generation.
1526 void
1527 scan_sections_for_stubs(Target_arm<big_endian>*, const Symbol_table*,
1528 const Layout*);
1529
1530 // Convert regular input section with index SHNDX to a relaxed section.
1531 void
2ea97941 1532 convert_input_section_to_relaxed_section(unsigned shndx)
8ffa3667
DK
1533 {
1534 // The stubs have relocations and we need to process them after writing
1535 // out the stubs. So relocation now must follow section write.
2b328d4e 1536 this->set_section_offset(shndx, -1ULL);
8ffa3667
DK
1537 this->set_relocs_must_follow_section_writes();
1538 }
1539
1540 // Downcast a base pointer to an Arm_relobj pointer. This is
1541 // not type-safe but we only use Arm_relobj not the base class.
1542 static Arm_relobj<big_endian>*
2ea97941
ILT
1543 as_arm_relobj(Relobj* relobj)
1544 { return static_cast<Arm_relobj<big_endian>*>(relobj); }
8ffa3667 1545
d5b40221
DK
1546 // Processor-specific flags in ELF file header. This is valid only after
1547 // reading symbols.
1548 elfcpp::Elf_Word
1549 processor_specific_flags() const
1550 { return this->processor_specific_flags_; }
1551
a0351a69
DK
1552 // Attribute section data This is the contents of the .ARM.attribute section
1553 // if there is one.
1554 const Attributes_section_data*
1555 attributes_section_data() const
1556 { return this->attributes_section_data_; }
1557
20138696
DK
1558 // Mapping symbol location.
1559 typedef std::pair<unsigned int, Arm_address> Mapping_symbol_position;
1560
1561 // Functor for STL container.
1562 struct Mapping_symbol_position_less
1563 {
1564 bool
1565 operator()(const Mapping_symbol_position& p1,
1566 const Mapping_symbol_position& p2) const
1567 {
1568 return (p1.first < p2.first
1569 || (p1.first == p2.first && p1.second < p2.second));
1570 }
1571 };
1572
1573 // We only care about the first character of a mapping symbol, so
1574 // we only store that instead of the whole symbol name.
1575 typedef std::map<Mapping_symbol_position, char,
1576 Mapping_symbol_position_less> Mapping_symbols_info;
1577
2fb7225c
DK
1578 // Whether a section contains any Cortex-A8 workaround.
1579 bool
1580 section_has_cortex_a8_workaround(unsigned int shndx) const
1581 {
1582 return (this->section_has_cortex_a8_workaround_ != NULL
1583 && (*this->section_has_cortex_a8_workaround_)[shndx]);
1584 }
1585
1586 // Mark a section that has Cortex-A8 workaround.
1587 void
1588 mark_section_for_cortex_a8_workaround(unsigned int shndx)
1589 {
1590 if (this->section_has_cortex_a8_workaround_ == NULL)
1591 this->section_has_cortex_a8_workaround_ =
1592 new std::vector<bool>(this->shnum(), false);
1593 (*this->section_has_cortex_a8_workaround_)[shndx] = true;
1594 }
1595
993d07c1
DK
1596 // Return the EXIDX section of an text section with index SHNDX or NULL
1597 // if the text section has no associated EXIDX section.
1598 const Arm_exidx_input_section*
1599 exidx_input_section_by_link(unsigned int shndx) const
1600 {
1601 Exidx_section_map::const_iterator p = this->exidx_section_map_.find(shndx);
1602 return ((p != this->exidx_section_map_.end()
1603 && p->second->link() == shndx)
1604 ? p->second
1605 : NULL);
1606 }
1607
1608 // Return the EXIDX section with index SHNDX or NULL if there is none.
1609 const Arm_exidx_input_section*
1610 exidx_input_section_by_shndx(unsigned shndx) const
1611 {
1612 Exidx_section_map::const_iterator p = this->exidx_section_map_.find(shndx);
1613 return ((p != this->exidx_section_map_.end()
1614 && p->second->shndx() == shndx)
1615 ? p->second
1616 : NULL);
1617 }
1618
e7eca48c
DK
1619 // Whether output local symbol count needs updating.
1620 bool
1621 output_local_symbol_count_needs_update() const
1622 { return this->output_local_symbol_count_needs_update_; }
1623
1624 // Set output_local_symbol_count_needs_update flag to be true.
1625 void
1626 set_output_local_symbol_count_needs_update()
1627 { this->output_local_symbol_count_needs_update_ = true; }
1628
1629 // Update output local symbol count at the end of relaxation.
1630 void
1631 update_output_local_symbol_count();
1632
7296d933
DK
1633 // Whether we want to merge processor-specific flags and attributes.
1634 bool
1635 merge_flags_and_attributes() const
1636 { return this->merge_flags_and_attributes_; }
1637
131687b4
DK
1638 // Export list of EXIDX section indices.
1639 void
1640 get_exidx_shndx_list(std::vector<unsigned int>* list) const
1641 {
1642 list->clear();
1643 for (Exidx_section_map::const_iterator p = this->exidx_section_map_.begin();
1644 p != this->exidx_section_map_.end();
1645 ++p)
1646 {
1647 if (p->second->shndx() == p->first)
1648 list->push_back(p->first);
1649 }
1650 // Sort list to make result independent of implementation of map.
1651 std::sort(list->begin(), list->end());
1652 }
1653
8ffa3667
DK
1654 protected:
1655 // Post constructor setup.
1656 void
1657 do_setup()
1658 {
1659 // Call parent's setup method.
1660 Sized_relobj<32, big_endian>::do_setup();
1661
1662 // Initialize look-up tables.
1663 Stub_table_list empty_stub_table_list(this->shnum(), NULL);
1664 this->stub_tables_.swap(empty_stub_table_list);
1665 }
1666
1667 // Count the local symbols.
1668 void
1669 do_count_local_symbols(Stringpool_template<char>*,
1670 Stringpool_template<char>*);
1671
1672 void
43d12afe 1673 do_relocate_sections(const Symbol_table* symtab, const Layout* layout,
aa98ff75 1674 const unsigned char* pshdrs, Output_file* of,
8ffa3667
DK
1675 typename Sized_relobj<32, big_endian>::Views* pivews);
1676
d5b40221
DK
1677 // Read the symbol information.
1678 void
1679 do_read_symbols(Read_symbols_data* sd);
1680
99e5bff2
DK
1681 // Process relocs for garbage collection.
1682 void
1683 do_gc_process_relocs(Symbol_table*, Layout*, Read_relocs_data*);
1684
8ffa3667 1685 private:
44272192
DK
1686
1687 // Whether a section needs to be scanned for relocation stubs.
1688 bool
1689 section_needs_reloc_stub_scanning(const elfcpp::Shdr<32, big_endian>&,
1690 const Relobj::Output_sections&,
ca09d69a 1691 const Symbol_table*, const unsigned char*);
44272192 1692
cf846138
DK
1693 // Whether a section is a scannable text section.
1694 bool
1695 section_is_scannable(const elfcpp::Shdr<32, big_endian>&, unsigned int,
ca09d69a 1696 const Output_section*, const Symbol_table*);
cf846138 1697
44272192
DK
1698 // Whether a section needs to be scanned for the Cortex-A8 erratum.
1699 bool
1700 section_needs_cortex_a8_stub_scanning(const elfcpp::Shdr<32, big_endian>&,
1701 unsigned int, Output_section*,
ca09d69a 1702 const Symbol_table*);
44272192
DK
1703
1704 // Scan a section for the Cortex-A8 erratum.
1705 void
1706 scan_section_for_cortex_a8_erratum(const elfcpp::Shdr<32, big_endian>&,
1707 unsigned int, Output_section*,
1708 Target_arm<big_endian>*);
1709
c8761b9a 1710 // Find the linked text section of an EXIDX section by looking at the
9b547ce6 1711 // first relocation of the EXIDX section. PSHDR points to the section
c8761b9a
DK
1712 // headers of a relocation section and PSYMS points to the local symbols.
1713 // PSHNDX points to a location storing the text section index if found.
1714 // Return whether we can find the linked section.
1715 bool
1716 find_linked_text_section(const unsigned char* pshdr,
1717 const unsigned char* psyms, unsigned int* pshndx);
1718
1719 //
993d07c1 1720 // Make a new Arm_exidx_input_section object for EXIDX section with
c8761b9a
DK
1721 // index SHNDX and section header SHDR. TEXT_SHNDX is the section
1722 // index of the linked text section.
993d07c1
DK
1723 void
1724 make_exidx_input_section(unsigned int shndx,
c8761b9a 1725 const elfcpp::Shdr<32, big_endian>& shdr,
131687b4
DK
1726 unsigned int text_shndx,
1727 const elfcpp::Shdr<32, big_endian>& text_shdr);
993d07c1 1728
cb1be87e
DK
1729 // Return the output address of either a plain input section or a
1730 // relaxed input section. SHNDX is the section index.
1731 Arm_address
1732 simple_input_section_output_address(unsigned int, Output_section*);
1733
8ffa3667 1734 typedef std::vector<Stub_table<big_endian>*> Stub_table_list;
993d07c1
DK
1735 typedef Unordered_map<unsigned int, const Arm_exidx_input_section*>
1736 Exidx_section_map;
1737
1738 // List of stub tables.
8ffa3667
DK
1739 Stub_table_list stub_tables_;
1740 // Bit vector to tell if a local symbol is a thumb function or not.
1741 // This is only valid after do_count_local_symbol is called.
1742 std::vector<bool> local_symbol_is_thumb_function_;
d5b40221
DK
1743 // processor-specific flags in ELF file header.
1744 elfcpp::Elf_Word processor_specific_flags_;
a0351a69
DK
1745 // Object attributes if there is an .ARM.attributes section or NULL.
1746 Attributes_section_data* attributes_section_data_;
20138696
DK
1747 // Mapping symbols information.
1748 Mapping_symbols_info mapping_symbols_info_;
2fb7225c
DK
1749 // Bitmap to indicate sections with Cortex-A8 workaround or NULL.
1750 std::vector<bool>* section_has_cortex_a8_workaround_;
993d07c1
DK
1751 // Map a text section to its associated .ARM.exidx section, if there is one.
1752 Exidx_section_map exidx_section_map_;
e7eca48c
DK
1753 // Whether output local symbol count needs updating.
1754 bool output_local_symbol_count_needs_update_;
7296d933
DK
1755 // Whether we merge processor flags and attributes of this object to
1756 // output.
1757 bool merge_flags_and_attributes_;
d5b40221
DK
1758};
1759
1760// Arm_dynobj class.
1761
1762template<bool big_endian>
1763class Arm_dynobj : public Sized_dynobj<32, big_endian>
1764{
1765 public:
2ea97941 1766 Arm_dynobj(const std::string& name, Input_file* input_file, off_t offset,
d5b40221 1767 const elfcpp::Ehdr<32, big_endian>& ehdr)
2ea97941
ILT
1768 : Sized_dynobj<32, big_endian>(name, input_file, offset, ehdr),
1769 processor_specific_flags_(0), attributes_section_data_(NULL)
d5b40221
DK
1770 { }
1771
1772 ~Arm_dynobj()
a0351a69 1773 { delete this->attributes_section_data_; }
d5b40221
DK
1774
1775 // Downcast a base pointer to an Arm_relobj pointer. This is
1776 // not type-safe but we only use Arm_relobj not the base class.
1777 static Arm_dynobj<big_endian>*
1778 as_arm_dynobj(Dynobj* dynobj)
1779 { return static_cast<Arm_dynobj<big_endian>*>(dynobj); }
1780
1781 // Processor-specific flags in ELF file header. This is valid only after
1782 // reading symbols.
1783 elfcpp::Elf_Word
1784 processor_specific_flags() const
1785 { return this->processor_specific_flags_; }
1786
a0351a69
DK
1787 // Attributes section data.
1788 const Attributes_section_data*
1789 attributes_section_data() const
1790 { return this->attributes_section_data_; }
1791
d5b40221
DK
1792 protected:
1793 // Read the symbol information.
1794 void
1795 do_read_symbols(Read_symbols_data* sd);
1796
1797 private:
1798 // processor-specific flags in ELF file header.
1799 elfcpp::Elf_Word processor_specific_flags_;
a0351a69
DK
1800 // Object attributes if there is an .ARM.attributes section or NULL.
1801 Attributes_section_data* attributes_section_data_;
8ffa3667
DK
1802};
1803
e9bbb538
DK
1804// Functor to read reloc addends during stub generation.
1805
1806template<int sh_type, bool big_endian>
1807struct Stub_addend_reader
1808{
1809 // Return the addend for a relocation of a particular type. Depending
1810 // on whether this is a REL or RELA relocation, read the addend from a
1811 // view or from a Reloc object.
1812 elfcpp::Elf_types<32>::Elf_Swxword
1813 operator()(
1814 unsigned int /* r_type */,
1815 const unsigned char* /* view */,
1816 const typename Reloc_types<sh_type,
ebd95253 1817 32, big_endian>::Reloc& /* reloc */) const;
e9bbb538
DK
1818};
1819
1820// Specialized Stub_addend_reader for SHT_REL type relocation sections.
1821
1822template<bool big_endian>
1823struct Stub_addend_reader<elfcpp::SHT_REL, big_endian>
1824{
1825 elfcpp::Elf_types<32>::Elf_Swxword
1826 operator()(
1827 unsigned int,
1828 const unsigned char*,
1829 const typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc&) const;
1830};
1831
1832// Specialized Stub_addend_reader for RELA type relocation sections.
1833// We currently do not handle RELA type relocation sections but it is trivial
1834// to implement the addend reader. This is provided for completeness and to
1835// make it easier to add support for RELA relocation sections in the future.
1836
1837template<bool big_endian>
1838struct Stub_addend_reader<elfcpp::SHT_RELA, big_endian>
1839{
1840 elfcpp::Elf_types<32>::Elf_Swxword
1841 operator()(
1842 unsigned int,
1843 const unsigned char*,
1844 const typename Reloc_types<elfcpp::SHT_RELA, 32,
ebd95253
DK
1845 big_endian>::Reloc& reloc) const
1846 { return reloc.get_r_addend(); }
e9bbb538
DK
1847};
1848
a120bc7f
DK
1849// Cortex_a8_reloc class. We keep record of relocation that may need
1850// the Cortex-A8 erratum workaround.
1851
1852class Cortex_a8_reloc
1853{
1854 public:
1855 Cortex_a8_reloc(Reloc_stub* reloc_stub, unsigned r_type,
1856 Arm_address destination)
1857 : reloc_stub_(reloc_stub), r_type_(r_type), destination_(destination)
1858 { }
1859
1860 ~Cortex_a8_reloc()
1861 { }
1862
1863 // Accessors: This is a read-only class.
1864
1865 // Return the relocation stub associated with this relocation if there is
1866 // one.
1867 const Reloc_stub*
1868 reloc_stub() const
1869 { return this->reloc_stub_; }
1870
1871 // Return the relocation type.
1872 unsigned int
1873 r_type() const
1874 { return this->r_type_; }
1875
1876 // Return the destination address of the relocation. LSB stores the THUMB
1877 // bit.
1878 Arm_address
1879 destination() const
1880 { return this->destination_; }
1881
1882 private:
1883 // Associated relocation stub if there is one, or NULL.
1884 const Reloc_stub* reloc_stub_;
1885 // Relocation type.
1886 unsigned int r_type_;
1887 // Destination address of this relocation. LSB is used to distinguish
1888 // ARM/THUMB mode.
1889 Arm_address destination_;
1890};
1891
4a54abbb
DK
1892// Arm_output_data_got class. We derive this from Output_data_got to add
1893// extra methods to handle TLS relocations in a static link.
1894
1895template<bool big_endian>
1896class Arm_output_data_got : public Output_data_got<32, big_endian>
1897{
1898 public:
1899 Arm_output_data_got(Symbol_table* symtab, Layout* layout)
1900 : Output_data_got<32, big_endian>(), symbol_table_(symtab), layout_(layout)
1901 { }
1902
1903 // Add a static entry for the GOT entry at OFFSET. GSYM is a global
1904 // symbol and R_TYPE is the code of a dynamic relocation that needs to be
1905 // applied in a static link.
1906 void
1907 add_static_reloc(unsigned int got_offset, unsigned int r_type, Symbol* gsym)
1908 { this->static_relocs_.push_back(Static_reloc(got_offset, r_type, gsym)); }
1909
1910 // Add a static reloc for the GOT entry at OFFSET. RELOBJ is an object
1911 // defining a local symbol with INDEX. R_TYPE is the code of a dynamic
1912 // relocation that needs to be applied in a static link.
1913 void
1914 add_static_reloc(unsigned int got_offset, unsigned int r_type,
1915 Sized_relobj<32, big_endian>* relobj, unsigned int index)
1916 {
1917 this->static_relocs_.push_back(Static_reloc(got_offset, r_type, relobj,
1918 index));
1919 }
1920
1921 // Add a GOT pair for R_ARM_TLS_GD32. The creates a pair of GOT entries.
1922 // The first one is initialized to be 1, which is the module index for
1923 // the main executable and the second one 0. A reloc of the type
1924 // R_ARM_TLS_DTPOFF32 will be created for the second GOT entry and will
1925 // be applied by gold. GSYM is a global symbol.
1926 void
1927 add_tls_gd32_with_static_reloc(unsigned int got_type, Symbol* gsym);
1928
1929 // Same as the above but for a local symbol in OBJECT with INDEX.
1930 void
1931 add_tls_gd32_with_static_reloc(unsigned int got_type,
1932 Sized_relobj<32, big_endian>* object,
1933 unsigned int index);
1934
1935 protected:
1936 // Write out the GOT table.
1937 void
1938 do_write(Output_file*);
1939
1940 private:
1941 // This class represent dynamic relocations that need to be applied by
1942 // gold because we are using TLS relocations in a static link.
1943 class Static_reloc
1944 {
1945 public:
1946 Static_reloc(unsigned int got_offset, unsigned int r_type, Symbol* gsym)
1947 : got_offset_(got_offset), r_type_(r_type), symbol_is_global_(true)
1948 { this->u_.global.symbol = gsym; }
1949
1950 Static_reloc(unsigned int got_offset, unsigned int r_type,
1951 Sized_relobj<32, big_endian>* relobj, unsigned int index)
1952 : got_offset_(got_offset), r_type_(r_type), symbol_is_global_(false)
1953 {
1954 this->u_.local.relobj = relobj;
1955 this->u_.local.index = index;
1956 }
1957
1958 // Return the GOT offset.
1959 unsigned int
1960 got_offset() const
1961 { return this->got_offset_; }
1962
1963 // Relocation type.
1964 unsigned int
1965 r_type() const
1966 { return this->r_type_; }
1967
1968 // Whether the symbol is global or not.
1969 bool
1970 symbol_is_global() const
1971 { return this->symbol_is_global_; }
1972
1973 // For a relocation against a global symbol, the global symbol.
1974 Symbol*
1975 symbol() const
1976 {
1977 gold_assert(this->symbol_is_global_);
1978 return this->u_.global.symbol;
1979 }
1980
1981 // For a relocation against a local symbol, the defining object.
1982 Sized_relobj<32, big_endian>*
1983 relobj() const
1984 {
1985 gold_assert(!this->symbol_is_global_);
1986 return this->u_.local.relobj;
1987 }
1988
1989 // For a relocation against a local symbol, the local symbol index.
1990 unsigned int
1991 index() const
1992 {
1993 gold_assert(!this->symbol_is_global_);
1994 return this->u_.local.index;
1995 }
1996
1997 private:
1998 // GOT offset of the entry to which this relocation is applied.
1999 unsigned int got_offset_;
2000 // Type of relocation.
2001 unsigned int r_type_;
2002 // Whether this relocation is against a global symbol.
2003 bool symbol_is_global_;
2004 // A global or local symbol.
2005 union
2006 {
2007 struct
2008 {
2009 // For a global symbol, the symbol itself.
2010 Symbol* symbol;
2011 } global;
2012 struct
2013 {
2014 // For a local symbol, the object defining object.
2015 Sized_relobj<32, big_endian>* relobj;
2016 // For a local symbol, the symbol index.
2017 unsigned int index;
2018 } local;
2019 } u_;
2020 };
2021
2022 // Symbol table of the output object.
2023 Symbol_table* symbol_table_;
2024 // Layout of the output object.
2025 Layout* layout_;
2026 // Static relocs to be applied to the GOT.
2027 std::vector<Static_reloc> static_relocs_;
2028};
2029
9b547ce6 2030// The ARM target has many relocation types with odd-sizes or noncontiguous
5c388529
DK
2031// bits. The default handling of relocatable relocation cannot process these
2032// relocations. So we have to extend the default code.
2033
2034template<bool big_endian, int sh_type, typename Classify_reloc>
2035class Arm_scan_relocatable_relocs :
2036 public Default_scan_relocatable_relocs<sh_type, Classify_reloc>
2037{
2038 public:
2039 // Return the strategy to use for a local symbol which is a section
2040 // symbol, given the relocation type.
2041 inline Relocatable_relocs::Reloc_strategy
2042 local_section_strategy(unsigned int r_type, Relobj*)
2043 {
2044 if (sh_type == elfcpp::SHT_RELA)
2045 return Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_RELA;
2046 else
2047 {
2048 if (r_type == elfcpp::R_ARM_TARGET1
2049 || r_type == elfcpp::R_ARM_TARGET2)
2050 {
2051 const Target_arm<big_endian>* arm_target =
2052 Target_arm<big_endian>::default_target();
2053 r_type = arm_target->get_real_reloc_type(r_type);
2054 }
2055
2056 switch(r_type)
2057 {
2058 // Relocations that write nothing. These exclude R_ARM_TARGET1
2059 // and R_ARM_TARGET2.
2060 case elfcpp::R_ARM_NONE:
2061 case elfcpp::R_ARM_V4BX:
2062 case elfcpp::R_ARM_TLS_GOTDESC:
2063 case elfcpp::R_ARM_TLS_CALL:
2064 case elfcpp::R_ARM_TLS_DESCSEQ:
2065 case elfcpp::R_ARM_THM_TLS_CALL:
2066 case elfcpp::R_ARM_GOTRELAX:
2067 case elfcpp::R_ARM_GNU_VTENTRY:
2068 case elfcpp::R_ARM_GNU_VTINHERIT:
2069 case elfcpp::R_ARM_THM_TLS_DESCSEQ16:
2070 case elfcpp::R_ARM_THM_TLS_DESCSEQ32:
2071 return Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_0;
2072 // These should have been converted to something else above.
2073 case elfcpp::R_ARM_TARGET1:
2074 case elfcpp::R_ARM_TARGET2:
2075 gold_unreachable();
2076 // Relocations that write full 32 bits.
2077 case elfcpp::R_ARM_ABS32:
2078 case elfcpp::R_ARM_REL32:
2079 case elfcpp::R_ARM_SBREL32:
2080 case elfcpp::R_ARM_GOTOFF32:
2081 case elfcpp::R_ARM_BASE_PREL:
2082 case elfcpp::R_ARM_GOT_BREL:
2083 case elfcpp::R_ARM_BASE_ABS:
2084 case elfcpp::R_ARM_ABS32_NOI:
2085 case elfcpp::R_ARM_REL32_NOI:
2086 case elfcpp::R_ARM_PLT32_ABS:
2087 case elfcpp::R_ARM_GOT_ABS:
2088 case elfcpp::R_ARM_GOT_PREL:
2089 case elfcpp::R_ARM_TLS_GD32:
2090 case elfcpp::R_ARM_TLS_LDM32:
2091 case elfcpp::R_ARM_TLS_LDO32:
2092 case elfcpp::R_ARM_TLS_IE32:
2093 case elfcpp::R_ARM_TLS_LE32:
2094 return Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_4;
2095 default:
2096 // For all other static relocations, return RELOC_SPECIAL.
2097 return Relocatable_relocs::RELOC_SPECIAL;
2098 }
2099 }
2100 }
2101};
2102
c121c671
DK
2103// Utilities for manipulating integers of up to 32-bits
2104
2105namespace utils
2106{
2107 // Sign extend an n-bit unsigned integer stored in an uint32_t into
2108 // an int32_t. NO_BITS must be between 1 to 32.
2109 template<int no_bits>
2110 static inline int32_t
2111 sign_extend(uint32_t bits)
2112 {
96d49306 2113 gold_assert(no_bits >= 0 && no_bits <= 32);
c121c671
DK
2114 if (no_bits == 32)
2115 return static_cast<int32_t>(bits);
2116 uint32_t mask = (~((uint32_t) 0)) >> (32 - no_bits);
2117 bits &= mask;
2118 uint32_t top_bit = 1U << (no_bits - 1);
2119 int32_t as_signed = static_cast<int32_t>(bits);
2120 return (bits & top_bit) ? as_signed + (-top_bit * 2) : as_signed;
2121 }
2122
2123 // Detects overflow of an NO_BITS integer stored in a uint32_t.
2124 template<int no_bits>
2125 static inline bool
2126 has_overflow(uint32_t bits)
2127 {
96d49306 2128 gold_assert(no_bits >= 0 && no_bits <= 32);
c121c671
DK
2129 if (no_bits == 32)
2130 return false;
2131 int32_t max = (1 << (no_bits - 1)) - 1;
2132 int32_t min = -(1 << (no_bits - 1));
2133 int32_t as_signed = static_cast<int32_t>(bits);
2134 return as_signed > max || as_signed < min;
2135 }
2136
5e445df6
ILT
2137 // Detects overflow of an NO_BITS integer stored in a uint32_t when it
2138 // fits in the given number of bits as either a signed or unsigned value.
2139 // For example, has_signed_unsigned_overflow<8> would check
2140 // -128 <= bits <= 255
2141 template<int no_bits>
2142 static inline bool
2143 has_signed_unsigned_overflow(uint32_t bits)
2144 {
2145 gold_assert(no_bits >= 2 && no_bits <= 32);
2146 if (no_bits == 32)
2147 return false;
2148 int32_t max = static_cast<int32_t>((1U << no_bits) - 1);
2149 int32_t min = -(1 << (no_bits - 1));
2150 int32_t as_signed = static_cast<int32_t>(bits);
2151 return as_signed > max || as_signed < min;
2152 }
2153
c121c671
DK
2154 // Select bits from A and B using bits in MASK. For each n in [0..31],
2155 // the n-th bit in the result is chosen from the n-th bits of A and B.
2156 // A zero selects A and a one selects B.
2157 static inline uint32_t
2158 bit_select(uint32_t a, uint32_t b, uint32_t mask)
2159 { return (a & ~mask) | (b & mask); }
2160};
2161
4a657b0d
DK
2162template<bool big_endian>
2163class Target_arm : public Sized_target<32, big_endian>
2164{
2165 public:
2166 typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, big_endian>
2167 Reloc_section;
2168
2daedcd6
DK
2169 // When were are relocating a stub, we pass this as the relocation number.
2170 static const size_t fake_relnum_for_stubs = static_cast<size_t>(-1);
2171
a6d1ef57
DK
2172 Target_arm()
2173 : Sized_target<32, big_endian>(&arm_info),
2174 got_(NULL), plt_(NULL), got_plt_(NULL), rel_dyn_(NULL),
f96accdf
DK
2175 copy_relocs_(elfcpp::R_ARM_COPY), dynbss_(NULL),
2176 got_mod_index_offset_(-1U), tls_base_symbol_defined_(false),
2177 stub_tables_(), stub_factory_(Stub_factory::get_instance()),
2178 may_use_blx_(false), should_force_pic_veneer_(false),
2179 arm_input_section_map_(), attributes_section_data_(NULL),
2180 fix_cortex_a8_(false), cortex_a8_relocs_info_()
a6d1ef57 2181 { }
4a657b0d 2182
8a75a161
DK
2183 // Virtual function which is set to return true by a target if
2184 // it can use relocation types to determine if a function's
2185 // pointer is taken.
2186 virtual bool
2187 can_check_for_function_pointers() const
2188 { return true; }
2189
2190 // Whether a section called SECTION_NAME may have function pointers to
2191 // sections not eligible for safe ICF folding.
2192 virtual bool
2193 section_may_have_icf_unsafe_pointers(const char* section_name) const
2194 {
2195 return (!is_prefix_of(".ARM.exidx", section_name)
2196 && !is_prefix_of(".ARM.extab", section_name)
2197 && Target::section_may_have_icf_unsafe_pointers(section_name));
2198 }
2199
b569affa
DK
2200 // Whether we can use BLX.
2201 bool
2202 may_use_blx() const
2203 { return this->may_use_blx_; }
2204
2205 // Set use-BLX flag.
2206 void
2207 set_may_use_blx(bool value)
2208 { this->may_use_blx_ = value; }
2209
2210 // Whether we force PCI branch veneers.
2211 bool
2212 should_force_pic_veneer() const
2213 { return this->should_force_pic_veneer_; }
2214
2215 // Set PIC veneer flag.
2216 void
2217 set_should_force_pic_veneer(bool value)
2218 { this->should_force_pic_veneer_ = value; }
2219
2220 // Whether we use THUMB-2 instructions.
2221 bool
2222 using_thumb2() const
2223 {
a0351a69
DK
2224 Object_attribute* attr =
2225 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2226 int arch = attr->int_value();
2227 return arch == elfcpp::TAG_CPU_ARCH_V6T2 || arch >= elfcpp::TAG_CPU_ARCH_V7;
b569affa
DK
2228 }
2229
2230 // Whether we use THUMB/THUMB-2 instructions only.
2231 bool
2232 using_thumb_only() const
2233 {
a0351a69
DK
2234 Object_attribute* attr =
2235 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
323c532f
DK
2236
2237 if (attr->int_value() == elfcpp::TAG_CPU_ARCH_V6_M
2238 || attr->int_value() == elfcpp::TAG_CPU_ARCH_V6S_M)
2239 return true;
a0351a69
DK
2240 if (attr->int_value() != elfcpp::TAG_CPU_ARCH_V7
2241 && attr->int_value() != elfcpp::TAG_CPU_ARCH_V7E_M)
2242 return false;
2243 attr = this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch_profile);
2244 return attr->int_value() == 'M';
b569affa
DK
2245 }
2246
d204b6e9
DK
2247 // Whether we have an NOP instruction. If not, use mov r0, r0 instead.
2248 bool
2249 may_use_arm_nop() const
2250 {
a0351a69
DK
2251 Object_attribute* attr =
2252 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2253 int arch = attr->int_value();
2254 return (arch == elfcpp::TAG_CPU_ARCH_V6T2
2255 || arch == elfcpp::TAG_CPU_ARCH_V6K
2256 || arch == elfcpp::TAG_CPU_ARCH_V7
2257 || arch == elfcpp::TAG_CPU_ARCH_V7E_M);
d204b6e9
DK
2258 }
2259
51938283
DK
2260 // Whether we have THUMB-2 NOP.W instruction.
2261 bool
2262 may_use_thumb2_nop() const
2263 {
a0351a69
DK
2264 Object_attribute* attr =
2265 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2266 int arch = attr->int_value();
2267 return (arch == elfcpp::TAG_CPU_ARCH_V6T2
2268 || arch == elfcpp::TAG_CPU_ARCH_V7
2269 || arch == elfcpp::TAG_CPU_ARCH_V7E_M);
51938283
DK
2270 }
2271
4a657b0d
DK
2272 // Process the relocations to determine unreferenced sections for
2273 // garbage collection.
2274 void
ad0f2072 2275 gc_process_relocs(Symbol_table* symtab,
4a657b0d
DK
2276 Layout* layout,
2277 Sized_relobj<32, big_endian>* object,
2278 unsigned int data_shndx,
2279 unsigned int sh_type,
2280 const unsigned char* prelocs,
2281 size_t reloc_count,
2282 Output_section* output_section,
2283 bool needs_special_offset_handling,
2284 size_t local_symbol_count,
2285 const unsigned char* plocal_symbols);
2286
2287 // Scan the relocations to look for symbol adjustments.
2288 void
ad0f2072 2289 scan_relocs(Symbol_table* symtab,
4a657b0d
DK
2290 Layout* layout,
2291 Sized_relobj<32, big_endian>* object,
2292 unsigned int data_shndx,
2293 unsigned int sh_type,
2294 const unsigned char* prelocs,
2295 size_t reloc_count,
2296 Output_section* output_section,
2297 bool needs_special_offset_handling,
2298 size_t local_symbol_count,
2299 const unsigned char* plocal_symbols);
2300
2301 // Finalize the sections.
2302 void
f59f41f3 2303 do_finalize_sections(Layout*, const Input_objects*, Symbol_table*);
4a657b0d 2304
94cdfcff 2305 // Return the value to use for a dynamic symbol which requires special
4a657b0d
DK
2306 // treatment.
2307 uint64_t
2308 do_dynsym_value(const Symbol*) const;
2309
2310 // Relocate a section.
2311 void
2312 relocate_section(const Relocate_info<32, big_endian>*,
2313 unsigned int sh_type,
2314 const unsigned char* prelocs,
2315 size_t reloc_count,
2316 Output_section* output_section,
2317 bool needs_special_offset_handling,
2318 unsigned char* view,
ebabffbd 2319 Arm_address view_address,
364c7fa5
ILT
2320 section_size_type view_size,
2321 const Reloc_symbol_changes*);
4a657b0d
DK
2322
2323 // Scan the relocs during a relocatable link.
2324 void
ad0f2072 2325 scan_relocatable_relocs(Symbol_table* symtab,
4a657b0d
DK
2326 Layout* layout,
2327 Sized_relobj<32, big_endian>* object,
2328 unsigned int data_shndx,
2329 unsigned int sh_type,
2330 const unsigned char* prelocs,
2331 size_t reloc_count,
2332 Output_section* output_section,
2333 bool needs_special_offset_handling,
2334 size_t local_symbol_count,
2335 const unsigned char* plocal_symbols,
2336 Relocatable_relocs*);
2337
2338 // Relocate a section during a relocatable link.
2339 void
2340 relocate_for_relocatable(const Relocate_info<32, big_endian>*,
2341 unsigned int sh_type,
2342 const unsigned char* prelocs,
2343 size_t reloc_count,
2344 Output_section* output_section,
2345 off_t offset_in_output_section,
2346 const Relocatable_relocs*,
2347 unsigned char* view,
ebabffbd 2348 Arm_address view_address,
4a657b0d
DK
2349 section_size_type view_size,
2350 unsigned char* reloc_view,
2351 section_size_type reloc_view_size);
2352
5c388529
DK
2353 // Perform target-specific processing in a relocatable link. This is
2354 // only used if we use the relocation strategy RELOC_SPECIAL.
2355 void
2356 relocate_special_relocatable(const Relocate_info<32, big_endian>* relinfo,
2357 unsigned int sh_type,
2358 const unsigned char* preloc_in,
2359 size_t relnum,
2360 Output_section* output_section,
2361 off_t offset_in_output_section,
2362 unsigned char* view,
2363 typename elfcpp::Elf_types<32>::Elf_Addr
2364 view_address,
2365 section_size_type view_size,
2366 unsigned char* preloc_out);
2367
4a657b0d
DK
2368 // Return whether SYM is defined by the ABI.
2369 bool
2370 do_is_defined_by_abi(Symbol* sym) const
2371 { return strcmp(sym->name(), "__tls_get_addr") == 0; }
2372
c8761b9a
DK
2373 // Return whether there is a GOT section.
2374 bool
2375 has_got_section() const
2376 { return this->got_ != NULL; }
2377
94cdfcff
DK
2378 // Return the size of the GOT section.
2379 section_size_type
0e70b911 2380 got_size() const
94cdfcff
DK
2381 {
2382 gold_assert(this->got_ != NULL);
2383 return this->got_->data_size();
2384 }
2385
0e70b911
CC
2386 // Return the number of entries in the GOT.
2387 unsigned int
2388 got_entry_count() const
2389 {
2390 if (!this->has_got_section())
2391 return 0;
2392 return this->got_size() / 4;
2393 }
2394
2395 // Return the number of entries in the PLT.
2396 unsigned int
2397 plt_entry_count() const;
2398
2399 // Return the offset of the first non-reserved PLT entry.
2400 unsigned int
2401 first_plt_entry_offset() const;
2402
2403 // Return the size of each PLT entry.
2404 unsigned int
2405 plt_entry_size() const;
2406
4a657b0d 2407 // Map platform-specific reloc types
a6d1ef57 2408 static unsigned int
ca09d69a 2409 get_real_reloc_type(unsigned int r_type);
4a657b0d 2410
55da9579
DK
2411 //
2412 // Methods to support stub-generations.
2413 //
2414
2415 // Return the stub factory
2416 const Stub_factory&
2417 stub_factory() const
2418 { return this->stub_factory_; }
2419
2420 // Make a new Arm_input_section object.
2421 Arm_input_section<big_endian>*
2422 new_arm_input_section(Relobj*, unsigned int);
2423
2424 // Find the Arm_input_section object corresponding to the SHNDX-th input
2425 // section of RELOBJ.
2426 Arm_input_section<big_endian>*
2ea97941 2427 find_arm_input_section(Relobj* relobj, unsigned int shndx) const;
55da9579
DK
2428
2429 // Make a new Stub_table
2430 Stub_table<big_endian>*
2431 new_stub_table(Arm_input_section<big_endian>*);
2432
eb44217c
DK
2433 // Scan a section for stub generation.
2434 void
2435 scan_section_for_stubs(const Relocate_info<32, big_endian>*, unsigned int,
2436 const unsigned char*, size_t, Output_section*,
2437 bool, const unsigned char*, Arm_address,
2438 section_size_type);
2439
43d12afe
DK
2440 // Relocate a stub.
2441 void
2fb7225c 2442 relocate_stub(Stub*, const Relocate_info<32, big_endian>*,
43d12afe
DK
2443 Output_section*, unsigned char*, Arm_address,
2444 section_size_type);
2445
b569affa 2446 // Get the default ARM target.
43d12afe 2447 static Target_arm<big_endian>*
b569affa
DK
2448 default_target()
2449 {
2450 gold_assert(parameters->target().machine_code() == elfcpp::EM_ARM
2451 && parameters->target().is_big_endian() == big_endian);
43d12afe
DK
2452 return static_cast<Target_arm<big_endian>*>(
2453 parameters->sized_target<32, big_endian>());
b569affa
DK
2454 }
2455
20138696
DK
2456 // Whether NAME belongs to a mapping symbol.
2457 static bool
2458 is_mapping_symbol_name(const char* name)
2459 {
2460 return (name
2461 && name[0] == '$'
2462 && (name[1] == 'a' || name[1] == 't' || name[1] == 'd')
2463 && (name[2] == '\0' || name[2] == '.'));
2464 }
2465
a120bc7f
DK
2466 // Whether we work around the Cortex-A8 erratum.
2467 bool
2468 fix_cortex_a8() const
2469 { return this->fix_cortex_a8_; }
2470
85fdf906
AH
2471 // Whether we merge exidx entries in debuginfo.
2472 bool
2473 merge_exidx_entries() const
2474 { return parameters->options().merge_exidx_entries(); }
2475
a2162063
ILT
2476 // Whether we fix R_ARM_V4BX relocation.
2477 // 0 - do not fix
2478 // 1 - replace with MOV instruction (armv4 target)
2479 // 2 - make interworking veneer (>= armv4t targets only)
9b2fd367 2480 General_options::Fix_v4bx
a2162063 2481 fix_v4bx() const
9b2fd367 2482 { return parameters->options().fix_v4bx(); }
a2162063 2483
44272192
DK
2484 // Scan a span of THUMB code section for Cortex-A8 erratum.
2485 void
2486 scan_span_for_cortex_a8_erratum(Arm_relobj<big_endian>*, unsigned int,
2487 section_size_type, section_size_type,
2488 const unsigned char*, Arm_address);
2489
41263c05
DK
2490 // Apply Cortex-A8 workaround to a branch.
2491 void
2492 apply_cortex_a8_workaround(const Cortex_a8_stub*, Arm_address,
2493 unsigned char*, Arm_address);
2494
d5b40221 2495 protected:
eb44217c
DK
2496 // Make an ELF object.
2497 Object*
2498 do_make_elf_object(const std::string&, Input_file*, off_t,
2499 const elfcpp::Ehdr<32, big_endian>& ehdr);
2500
2501 Object*
2502 do_make_elf_object(const std::string&, Input_file*, off_t,
2503 const elfcpp::Ehdr<32, !big_endian>&)
2504 { gold_unreachable(); }
2505
2506 Object*
2507 do_make_elf_object(const std::string&, Input_file*, off_t,
2508 const elfcpp::Ehdr<64, false>&)
2509 { gold_unreachable(); }
2510
2511 Object*
2512 do_make_elf_object(const std::string&, Input_file*, off_t,
2513 const elfcpp::Ehdr<64, true>&)
2514 { gold_unreachable(); }
2515
2516 // Make an output section.
2517 Output_section*
2518 do_make_output_section(const char* name, elfcpp::Elf_Word type,
2519 elfcpp::Elf_Xword flags)
2520 { return new Arm_output_section<big_endian>(name, type, flags); }
2521
d5b40221
DK
2522 void
2523 do_adjust_elf_header(unsigned char* view, int len) const;
2524
eb44217c
DK
2525 // We only need to generate stubs, and hence perform relaxation if we are
2526 // not doing relocatable linking.
2527 bool
2528 do_may_relax() const
2529 { return !parameters->options().relocatable(); }
2530
2531 bool
f625ae50 2532 do_relax(int, const Input_objects*, Symbol_table*, Layout*, const Task*);
eb44217c 2533
a0351a69
DK
2534 // Determine whether an object attribute tag takes an integer, a
2535 // string or both.
2536 int
2537 do_attribute_arg_type(int tag) const;
2538
2539 // Reorder tags during output.
2540 int
2541 do_attributes_order(int num) const;
2542
0d31c79d
DK
2543 // This is called when the target is selected as the default.
2544 void
2545 do_select_as_default_target()
2546 {
2547 // No locking is required since there should only be one default target.
2548 // We cannot have both the big-endian and little-endian ARM targets
2549 // as the default.
2550 gold_assert(arm_reloc_property_table == NULL);
2551 arm_reloc_property_table = new Arm_reloc_property_table();
2552 }
2553
4a657b0d
DK
2554 private:
2555 // The class which scans relocations.
2556 class Scan
2557 {
2558 public:
2559 Scan()
bec53400 2560 : issued_non_pic_error_(false)
4a657b0d
DK
2561 { }
2562
95a2c8d6
RS
2563 static inline int
2564 get_reference_flags(unsigned int r_type);
2565
4a657b0d 2566 inline void
ad0f2072 2567 local(Symbol_table* symtab, Layout* layout, Target_arm* target,
4a657b0d
DK
2568 Sized_relobj<32, big_endian>* object,
2569 unsigned int data_shndx,
2570 Output_section* output_section,
2571 const elfcpp::Rel<32, big_endian>& reloc, unsigned int r_type,
2572 const elfcpp::Sym<32, big_endian>& lsym);
2573
2574 inline void
ad0f2072 2575 global(Symbol_table* symtab, Layout* layout, Target_arm* target,
4a657b0d
DK
2576 Sized_relobj<32, big_endian>* object,
2577 unsigned int data_shndx,
2578 Output_section* output_section,
2579 const elfcpp::Rel<32, big_endian>& reloc, unsigned int r_type,
2580 Symbol* gsym);
2581
21bb3914
ST
2582 inline bool
2583 local_reloc_may_be_function_pointer(Symbol_table* , Layout* , Target_arm* ,
2584 Sized_relobj<32, big_endian>* ,
2585 unsigned int ,
2586 Output_section* ,
2587 const elfcpp::Rel<32, big_endian>& ,
2588 unsigned int ,
8a75a161 2589 const elfcpp::Sym<32, big_endian>&);
21bb3914
ST
2590
2591 inline bool
2592 global_reloc_may_be_function_pointer(Symbol_table* , Layout* , Target_arm* ,
2593 Sized_relobj<32, big_endian>* ,
2594 unsigned int ,
2595 Output_section* ,
2596 const elfcpp::Rel<32, big_endian>& ,
8a75a161 2597 unsigned int , Symbol*);
21bb3914 2598
4a657b0d
DK
2599 private:
2600 static void
2601 unsupported_reloc_local(Sized_relobj<32, big_endian>*,
2602 unsigned int r_type);
2603
2604 static void
2605 unsupported_reloc_global(Sized_relobj<32, big_endian>*,
2606 unsigned int r_type, Symbol*);
bec53400
DK
2607
2608 void
2609 check_non_pic(Relobj*, unsigned int r_type);
2610
2611 // Almost identical to Symbol::needs_plt_entry except that it also
2612 // handles STT_ARM_TFUNC.
2613 static bool
2614 symbol_needs_plt_entry(const Symbol* sym)
2615 {
2616 // An undefined symbol from an executable does not need a PLT entry.
2617 if (sym->is_undefined() && !parameters->options().shared())
2618 return false;
2619
2620 return (!parameters->doing_static_link()
2621 && (sym->type() == elfcpp::STT_FUNC
2622 || sym->type() == elfcpp::STT_ARM_TFUNC)
2623 && (sym->is_from_dynobj()
2624 || sym->is_undefined()
2625 || sym->is_preemptible()));
2626 }
2627
8a75a161
DK
2628 inline bool
2629 possible_function_pointer_reloc(unsigned int r_type);
2630
bec53400
DK
2631 // Whether we have issued an error about a non-PIC compilation.
2632 bool issued_non_pic_error_;
4a657b0d
DK
2633 };
2634
2635 // The class which implements relocation.
2636 class Relocate
2637 {
2638 public:
2639 Relocate()
2640 { }
2641
2642 ~Relocate()
2643 { }
2644
bec53400
DK
2645 // Return whether the static relocation needs to be applied.
2646 inline bool
2647 should_apply_static_reloc(const Sized_symbol<32>* gsym,
95a2c8d6 2648 unsigned int r_type,
bec53400
DK
2649 bool is_32bit,
2650 Output_section* output_section);
2651
4a657b0d
DK
2652 // Do a relocation. Return false if the caller should not issue
2653 // any warnings about this relocation.
2654 inline bool
2655 relocate(const Relocate_info<32, big_endian>*, Target_arm*,
2656 Output_section*, size_t relnum,
2657 const elfcpp::Rel<32, big_endian>&,
2658 unsigned int r_type, const Sized_symbol<32>*,
2659 const Symbol_value<32>*,
ebabffbd 2660 unsigned char*, Arm_address,
4a657b0d 2661 section_size_type);
c121c671
DK
2662
2663 // Return whether we want to pass flag NON_PIC_REF for this
f4e5969c
DK
2664 // reloc. This means the relocation type accesses a symbol not via
2665 // GOT or PLT.
c121c671 2666 static inline bool
ca09d69a 2667 reloc_is_non_pic(unsigned int r_type)
c121c671
DK
2668 {
2669 switch (r_type)
2670 {
f4e5969c
DK
2671 // These relocation types reference GOT or PLT entries explicitly.
2672 case elfcpp::R_ARM_GOT_BREL:
2673 case elfcpp::R_ARM_GOT_ABS:
2674 case elfcpp::R_ARM_GOT_PREL:
2675 case elfcpp::R_ARM_GOT_BREL12:
2676 case elfcpp::R_ARM_PLT32_ABS:
2677 case elfcpp::R_ARM_TLS_GD32:
2678 case elfcpp::R_ARM_TLS_LDM32:
2679 case elfcpp::R_ARM_TLS_IE32:
2680 case elfcpp::R_ARM_TLS_IE12GP:
2681
2682 // These relocate types may use PLT entries.
c121c671 2683 case elfcpp::R_ARM_CALL:
f4e5969c 2684 case elfcpp::R_ARM_THM_CALL:
c121c671 2685 case elfcpp::R_ARM_JUMP24:
f4e5969c
DK
2686 case elfcpp::R_ARM_THM_JUMP24:
2687 case elfcpp::R_ARM_THM_JUMP19:
2688 case elfcpp::R_ARM_PLT32:
2689 case elfcpp::R_ARM_THM_XPC22:
c3e4ae29
DK
2690 case elfcpp::R_ARM_PREL31:
2691 case elfcpp::R_ARM_SBREL31:
c121c671 2692 return false;
f4e5969c
DK
2693
2694 default:
2695 return true;
c121c671
DK
2696 }
2697 }
f96accdf
DK
2698
2699 private:
2700 // Do a TLS relocation.
2701 inline typename Arm_relocate_functions<big_endian>::Status
2702 relocate_tls(const Relocate_info<32, big_endian>*, Target_arm<big_endian>*,
2703 size_t, const elfcpp::Rel<32, big_endian>&, unsigned int,
2704 const Sized_symbol<32>*, const Symbol_value<32>*,
2705 unsigned char*, elfcpp::Elf_types<32>::Elf_Addr,
2706 section_size_type);
2707
4a657b0d
DK
2708 };
2709
2710 // A class which returns the size required for a relocation type,
2711 // used while scanning relocs during a relocatable link.
2712 class Relocatable_size_for_reloc
2713 {
2714 public:
2715 unsigned int
2716 get_size_for_reloc(unsigned int, Relobj*);
2717 };
2718
f96accdf
DK
2719 // Adjust TLS relocation type based on the options and whether this
2720 // is a local symbol.
2721 static tls::Tls_optimization
2722 optimize_tls_reloc(bool is_final, int r_type);
2723
94cdfcff 2724 // Get the GOT section, creating it if necessary.
4a54abbb 2725 Arm_output_data_got<big_endian>*
94cdfcff
DK
2726 got_section(Symbol_table*, Layout*);
2727
2728 // Get the GOT PLT section.
2729 Output_data_space*
2730 got_plt_section() const
2731 {
2732 gold_assert(this->got_plt_ != NULL);
2733 return this->got_plt_;
2734 }
2735
2736 // Create a PLT entry for a global symbol.
2737 void
2738 make_plt_entry(Symbol_table*, Layout*, Symbol*);
2739
f96accdf
DK
2740 // Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
2741 void
2742 define_tls_base_symbol(Symbol_table*, Layout*);
2743
2744 // Create a GOT entry for the TLS module index.
2745 unsigned int
2746 got_mod_index_entry(Symbol_table* symtab, Layout* layout,
2747 Sized_relobj<32, big_endian>* object);
2748
94cdfcff
DK
2749 // Get the PLT section.
2750 const Output_data_plt_arm<big_endian>*
2751 plt_section() const
2752 {
2753 gold_assert(this->plt_ != NULL);
2754 return this->plt_;
2755 }
2756
2757 // Get the dynamic reloc section, creating it if necessary.
2758 Reloc_section*
2759 rel_dyn_section(Layout*);
2760
f96accdf
DK
2761 // Get the section to use for TLS_DESC relocations.
2762 Reloc_section*
2763 rel_tls_desc_section(Layout*) const;
2764
94cdfcff
DK
2765 // Return true if the symbol may need a COPY relocation.
2766 // References from an executable object to non-function symbols
2767 // defined in a dynamic object may need a COPY relocation.
2768 bool
2769 may_need_copy_reloc(Symbol* gsym)
2770 {
966d4097
DK
2771 return (gsym->type() != elfcpp::STT_ARM_TFUNC
2772 && gsym->may_need_copy_reloc());
94cdfcff
DK
2773 }
2774
2775 // Add a potential copy relocation.
2776 void
2777 copy_reloc(Symbol_table* symtab, Layout* layout,
2778 Sized_relobj<32, big_endian>* object,
2ea97941 2779 unsigned int shndx, Output_section* output_section,
94cdfcff
DK
2780 Symbol* sym, const elfcpp::Rel<32, big_endian>& reloc)
2781 {
2782 this->copy_relocs_.copy_reloc(symtab, layout,
2783 symtab->get_sized_symbol<32>(sym),
2ea97941 2784 object, shndx, output_section, reloc,
94cdfcff
DK
2785 this->rel_dyn_section(layout));
2786 }
2787
d5b40221
DK
2788 // Whether two EABI versions are compatible.
2789 static bool
2790 are_eabi_versions_compatible(elfcpp::Elf_Word v1, elfcpp::Elf_Word v2);
2791
2792 // Merge processor-specific flags from input object and those in the ELF
2793 // header of the output.
2794 void
2795 merge_processor_specific_flags(const std::string&, elfcpp::Elf_Word);
2796
a0351a69
DK
2797 // Get the secondary compatible architecture.
2798 static int
2799 get_secondary_compatible_arch(const Attributes_section_data*);
2800
2801 // Set the secondary compatible architecture.
2802 static void
2803 set_secondary_compatible_arch(Attributes_section_data*, int);
2804
2805 static int
2806 tag_cpu_arch_combine(const char*, int, int*, int, int);
2807
2808 // Helper to print AEABI enum tag value.
2809 static std::string
2810 aeabi_enum_name(unsigned int);
2811
2812 // Return string value for TAG_CPU_name.
2813 static std::string
2814 tag_cpu_name_value(unsigned int);
2815
2816 // Merge object attributes from input object and those in the output.
2817 void
2818 merge_object_attributes(const char*, const Attributes_section_data*);
2819
2820 // Helper to get an AEABI object attribute
2821 Object_attribute*
2822 get_aeabi_object_attribute(int tag) const
2823 {
2824 Attributes_section_data* pasd = this->attributes_section_data_;
2825 gold_assert(pasd != NULL);
2826 Object_attribute* attr =
2827 pasd->get_attribute(Object_attribute::OBJ_ATTR_PROC, tag);
2828 gold_assert(attr != NULL);
2829 return attr;
2830 }
2831
eb44217c
DK
2832 //
2833 // Methods to support stub-generations.
2834 //
d5b40221 2835
eb44217c
DK
2836 // Group input sections for stub generation.
2837 void
f625ae50 2838 group_sections(Layout*, section_size_type, bool, const Task*);
d5b40221 2839
eb44217c
DK
2840 // Scan a relocation for stub generation.
2841 void
2842 scan_reloc_for_stub(const Relocate_info<32, big_endian>*, unsigned int,
2843 const Sized_symbol<32>*, unsigned int,
2844 const Symbol_value<32>*,
2845 elfcpp::Elf_types<32>::Elf_Swxword, Arm_address);
d5b40221 2846
eb44217c
DK
2847 // Scan a relocation section for stub.
2848 template<int sh_type>
2849 void
2850 scan_reloc_section_for_stubs(
2851 const Relocate_info<32, big_endian>* relinfo,
2852 const unsigned char* prelocs,
2853 size_t reloc_count,
2854 Output_section* output_section,
2855 bool needs_special_offset_handling,
2856 const unsigned char* view,
2857 elfcpp::Elf_types<32>::Elf_Addr view_address,
2858 section_size_type);
d5b40221 2859
2b328d4e
DK
2860 // Fix .ARM.exidx section coverage.
2861 void
131687b4 2862 fix_exidx_coverage(Layout*, const Input_objects*,
f625ae50
DK
2863 Arm_output_section<big_endian>*, Symbol_table*,
2864 const Task*);
2b328d4e
DK
2865
2866 // Functors for STL set.
2867 struct output_section_address_less_than
2868 {
2869 bool
2870 operator()(const Output_section* s1, const Output_section* s2) const
2871 { return s1->address() < s2->address(); }
2872 };
2873
4a657b0d
DK
2874 // Information about this specific target which we pass to the
2875 // general Target structure.
2876 static const Target::Target_info arm_info;
94cdfcff
DK
2877
2878 // The types of GOT entries needed for this platform.
0e70b911
CC
2879 // These values are exposed to the ABI in an incremental link.
2880 // Do not renumber existing values without changing the version
2881 // number of the .gnu_incremental_inputs section.
94cdfcff
DK
2882 enum Got_type
2883 {
f96accdf
DK
2884 GOT_TYPE_STANDARD = 0, // GOT entry for a regular symbol
2885 GOT_TYPE_TLS_NOFFSET = 1, // GOT entry for negative TLS offset
2886 GOT_TYPE_TLS_OFFSET = 2, // GOT entry for positive TLS offset
2887 GOT_TYPE_TLS_PAIR = 3, // GOT entry for TLS module/offset pair
2888 GOT_TYPE_TLS_DESC = 4 // GOT entry for TLS_DESC pair
94cdfcff
DK
2889 };
2890
55da9579
DK
2891 typedef typename std::vector<Stub_table<big_endian>*> Stub_table_list;
2892
2893 // Map input section to Arm_input_section.
5ac169d4 2894 typedef Unordered_map<Section_id,
55da9579 2895 Arm_input_section<big_endian>*,
5ac169d4 2896 Section_id_hash>
55da9579
DK
2897 Arm_input_section_map;
2898
a120bc7f
DK
2899 // Map output addresses to relocs for Cortex-A8 erratum.
2900 typedef Unordered_map<Arm_address, const Cortex_a8_reloc*>
2901 Cortex_a8_relocs_info;
2902
94cdfcff 2903 // The GOT section.
4a54abbb 2904 Arm_output_data_got<big_endian>* got_;
94cdfcff
DK
2905 // The PLT section.
2906 Output_data_plt_arm<big_endian>* plt_;
2907 // The GOT PLT section.
2908 Output_data_space* got_plt_;
2909 // The dynamic reloc section.
2910 Reloc_section* rel_dyn_;
2911 // Relocs saved to avoid a COPY reloc.
2912 Copy_relocs<elfcpp::SHT_REL, 32, big_endian> copy_relocs_;
2913 // Space for variables copied with a COPY reloc.
2914 Output_data_space* dynbss_;
f96accdf
DK
2915 // Offset of the GOT entry for the TLS module index.
2916 unsigned int got_mod_index_offset_;
2917 // True if the _TLS_MODULE_BASE_ symbol has been defined.
2918 bool tls_base_symbol_defined_;
55da9579
DK
2919 // Vector of Stub_tables created.
2920 Stub_table_list stub_tables_;
2921 // Stub factory.
2922 const Stub_factory &stub_factory_;
b569affa
DK
2923 // Whether we can use BLX.
2924 bool may_use_blx_;
2925 // Whether we force PIC branch veneers.
2926 bool should_force_pic_veneer_;
eb44217c
DK
2927 // Map for locating Arm_input_sections.
2928 Arm_input_section_map arm_input_section_map_;
a0351a69
DK
2929 // Attributes section data in output.
2930 Attributes_section_data* attributes_section_data_;
a120bc7f
DK
2931 // Whether we want to fix code for Cortex-A8 erratum.
2932 bool fix_cortex_a8_;
2933 // Map addresses to relocs for Cortex-A8 erratum.
2934 Cortex_a8_relocs_info cortex_a8_relocs_info_;
4a657b0d
DK
2935};
2936
2937template<bool big_endian>
2938const Target::Target_info Target_arm<big_endian>::arm_info =
2939{
2940 32, // size
2941 big_endian, // is_big_endian
2942 elfcpp::EM_ARM, // machine_code
2943 false, // has_make_symbol
2944 false, // has_resolve
2945 false, // has_code_fill
2946 true, // is_default_stack_executable
2947 '\0', // wrap_char
2948 "/usr/lib/libc.so.1", // dynamic_linker
2949 0x8000, // default_text_segment_address
2950 0x1000, // abi_pagesize (overridable by -z max-page-size)
8a5e3e08
ILT
2951 0x1000, // common_pagesize (overridable by -z common-page-size)
2952 elfcpp::SHN_UNDEF, // small_common_shndx
2953 elfcpp::SHN_UNDEF, // large_common_shndx
2954 0, // small_common_section_flags
05a352e6
DK
2955 0, // large_common_section_flags
2956 ".ARM.attributes", // attributes_section
2957 "aeabi" // attributes_vendor
4a657b0d
DK
2958};
2959
c121c671
DK
2960// Arm relocate functions class
2961//
2962
2963template<bool big_endian>
2964class Arm_relocate_functions : public Relocate_functions<32, big_endian>
2965{
2966 public:
2967 typedef enum
2968 {
2969 STATUS_OKAY, // No error during relocation.
9b547ce6 2970 STATUS_OVERFLOW, // Relocation overflow.
c121c671
DK
2971 STATUS_BAD_RELOC // Relocation cannot be applied.
2972 } Status;
2973
2974 private:
2975 typedef Relocate_functions<32, big_endian> Base;
2976 typedef Arm_relocate_functions<big_endian> This;
2977
fd3c5f0b
ILT
2978 // Encoding of imm16 argument for movt and movw ARM instructions
2979 // from ARM ARM:
2980 //
2981 // imm16 := imm4 | imm12
2982 //
2983 // f e d c b a 9 8 7 6 5 4 3 2 1 0 f e d c b a 9 8 7 6 5 4 3 2 1 0
2984 // +-------+---------------+-------+-------+-----------------------+
2985 // | | |imm4 | |imm12 |
2986 // +-------+---------------+-------+-------+-----------------------+
2987
2988 // Extract the relocation addend from VAL based on the ARM
2989 // instruction encoding described above.
2990 static inline typename elfcpp::Swap<32, big_endian>::Valtype
2991 extract_arm_movw_movt_addend(
2992 typename elfcpp::Swap<32, big_endian>::Valtype val)
2993 {
2994 // According to the Elf ABI for ARM Architecture the immediate
2995 // field is sign-extended to form the addend.
2996 return utils::sign_extend<16>(((val >> 4) & 0xf000) | (val & 0xfff));
2997 }
2998
2999 // Insert X into VAL based on the ARM instruction encoding described
3000 // above.
3001 static inline typename elfcpp::Swap<32, big_endian>::Valtype
3002 insert_val_arm_movw_movt(
3003 typename elfcpp::Swap<32, big_endian>::Valtype val,
3004 typename elfcpp::Swap<32, big_endian>::Valtype x)
3005 {
3006 val &= 0xfff0f000;
3007 val |= x & 0x0fff;
3008 val |= (x & 0xf000) << 4;
3009 return val;
3010 }
3011
3012 // Encoding of imm16 argument for movt and movw Thumb2 instructions
3013 // from ARM ARM:
3014 //
3015 // imm16 := imm4 | i | imm3 | imm8
3016 //
3017 // f e d c b a 9 8 7 6 5 4 3 2 1 0 f e d c b a 9 8 7 6 5 4 3 2 1 0
3018 // +---------+-+-----------+-------++-+-----+-------+---------------+
3019 // | |i| |imm4 || |imm3 | |imm8 |
3020 // +---------+-+-----------+-------++-+-----+-------+---------------+
3021
3022 // Extract the relocation addend from VAL based on the Thumb2
3023 // instruction encoding described above.
3024 static inline typename elfcpp::Swap<32, big_endian>::Valtype
3025 extract_thumb_movw_movt_addend(
3026 typename elfcpp::Swap<32, big_endian>::Valtype val)
3027 {
3028 // According to the Elf ABI for ARM Architecture the immediate
3029 // field is sign-extended to form the addend.
3030 return utils::sign_extend<16>(((val >> 4) & 0xf000)
3031 | ((val >> 15) & 0x0800)
3032 | ((val >> 4) & 0x0700)
3033 | (val & 0x00ff));
3034 }
3035
3036 // Insert X into VAL based on the Thumb2 instruction encoding
3037 // described above.
3038 static inline typename elfcpp::Swap<32, big_endian>::Valtype
3039 insert_val_thumb_movw_movt(
3040 typename elfcpp::Swap<32, big_endian>::Valtype val,
3041 typename elfcpp::Swap<32, big_endian>::Valtype x)
3042 {
3043 val &= 0xfbf08f00;
3044 val |= (x & 0xf000) << 4;
3045 val |= (x & 0x0800) << 15;
3046 val |= (x & 0x0700) << 4;
3047 val |= (x & 0x00ff);
3048 return val;
3049 }
3050
b10d2873
ILT
3051 // Calculate the smallest constant Kn for the specified residual.
3052 // (see (AAELF 4.6.1.4 Static ARM relocations, Group Relocations, p.32)
3053 static uint32_t
3054 calc_grp_kn(typename elfcpp::Swap<32, big_endian>::Valtype residual)
3055 {
3056 int32_t msb;
3057
3058 if (residual == 0)
3059 return 0;
3060 // Determine the most significant bit in the residual and
3061 // align the resulting value to a 2-bit boundary.
3062 for (msb = 30; (msb >= 0) && !(residual & (3 << msb)); msb -= 2)
3063 ;
3064 // The desired shift is now (msb - 6), or zero, whichever
3065 // is the greater.
3066 return (((msb - 6) < 0) ? 0 : (msb - 6));
3067 }
3068
3069 // Calculate the final residual for the specified group index.
3070 // If the passed group index is less than zero, the method will return
3071 // the value of the specified residual without any change.
3072 // (see (AAELF 4.6.1.4 Static ARM relocations, Group Relocations, p.32)
3073 static typename elfcpp::Swap<32, big_endian>::Valtype
3074 calc_grp_residual(typename elfcpp::Swap<32, big_endian>::Valtype residual,
3075 const int group)
3076 {
3077 for (int n = 0; n <= group; n++)
3078 {
3079 // Calculate which part of the value to mask.
3080 uint32_t shift = calc_grp_kn(residual);
3081 // Calculate the residual for the next time around.
3082 residual &= ~(residual & (0xff << shift));
3083 }
3084
3085 return residual;
3086 }
3087
3088 // Calculate the value of Gn for the specified group index.
3089 // We return it in the form of an encoded constant-and-rotation.
3090 // (see (AAELF 4.6.1.4 Static ARM relocations, Group Relocations, p.32)
3091 static typename elfcpp::Swap<32, big_endian>::Valtype
3092 calc_grp_gn(typename elfcpp::Swap<32, big_endian>::Valtype residual,
3093 const int group)
3094 {
3095 typename elfcpp::Swap<32, big_endian>::Valtype gn = 0;
3096 uint32_t shift = 0;
3097
3098 for (int n = 0; n <= group; n++)
3099 {
3100 // Calculate which part of the value to mask.
3101 shift = calc_grp_kn(residual);
3102 // Calculate Gn in 32-bit as well as encoded constant-and-rotation form.
3103 gn = residual & (0xff << shift);
3104 // Calculate the residual for the next time around.
3105 residual &= ~gn;
3106 }
3107 // Return Gn in the form of an encoded constant-and-rotation.
3108 return ((gn >> shift) | ((gn <= 0xff ? 0 : (32 - shift) / 2) << 8));
3109 }
3110
1521477a 3111 public:
d204b6e9
DK
3112 // Handle ARM long branches.
3113 static typename This::Status
3114 arm_branch_common(unsigned int, const Relocate_info<32, big_endian>*,
ca09d69a 3115 unsigned char*, const Sized_symbol<32>*,
d204b6e9
DK
3116 const Arm_relobj<big_endian>*, unsigned int,
3117 const Symbol_value<32>*, Arm_address, Arm_address, bool);
c121c671 3118
51938283
DK
3119 // Handle THUMB long branches.
3120 static typename This::Status
3121 thumb_branch_common(unsigned int, const Relocate_info<32, big_endian>*,
ca09d69a 3122 unsigned char*, const Sized_symbol<32>*,
51938283
DK
3123 const Arm_relobj<big_endian>*, unsigned int,
3124 const Symbol_value<32>*, Arm_address, Arm_address, bool);
3125
5e445df6 3126
089d69dc
DK
3127 // Return the branch offset of a 32-bit THUMB branch.
3128 static inline int32_t
3129 thumb32_branch_offset(uint16_t upper_insn, uint16_t lower_insn)
3130 {
3131 // We use the Thumb-2 encoding (backwards compatible with Thumb-1)
3132 // involving the J1 and J2 bits.
3133 uint32_t s = (upper_insn & (1U << 10)) >> 10;
3134 uint32_t upper = upper_insn & 0x3ffU;
3135 uint32_t lower = lower_insn & 0x7ffU;
3136 uint32_t j1 = (lower_insn & (1U << 13)) >> 13;
3137 uint32_t j2 = (lower_insn & (1U << 11)) >> 11;
3138 uint32_t i1 = j1 ^ s ? 0 : 1;
3139 uint32_t i2 = j2 ^ s ? 0 : 1;
3140
3141 return utils::sign_extend<25>((s << 24) | (i1 << 23) | (i2 << 22)
3142 | (upper << 12) | (lower << 1));
3143 }
3144
3145 // Insert OFFSET to a 32-bit THUMB branch and return the upper instruction.
3146 // UPPER_INSN is the original upper instruction of the branch. Caller is
3147 // responsible for overflow checking and BLX offset adjustment.
3148 static inline uint16_t
3149 thumb32_branch_upper(uint16_t upper_insn, int32_t offset)
3150 {
3151 uint32_t s = offset < 0 ? 1 : 0;
3152 uint32_t bits = static_cast<uint32_t>(offset);
3153 return (upper_insn & ~0x7ffU) | ((bits >> 12) & 0x3ffU) | (s << 10);
3154 }
3155
3156 // Insert OFFSET to a 32-bit THUMB branch and return the lower instruction.
3157 // LOWER_INSN is the original lower instruction of the branch. Caller is
3158 // responsible for overflow checking and BLX offset adjustment.
3159 static inline uint16_t
3160 thumb32_branch_lower(uint16_t lower_insn, int32_t offset)
3161 {
3162 uint32_t s = offset < 0 ? 1 : 0;
3163 uint32_t bits = static_cast<uint32_t>(offset);
3164 return ((lower_insn & ~0x2fffU)
3165 | ((((bits >> 23) & 1) ^ !s) << 13)
3166 | ((((bits >> 22) & 1) ^ !s) << 11)
3167 | ((bits >> 1) & 0x7ffU));
3168 }
3169
3170 // Return the branch offset of a 32-bit THUMB conditional branch.
3171 static inline int32_t
3172 thumb32_cond_branch_offset(uint16_t upper_insn, uint16_t lower_insn)
3173 {
3174 uint32_t s = (upper_insn & 0x0400U) >> 10;
3175 uint32_t j1 = (lower_insn & 0x2000U) >> 13;
3176 uint32_t j2 = (lower_insn & 0x0800U) >> 11;
3177 uint32_t lower = (lower_insn & 0x07ffU);
3178 uint32_t upper = (s << 8) | (j2 << 7) | (j1 << 6) | (upper_insn & 0x003fU);
3179
3180 return utils::sign_extend<21>((upper << 12) | (lower << 1));
3181 }
3182
3183 // Insert OFFSET to a 32-bit THUMB conditional branch and return the upper
3184 // instruction. UPPER_INSN is the original upper instruction of the branch.
3185 // Caller is responsible for overflow checking.
3186 static inline uint16_t
3187 thumb32_cond_branch_upper(uint16_t upper_insn, int32_t offset)
3188 {
3189 uint32_t s = offset < 0 ? 1 : 0;
3190 uint32_t bits = static_cast<uint32_t>(offset);
3191 return (upper_insn & 0xfbc0U) | (s << 10) | ((bits & 0x0003f000U) >> 12);
3192 }
3193
3194 // Insert OFFSET to a 32-bit THUMB conditional branch and return the lower
3195 // instruction. LOWER_INSN is the original lower instruction of the branch.
9b547ce6 3196 // The caller is responsible for overflow checking.
089d69dc
DK
3197 static inline uint16_t
3198 thumb32_cond_branch_lower(uint16_t lower_insn, int32_t offset)
3199 {
3200 uint32_t bits = static_cast<uint32_t>(offset);
3201 uint32_t j2 = (bits & 0x00080000U) >> 19;
3202 uint32_t j1 = (bits & 0x00040000U) >> 18;
3203 uint32_t lo = (bits & 0x00000ffeU) >> 1;
3204
3205 return (lower_insn & 0xd000U) | (j1 << 13) | (j2 << 11) | lo;
3206 }
3207
5e445df6
ILT
3208 // R_ARM_ABS8: S + A
3209 static inline typename This::Status
ca09d69a 3210 abs8(unsigned char* view,
5e445df6 3211 const Sized_relobj<32, big_endian>* object,
be8fcb75 3212 const Symbol_value<32>* psymval)
5e445df6
ILT
3213 {
3214 typedef typename elfcpp::Swap<8, big_endian>::Valtype Valtype;
3215 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3216 Valtype* wv = reinterpret_cast<Valtype*>(view);
3217 Valtype val = elfcpp::Swap<8, big_endian>::readval(wv);
3218 Reltype addend = utils::sign_extend<8>(val);
2daedcd6 3219 Reltype x = psymval->value(object, addend);
5e445df6
ILT
3220 val = utils::bit_select(val, x, 0xffU);
3221 elfcpp::Swap<8, big_endian>::writeval(wv, val);
a2c7281b
DK
3222
3223 // R_ARM_ABS8 permits signed or unsigned results.
3224 int signed_x = static_cast<int32_t>(x);
3225 return ((signed_x < -128 || signed_x > 255)
5e445df6
ILT
3226 ? This::STATUS_OVERFLOW
3227 : This::STATUS_OKAY);
3228 }
3229
be8fcb75
ILT
3230 // R_ARM_THM_ABS5: S + A
3231 static inline typename This::Status
ca09d69a 3232 thm_abs5(unsigned char* view,
be8fcb75
ILT
3233 const Sized_relobj<32, big_endian>* object,
3234 const Symbol_value<32>* psymval)
3235 {
3236 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3237 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3238 Valtype* wv = reinterpret_cast<Valtype*>(view);
3239 Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3240 Reltype addend = (val & 0x7e0U) >> 6;
2daedcd6 3241 Reltype x = psymval->value(object, addend);
be8fcb75
ILT
3242 val = utils::bit_select(val, x << 6, 0x7e0U);
3243 elfcpp::Swap<16, big_endian>::writeval(wv, val);
a2c7281b
DK
3244
3245 // R_ARM_ABS16 permits signed or unsigned results.
3246 int signed_x = static_cast<int32_t>(x);
3247 return ((signed_x < -32768 || signed_x > 65535)
be8fcb75
ILT
3248 ? This::STATUS_OVERFLOW
3249 : This::STATUS_OKAY);
3250 }
3251
3252 // R_ARM_ABS12: S + A
3253 static inline typename This::Status
ca09d69a 3254 abs12(unsigned char* view,
51938283
DK
3255 const Sized_relobj<32, big_endian>* object,
3256 const Symbol_value<32>* psymval)
be8fcb75
ILT
3257 {
3258 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3259 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3260 Valtype* wv = reinterpret_cast<Valtype*>(view);
3261 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3262 Reltype addend = val & 0x0fffU;
2daedcd6 3263 Reltype x = psymval->value(object, addend);
be8fcb75
ILT
3264 val = utils::bit_select(val, x, 0x0fffU);
3265 elfcpp::Swap<32, big_endian>::writeval(wv, val);
3266 return (utils::has_overflow<12>(x)
3267 ? This::STATUS_OVERFLOW
3268 : This::STATUS_OKAY);
3269 }
3270
3271 // R_ARM_ABS16: S + A
3272 static inline typename This::Status
ca09d69a 3273 abs16(unsigned char* view,
51938283
DK
3274 const Sized_relobj<32, big_endian>* object,
3275 const Symbol_value<32>* psymval)
be8fcb75
ILT
3276 {
3277 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3278 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3279 Valtype* wv = reinterpret_cast<Valtype*>(view);
3280 Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3281 Reltype addend = utils::sign_extend<16>(val);
2daedcd6 3282 Reltype x = psymval->value(object, addend);
be8fcb75
ILT
3283 val = utils::bit_select(val, x, 0xffffU);
3284 elfcpp::Swap<16, big_endian>::writeval(wv, val);
3285 return (utils::has_signed_unsigned_overflow<16>(x)
3286 ? This::STATUS_OVERFLOW
3287 : This::STATUS_OKAY);
3288 }
3289
c121c671
DK
3290 // R_ARM_ABS32: (S + A) | T
3291 static inline typename This::Status
ca09d69a 3292 abs32(unsigned char* view,
c121c671
DK
3293 const Sized_relobj<32, big_endian>* object,
3294 const Symbol_value<32>* psymval,
2daedcd6 3295 Arm_address thumb_bit)
c121c671
DK
3296 {
3297 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3298 Valtype* wv = reinterpret_cast<Valtype*>(view);
3299 Valtype addend = elfcpp::Swap<32, big_endian>::readval(wv);
2daedcd6 3300 Valtype x = psymval->value(object, addend) | thumb_bit;
c121c671
DK
3301 elfcpp::Swap<32, big_endian>::writeval(wv, x);
3302 return This::STATUS_OKAY;
3303 }
3304
3305 // R_ARM_REL32: (S + A) | T - P
3306 static inline typename This::Status
ca09d69a 3307 rel32(unsigned char* view,
c121c671
DK
3308 const Sized_relobj<32, big_endian>* object,
3309 const Symbol_value<32>* psymval,
ebabffbd 3310 Arm_address address,
2daedcd6 3311 Arm_address thumb_bit)
c121c671
DK
3312 {
3313 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3314 Valtype* wv = reinterpret_cast<Valtype*>(view);
3315 Valtype addend = elfcpp::Swap<32, big_endian>::readval(wv);
2daedcd6 3316 Valtype x = (psymval->value(object, addend) | thumb_bit) - address;
c121c671
DK
3317 elfcpp::Swap<32, big_endian>::writeval(wv, x);
3318 return This::STATUS_OKAY;
3319 }
3320
089d69dc
DK
3321 // R_ARM_THM_JUMP24: (S + A) | T - P
3322 static typename This::Status
ca09d69a 3323 thm_jump19(unsigned char* view, const Arm_relobj<big_endian>* object,
089d69dc
DK
3324 const Symbol_value<32>* psymval, Arm_address address,
3325 Arm_address thumb_bit);
3326
800d0f56
ILT
3327 // R_ARM_THM_JUMP6: S + A – P
3328 static inline typename This::Status
ca09d69a 3329 thm_jump6(unsigned char* view,
800d0f56
ILT
3330 const Sized_relobj<32, big_endian>* object,
3331 const Symbol_value<32>* psymval,
3332 Arm_address address)
3333 {
3334 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3335 typedef typename elfcpp::Swap<16, big_endian>::Valtype Reltype;
3336 Valtype* wv = reinterpret_cast<Valtype*>(view);
3337 Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3338 // bit[9]:bit[7:3]:’0’ (mask: 0x02f8)
3339 Reltype addend = (((val & 0x0200) >> 3) | ((val & 0x00f8) >> 2));
3340 Reltype x = (psymval->value(object, addend) - address);
3341 val = (val & 0xfd07) | ((x & 0x0040) << 3) | ((val & 0x003e) << 2);
3342 elfcpp::Swap<16, big_endian>::writeval(wv, val);
3343 // CZB does only forward jumps.
3344 return ((x > 0x007e)
3345 ? This::STATUS_OVERFLOW
3346 : This::STATUS_OKAY);
3347 }
3348
3349 // R_ARM_THM_JUMP8: S + A – P
3350 static inline typename This::Status
ca09d69a 3351 thm_jump8(unsigned char* view,
800d0f56
ILT
3352 const Sized_relobj<32, big_endian>* object,
3353 const Symbol_value<32>* psymval,
3354 Arm_address address)
3355 {
3356 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3357 typedef typename elfcpp::Swap<16, big_endian>::Valtype Reltype;
3358 Valtype* wv = reinterpret_cast<Valtype*>(view);
3359 Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3360 Reltype addend = utils::sign_extend<8>((val & 0x00ff) << 1);
3361 Reltype x = (psymval->value(object, addend) - address);
3362 elfcpp::Swap<16, big_endian>::writeval(wv, (val & 0xff00) | ((x & 0x01fe) >> 1));
3363 return (utils::has_overflow<8>(x)
3364 ? This::STATUS_OVERFLOW
3365 : This::STATUS_OKAY);
3366 }
3367
3368 // R_ARM_THM_JUMP11: S + A – P
3369 static inline typename This::Status
ca09d69a 3370 thm_jump11(unsigned char* view,
800d0f56
ILT
3371 const Sized_relobj<32, big_endian>* object,
3372 const Symbol_value<32>* psymval,
3373 Arm_address address)
3374 {
3375 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3376 typedef typename elfcpp::Swap<16, big_endian>::Valtype Reltype;
3377 Valtype* wv = reinterpret_cast<Valtype*>(view);
3378 Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3379 Reltype addend = utils::sign_extend<11>((val & 0x07ff) << 1);
3380 Reltype x = (psymval->value(object, addend) - address);
3381 elfcpp::Swap<16, big_endian>::writeval(wv, (val & 0xf800) | ((x & 0x0ffe) >> 1));
3382 return (utils::has_overflow<11>(x)
3383 ? This::STATUS_OVERFLOW
3384 : This::STATUS_OKAY);
3385 }
3386
c121c671
DK
3387 // R_ARM_BASE_PREL: B(S) + A - P
3388 static inline typename This::Status
3389 base_prel(unsigned char* view,
ebabffbd
DK
3390 Arm_address origin,
3391 Arm_address address)
c121c671
DK
3392 {
3393 Base::rel32(view, origin - address);
3394 return STATUS_OKAY;
3395 }
3396
be8fcb75
ILT
3397 // R_ARM_BASE_ABS: B(S) + A
3398 static inline typename This::Status
3399 base_abs(unsigned char* view,
f4e5969c 3400 Arm_address origin)
be8fcb75
ILT
3401 {
3402 Base::rel32(view, origin);
3403 return STATUS_OKAY;
3404 }
3405
c121c671
DK
3406 // R_ARM_GOT_BREL: GOT(S) + A - GOT_ORG
3407 static inline typename This::Status
3408 got_brel(unsigned char* view,
3409 typename elfcpp::Swap<32, big_endian>::Valtype got_offset)
3410 {
3411 Base::rel32(view, got_offset);
3412 return This::STATUS_OKAY;
3413 }
3414
f4e5969c 3415 // R_ARM_GOT_PREL: GOT(S) + A - P
7f5309a5 3416 static inline typename This::Status
ca09d69a 3417 got_prel(unsigned char* view,
f4e5969c 3418 Arm_address got_entry,
ebabffbd 3419 Arm_address address)
7f5309a5 3420 {
f4e5969c 3421 Base::rel32(view, got_entry - address);
7f5309a5
ILT
3422 return This::STATUS_OKAY;
3423 }
3424
c121c671
DK
3425 // R_ARM_PREL: (S + A) | T - P
3426 static inline typename This::Status
ca09d69a 3427 prel31(unsigned char* view,
c121c671
DK
3428 const Sized_relobj<32, big_endian>* object,
3429 const Symbol_value<32>* psymval,
ebabffbd 3430 Arm_address address,
2daedcd6 3431 Arm_address thumb_bit)
c121c671
DK
3432 {
3433 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3434 Valtype* wv = reinterpret_cast<Valtype*>(view);
3435 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3436 Valtype addend = utils::sign_extend<31>(val);
2daedcd6 3437 Valtype x = (psymval->value(object, addend) | thumb_bit) - address;
c121c671
DK
3438 val = utils::bit_select(val, x, 0x7fffffffU);
3439 elfcpp::Swap<32, big_endian>::writeval(wv, val);
3440 return (utils::has_overflow<31>(x) ?
3441 This::STATUS_OVERFLOW : This::STATUS_OKAY);
3442 }
fd3c5f0b 3443
5c57f1be 3444 // R_ARM_MOVW_ABS_NC: (S + A) | T (relative address base is )
c2a122b6 3445 // R_ARM_MOVW_PREL_NC: (S + A) | T - P
5c57f1be
DK
3446 // R_ARM_MOVW_BREL_NC: ((S + A) | T) - B(S)
3447 // R_ARM_MOVW_BREL: ((S + A) | T) - B(S)
02961d7e 3448 static inline typename This::Status
5c57f1be
DK
3449 movw(unsigned char* view,
3450 const Sized_relobj<32, big_endian>* object,
3451 const Symbol_value<32>* psymval,
3452 Arm_address relative_address_base,
3453 Arm_address thumb_bit,
3454 bool check_overflow)
02961d7e
ILT
3455 {
3456 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3457 Valtype* wv = reinterpret_cast<Valtype*>(view);
3458 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3459 Valtype addend = This::extract_arm_movw_movt_addend(val);
5c57f1be
DK
3460 Valtype x = ((psymval->value(object, addend) | thumb_bit)
3461 - relative_address_base);
02961d7e
ILT
3462 val = This::insert_val_arm_movw_movt(val, x);
3463 elfcpp::Swap<32, big_endian>::writeval(wv, val);
5c57f1be
DK
3464 return ((check_overflow && utils::has_overflow<16>(x))
3465 ? This::STATUS_OVERFLOW
3466 : This::STATUS_OKAY);
02961d7e
ILT
3467 }
3468
5c57f1be 3469 // R_ARM_MOVT_ABS: S + A (relative address base is 0)
c2a122b6 3470 // R_ARM_MOVT_PREL: S + A - P
5c57f1be 3471 // R_ARM_MOVT_BREL: S + A - B(S)
c2a122b6 3472 static inline typename This::Status
5c57f1be
DK
3473 movt(unsigned char* view,
3474 const Sized_relobj<32, big_endian>* object,
3475 const Symbol_value<32>* psymval,
3476 Arm_address relative_address_base)
c2a122b6
ILT
3477 {
3478 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3479 Valtype* wv = reinterpret_cast<Valtype*>(view);
3480 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3481 Valtype addend = This::extract_arm_movw_movt_addend(val);
5c57f1be 3482 Valtype x = (psymval->value(object, addend) - relative_address_base) >> 16;
c2a122b6
ILT
3483 val = This::insert_val_arm_movw_movt(val, x);
3484 elfcpp::Swap<32, big_endian>::writeval(wv, val);
5c57f1be 3485 // FIXME: IHI0044D says that we should check for overflow.
c2a122b6
ILT
3486 return This::STATUS_OKAY;
3487 }
3488
5c57f1be 3489 // R_ARM_THM_MOVW_ABS_NC: S + A | T (relative_address_base is 0)
c2a122b6 3490 // R_ARM_THM_MOVW_PREL_NC: (S + A) | T - P
5c57f1be
DK
3491 // R_ARM_THM_MOVW_BREL_NC: ((S + A) | T) - B(S)
3492 // R_ARM_THM_MOVW_BREL: ((S + A) | T) - B(S)
02961d7e 3493 static inline typename This::Status
ca09d69a 3494 thm_movw(unsigned char* view,
5c57f1be
DK
3495 const Sized_relobj<32, big_endian>* object,
3496 const Symbol_value<32>* psymval,
3497 Arm_address relative_address_base,
3498 Arm_address thumb_bit,
3499 bool check_overflow)
02961d7e
ILT
3500 {
3501 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3502 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3503 Valtype* wv = reinterpret_cast<Valtype*>(view);
3504 Reltype val = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3505 | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3506 Reltype addend = This::extract_thumb_movw_movt_addend(val);
5c57f1be
DK
3507 Reltype x =
3508 (psymval->value(object, addend) | thumb_bit) - relative_address_base;
02961d7e
ILT
3509 val = This::insert_val_thumb_movw_movt(val, x);
3510 elfcpp::Swap<16, big_endian>::writeval(wv, val >> 16);
3511 elfcpp::Swap<16, big_endian>::writeval(wv + 1, val & 0xffff);
5c57f1be
DK
3512 return ((check_overflow && utils::has_overflow<16>(x))
3513 ? This::STATUS_OVERFLOW
3514 : This::STATUS_OKAY);
02961d7e
ILT
3515 }
3516
5c57f1be 3517 // R_ARM_THM_MOVT_ABS: S + A (relative address base is 0)
c2a122b6 3518 // R_ARM_THM_MOVT_PREL: S + A - P
5c57f1be 3519 // R_ARM_THM_MOVT_BREL: S + A - B(S)
c2a122b6 3520 static inline typename This::Status
5c57f1be
DK
3521 thm_movt(unsigned char* view,
3522 const Sized_relobj<32, big_endian>* object,
3523 const Symbol_value<32>* psymval,
3524 Arm_address relative_address_base)
c2a122b6
ILT
3525 {
3526 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3527 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3528 Valtype* wv = reinterpret_cast<Valtype*>(view);
3529 Reltype val = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3530 | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3531 Reltype addend = This::extract_thumb_movw_movt_addend(val);
5c57f1be 3532 Reltype x = (psymval->value(object, addend) - relative_address_base) >> 16;
c2a122b6
ILT
3533 val = This::insert_val_thumb_movw_movt(val, x);
3534 elfcpp::Swap<16, big_endian>::writeval(wv, val >> 16);
3535 elfcpp::Swap<16, big_endian>::writeval(wv + 1, val & 0xffff);
3536 return This::STATUS_OKAY;
3537 }
a2162063 3538
11b861d5
DK
3539 // R_ARM_THM_ALU_PREL_11_0: ((S + A) | T) - Pa (Thumb32)
3540 static inline typename This::Status
3541 thm_alu11(unsigned char* view,
3542 const Sized_relobj<32, big_endian>* object,
3543 const Symbol_value<32>* psymval,
3544 Arm_address address,
3545 Arm_address thumb_bit)
3546 {
3547 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3548 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3549 Valtype* wv = reinterpret_cast<Valtype*>(view);
3550 Reltype insn = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3551 | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3552
3553 // f e d c b|a|9|8 7 6 5|4|3 2 1 0||f|e d c|b a 9 8|7 6 5 4 3 2 1 0
3554 // -----------------------------------------------------------------------
3555 // ADD{S} 1 1 1 1 0|i|0|1 0 0 0|S|1 1 0 1||0|imm3 |Rd |imm8
3556 // ADDW 1 1 1 1 0|i|1|0 0 0 0|0|1 1 0 1||0|imm3 |Rd |imm8
3557 // ADR[+] 1 1 1 1 0|i|1|0 0 0 0|0|1 1 1 1||0|imm3 |Rd |imm8
3558 // SUB{S} 1 1 1 1 0|i|0|1 1 0 1|S|1 1 0 1||0|imm3 |Rd |imm8
3559 // SUBW 1 1 1 1 0|i|1|0 1 0 1|0|1 1 0 1||0|imm3 |Rd |imm8
3560 // ADR[-] 1 1 1 1 0|i|1|0 1 0 1|0|1 1 1 1||0|imm3 |Rd |imm8
3561
3562 // Determine a sign for the addend.
3563 const int sign = ((insn & 0xf8ef0000) == 0xf0ad0000
3564 || (insn & 0xf8ef0000) == 0xf0af0000) ? -1 : 1;
3565 // Thumb2 addend encoding:
3566 // imm12 := i | imm3 | imm8
3567 int32_t addend = (insn & 0xff)
3568 | ((insn & 0x00007000) >> 4)
3569 | ((insn & 0x04000000) >> 15);
3570 // Apply a sign to the added.
3571 addend *= sign;
3572
3573 int32_t x = (psymval->value(object, addend) | thumb_bit)
3574 - (address & 0xfffffffc);
3575 Reltype val = abs(x);
3576 // Mask out the value and a distinct part of the ADD/SUB opcode
3577 // (bits 7:5 of opword).
3578 insn = (insn & 0xfb0f8f00)
3579 | (val & 0xff)
3580 | ((val & 0x700) << 4)
3581 | ((val & 0x800) << 15);
3582 // Set the opcode according to whether the value to go in the
3583 // place is negative.
3584 if (x < 0)
3585 insn |= 0x00a00000;
3586
3587 elfcpp::Swap<16, big_endian>::writeval(wv, insn >> 16);
3588 elfcpp::Swap<16, big_endian>::writeval(wv + 1, insn & 0xffff);
3589 return ((val > 0xfff) ?
3590 This::STATUS_OVERFLOW : This::STATUS_OKAY);
3591 }
3592
3593 // R_ARM_THM_PC8: S + A - Pa (Thumb)
3594 static inline typename This::Status
3595 thm_pc8(unsigned char* view,
3596 const Sized_relobj<32, big_endian>* object,
3597 const Symbol_value<32>* psymval,
3598 Arm_address address)
3599 {
3600 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3601 typedef typename elfcpp::Swap<16, big_endian>::Valtype Reltype;
3602 Valtype* wv = reinterpret_cast<Valtype*>(view);
3603 Valtype insn = elfcpp::Swap<16, big_endian>::readval(wv);
3604 Reltype addend = ((insn & 0x00ff) << 2);
3605 int32_t x = (psymval->value(object, addend) - (address & 0xfffffffc));
3606 Reltype val = abs(x);
3607 insn = (insn & 0xff00) | ((val & 0x03fc) >> 2);
3608
3609 elfcpp::Swap<16, big_endian>::writeval(wv, insn);
3610 return ((val > 0x03fc)
3611 ? This::STATUS_OVERFLOW
3612 : This::STATUS_OKAY);
3613 }
3614
3615 // R_ARM_THM_PC12: S + A - Pa (Thumb32)
3616 static inline typename This::Status
3617 thm_pc12(unsigned char* view,
3618 const Sized_relobj<32, big_endian>* object,
3619 const Symbol_value<32>* psymval,
3620 Arm_address address)
3621 {
3622 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3623 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3624 Valtype* wv = reinterpret_cast<Valtype*>(view);
3625 Reltype insn = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3626 | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3627 // Determine a sign for the addend (positive if the U bit is 1).
3628 const int sign = (insn & 0x00800000) ? 1 : -1;
3629 int32_t addend = (insn & 0xfff);
3630 // Apply a sign to the added.
3631 addend *= sign;
3632
3633 int32_t x = (psymval->value(object, addend) - (address & 0xfffffffc));
3634 Reltype val = abs(x);
3635 // Mask out and apply the value and the U bit.
3636 insn = (insn & 0xff7ff000) | (val & 0xfff);
3637 // Set the U bit according to whether the value to go in the
3638 // place is positive.
3639 if (x >= 0)
3640 insn |= 0x00800000;
3641
3642 elfcpp::Swap<16, big_endian>::writeval(wv, insn >> 16);
3643 elfcpp::Swap<16, big_endian>::writeval(wv + 1, insn & 0xffff);
3644 return ((val > 0xfff) ?
3645 This::STATUS_OVERFLOW : This::STATUS_OKAY);
3646 }
3647
a2162063
ILT
3648 // R_ARM_V4BX
3649 static inline typename This::Status
3650 v4bx(const Relocate_info<32, big_endian>* relinfo,
ca09d69a 3651 unsigned char* view,
a2162063
ILT
3652 const Arm_relobj<big_endian>* object,
3653 const Arm_address address,
3654 const bool is_interworking)
3655 {
3656
3657 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3658 Valtype* wv = reinterpret_cast<Valtype*>(view);
3659 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3660
3661 // Ensure that we have a BX instruction.
3662 gold_assert((val & 0x0ffffff0) == 0x012fff10);
3663 const uint32_t reg = (val & 0xf);
3664 if (is_interworking && reg != 0xf)
3665 {
3666 Stub_table<big_endian>* stub_table =
3667 object->stub_table(relinfo->data_shndx);
3668 gold_assert(stub_table != NULL);
3669
3670 Arm_v4bx_stub* stub = stub_table->find_arm_v4bx_stub(reg);
3671 gold_assert(stub != NULL);
3672
3673 int32_t veneer_address =
3674 stub_table->address() + stub->offset() - 8 - address;
3675 gold_assert((veneer_address <= ARM_MAX_FWD_BRANCH_OFFSET)
3676 && (veneer_address >= ARM_MAX_BWD_BRANCH_OFFSET));
3677 // Replace with a branch to veneer (B <addr>)
3678 val = (val & 0xf0000000) | 0x0a000000
3679 | ((veneer_address >> 2) & 0x00ffffff);
3680 }
3681 else
3682 {
3683 // Preserve Rm (lowest four bits) and the condition code
3684 // (highest four bits). Other bits encode MOV PC,Rm.
3685 val = (val & 0xf000000f) | 0x01a0f000;
3686 }
3687 elfcpp::Swap<32, big_endian>::writeval(wv, val);
3688 return This::STATUS_OKAY;
3689 }
b10d2873
ILT
3690
3691 // R_ARM_ALU_PC_G0_NC: ((S + A) | T) - P
3692 // R_ARM_ALU_PC_G0: ((S + A) | T) - P
3693 // R_ARM_ALU_PC_G1_NC: ((S + A) | T) - P
3694 // R_ARM_ALU_PC_G1: ((S + A) | T) - P
3695 // R_ARM_ALU_PC_G2: ((S + A) | T) - P
3696 // R_ARM_ALU_SB_G0_NC: ((S + A) | T) - B(S)
3697 // R_ARM_ALU_SB_G0: ((S + A) | T) - B(S)
3698 // R_ARM_ALU_SB_G1_NC: ((S + A) | T) - B(S)
3699 // R_ARM_ALU_SB_G1: ((S + A) | T) - B(S)
3700 // R_ARM_ALU_SB_G2: ((S + A) | T) - B(S)
3701 static inline typename This::Status
3702 arm_grp_alu(unsigned char* view,
3703 const Sized_relobj<32, big_endian>* object,
3704 const Symbol_value<32>* psymval,
3705 const int group,
3706 Arm_address address,
3707 Arm_address thumb_bit,
3708 bool check_overflow)
3709 {
5c57f1be 3710 gold_assert(group >= 0 && group < 3);
b10d2873
ILT
3711 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3712 Valtype* wv = reinterpret_cast<Valtype*>(view);
3713 Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3714
3715 // ALU group relocations are allowed only for the ADD/SUB instructions.
3716 // (0x00800000 - ADD, 0x00400000 - SUB)
3717 const Valtype opcode = insn & 0x01e00000;
3718 if (opcode != 0x00800000 && opcode != 0x00400000)
3719 return This::STATUS_BAD_RELOC;
3720
3721 // Determine a sign for the addend.
3722 const int sign = (opcode == 0x00800000) ? 1 : -1;
3723 // shifter = rotate_imm * 2
3724 const uint32_t shifter = (insn & 0xf00) >> 7;
3725 // Initial addend value.
3726 int32_t addend = insn & 0xff;
3727 // Rotate addend right by shifter.
3728 addend = (addend >> shifter) | (addend << (32 - shifter));
3729 // Apply a sign to the added.
3730 addend *= sign;
3731
3732 int32_t x = ((psymval->value(object, addend) | thumb_bit) - address);
3733 Valtype gn = Arm_relocate_functions::calc_grp_gn(abs(x), group);
3734 // Check for overflow if required
3735 if (check_overflow
3736 && (Arm_relocate_functions::calc_grp_residual(abs(x), group) != 0))
3737 return This::STATUS_OVERFLOW;
3738
3739 // Mask out the value and the ADD/SUB part of the opcode; take care
3740 // not to destroy the S bit.
3741 insn &= 0xff1ff000;
3742 // Set the opcode according to whether the value to go in the
3743 // place is negative.
3744 insn |= ((x < 0) ? 0x00400000 : 0x00800000);
3745 // Encode the offset (encoded Gn).
3746 insn |= gn;
3747
3748 elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3749 return This::STATUS_OKAY;
3750 }
3751
3752 // R_ARM_LDR_PC_G0: S + A - P
3753 // R_ARM_LDR_PC_G1: S + A - P
3754 // R_ARM_LDR_PC_G2: S + A - P
3755 // R_ARM_LDR_SB_G0: S + A - B(S)
3756 // R_ARM_LDR_SB_G1: S + A - B(S)
3757 // R_ARM_LDR_SB_G2: S + A - B(S)
3758 static inline typename This::Status
3759 arm_grp_ldr(unsigned char* view,
3760 const Sized_relobj<32, big_endian>* object,
3761 const Symbol_value<32>* psymval,
3762 const int group,
3763 Arm_address address)
3764 {
5c57f1be 3765 gold_assert(group >= 0 && group < 3);
b10d2873
ILT
3766 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3767 Valtype* wv = reinterpret_cast<Valtype*>(view);
3768 Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3769
3770 const int sign = (insn & 0x00800000) ? 1 : -1;
3771 int32_t addend = (insn & 0xfff) * sign;
3772 int32_t x = (psymval->value(object, addend) - address);
3773 // Calculate the relevant G(n-1) value to obtain this stage residual.
3774 Valtype residual =
3775 Arm_relocate_functions::calc_grp_residual(abs(x), group - 1);
3776 if (residual >= 0x1000)
3777 return This::STATUS_OVERFLOW;
3778
3779 // Mask out the value and U bit.
3780 insn &= 0xff7ff000;
3781 // Set the U bit for non-negative values.
3782 if (x >= 0)
3783 insn |= 0x00800000;
3784 insn |= residual;
3785
3786 elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3787 return This::STATUS_OKAY;
3788 }
3789
3790 // R_ARM_LDRS_PC_G0: S + A - P
3791 // R_ARM_LDRS_PC_G1: S + A - P
3792 // R_ARM_LDRS_PC_G2: S + A - P
3793 // R_ARM_LDRS_SB_G0: S + A - B(S)
3794 // R_ARM_LDRS_SB_G1: S + A - B(S)
3795 // R_ARM_LDRS_SB_G2: S + A - B(S)
3796 static inline typename This::Status
3797 arm_grp_ldrs(unsigned char* view,
3798 const Sized_relobj<32, big_endian>* object,
3799 const Symbol_value<32>* psymval,
3800 const int group,
3801 Arm_address address)
3802 {
5c57f1be 3803 gold_assert(group >= 0 && group < 3);
b10d2873
ILT
3804 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3805 Valtype* wv = reinterpret_cast<Valtype*>(view);
3806 Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3807
3808 const int sign = (insn & 0x00800000) ? 1 : -1;
3809 int32_t addend = (((insn & 0xf00) >> 4) + (insn & 0xf)) * sign;
3810 int32_t x = (psymval->value(object, addend) - address);
3811 // Calculate the relevant G(n-1) value to obtain this stage residual.
3812 Valtype residual =
3813 Arm_relocate_functions::calc_grp_residual(abs(x), group - 1);
3814 if (residual >= 0x100)
3815 return This::STATUS_OVERFLOW;
3816
3817 // Mask out the value and U bit.
3818 insn &= 0xff7ff0f0;
3819 // Set the U bit for non-negative values.
3820 if (x >= 0)
3821 insn |= 0x00800000;
3822 insn |= ((residual & 0xf0) << 4) | (residual & 0xf);
3823
3824 elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3825 return This::STATUS_OKAY;
3826 }
3827
3828 // R_ARM_LDC_PC_G0: S + A - P
3829 // R_ARM_LDC_PC_G1: S + A - P
3830 // R_ARM_LDC_PC_G2: S + A - P
3831 // R_ARM_LDC_SB_G0: S + A - B(S)
3832 // R_ARM_LDC_SB_G1: S + A - B(S)
3833 // R_ARM_LDC_SB_G2: S + A - B(S)
3834 static inline typename This::Status
3835 arm_grp_ldc(unsigned char* view,
3836 const Sized_relobj<32, big_endian>* object,
3837 const Symbol_value<32>* psymval,
3838 const int group,
3839 Arm_address address)
3840 {
5c57f1be 3841 gold_assert(group >= 0 && group < 3);
b10d2873
ILT
3842 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3843 Valtype* wv = reinterpret_cast<Valtype*>(view);
3844 Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3845
3846 const int sign = (insn & 0x00800000) ? 1 : -1;
3847 int32_t addend = ((insn & 0xff) << 2) * sign;
3848 int32_t x = (psymval->value(object, addend) - address);
3849 // Calculate the relevant G(n-1) value to obtain this stage residual.
3850 Valtype residual =
3851 Arm_relocate_functions::calc_grp_residual(abs(x), group - 1);
3852 if ((residual & 0x3) != 0 || residual >= 0x400)
3853 return This::STATUS_OVERFLOW;
3854
3855 // Mask out the value and U bit.
3856 insn &= 0xff7fff00;
3857 // Set the U bit for non-negative values.
3858 if (x >= 0)
3859 insn |= 0x00800000;
3860 insn |= (residual >> 2);
3861
3862 elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3863 return This::STATUS_OKAY;
3864 }
c121c671
DK
3865};
3866
d204b6e9
DK
3867// Relocate ARM long branches. This handles relocation types
3868// R_ARM_CALL, R_ARM_JUMP24, R_ARM_PLT32 and R_ARM_XPC25.
3869// If IS_WEAK_UNDEFINED_WITH_PLT is true. The target symbol is weakly
3870// undefined and we do not use PLT in this relocation. In such a case,
3871// the branch is converted into an NOP.
3872
3873template<bool big_endian>
3874typename Arm_relocate_functions<big_endian>::Status
3875Arm_relocate_functions<big_endian>::arm_branch_common(
3876 unsigned int r_type,
3877 const Relocate_info<32, big_endian>* relinfo,
ca09d69a 3878 unsigned char* view,
d204b6e9
DK
3879 const Sized_symbol<32>* gsym,
3880 const Arm_relobj<big_endian>* object,
3881 unsigned int r_sym,
3882 const Symbol_value<32>* psymval,
3883 Arm_address address,
3884 Arm_address thumb_bit,
3885 bool is_weakly_undefined_without_plt)
3886{
3887 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3888 Valtype* wv = reinterpret_cast<Valtype*>(view);
3889 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3890
3891 bool insn_is_b = (((val >> 28) & 0xf) <= 0xe)
3892 && ((val & 0x0f000000UL) == 0x0a000000UL);
3893 bool insn_is_uncond_bl = (val & 0xff000000UL) == 0xeb000000UL;
3894 bool insn_is_cond_bl = (((val >> 28) & 0xf) < 0xe)
3895 && ((val & 0x0f000000UL) == 0x0b000000UL);
3896 bool insn_is_blx = (val & 0xfe000000UL) == 0xfa000000UL;
3897 bool insn_is_any_branch = (val & 0x0e000000UL) == 0x0a000000UL;
3898
3899 // Check that the instruction is valid.
3900 if (r_type == elfcpp::R_ARM_CALL)
3901 {
3902 if (!insn_is_uncond_bl && !insn_is_blx)
3903 return This::STATUS_BAD_RELOC;
3904 }
3905 else if (r_type == elfcpp::R_ARM_JUMP24)
3906 {
3907 if (!insn_is_b && !insn_is_cond_bl)
3908 return This::STATUS_BAD_RELOC;
3909 }
3910 else if (r_type == elfcpp::R_ARM_PLT32)
3911 {
3912 if (!insn_is_any_branch)
3913 return This::STATUS_BAD_RELOC;
3914 }
3915 else if (r_type == elfcpp::R_ARM_XPC25)
3916 {
3917 // FIXME: AAELF document IH0044C does not say much about it other
3918 // than it being obsolete.
3919 if (!insn_is_any_branch)
3920 return This::STATUS_BAD_RELOC;
3921 }
3922 else
3923 gold_unreachable();
3924
3925 // A branch to an undefined weak symbol is turned into a jump to
3926 // the next instruction unless a PLT entry will be created.
3927 // Do the same for local undefined symbols.
3928 // The jump to the next instruction is optimized as a NOP depending
3929 // on the architecture.
3930 const Target_arm<big_endian>* arm_target =
3931 Target_arm<big_endian>::default_target();
3932 if (is_weakly_undefined_without_plt)
3933 {
5c388529 3934 gold_assert(!parameters->options().relocatable());
d204b6e9
DK
3935 Valtype cond = val & 0xf0000000U;
3936 if (arm_target->may_use_arm_nop())
3937 val = cond | 0x0320f000;
3938 else
3939 val = cond | 0x01a00000; // Using pre-UAL nop: mov r0, r0.
3940 elfcpp::Swap<32, big_endian>::writeval(wv, val);
3941 return This::STATUS_OKAY;
3942 }
3943
3944 Valtype addend = utils::sign_extend<26>(val << 2);
3945 Valtype branch_target = psymval->value(object, addend);
3946 int32_t branch_offset = branch_target - address;
3947
3948 // We need a stub if the branch offset is too large or if we need
3949 // to switch mode.
3950 bool may_use_blx = arm_target->may_use_blx();
3951 Reloc_stub* stub = NULL;
5c388529
DK
3952
3953 if (!parameters->options().relocatable()
3954 && (utils::has_overflow<26>(branch_offset)
3955 || ((thumb_bit != 0)
3956 && !(may_use_blx && r_type == elfcpp::R_ARM_CALL))))
d204b6e9 3957 {
2a2b6d42
DK
3958 Valtype unadjusted_branch_target = psymval->value(object, 0);
3959
d204b6e9 3960 Stub_type stub_type =
2a2b6d42
DK
3961 Reloc_stub::stub_type_for_reloc(r_type, address,
3962 unadjusted_branch_target,
d204b6e9
DK
3963 (thumb_bit != 0));
3964 if (stub_type != arm_stub_none)
3965 {
2ea97941 3966 Stub_table<big_endian>* stub_table =
d204b6e9 3967 object->stub_table(relinfo->data_shndx);
2ea97941 3968 gold_assert(stub_table != NULL);
d204b6e9
DK
3969
3970 Reloc_stub::Key stub_key(stub_type, gsym, object, r_sym, addend);
2ea97941 3971 stub = stub_table->find_reloc_stub(stub_key);
d204b6e9
DK
3972 gold_assert(stub != NULL);
3973 thumb_bit = stub->stub_template()->entry_in_thumb_mode() ? 1 : 0;
2ea97941 3974 branch_target = stub_table->address() + stub->offset() + addend;
d204b6e9 3975 branch_offset = branch_target - address;
2a2b6d42 3976 gold_assert(!utils::has_overflow<26>(branch_offset));
d204b6e9
DK
3977 }
3978 }
3979
3980 // At this point, if we still need to switch mode, the instruction
3981 // must either be a BLX or a BL that can be converted to a BLX.
3982 if (thumb_bit != 0)
3983 {
3984 // Turn BL to BLX.
3985 gold_assert(may_use_blx && r_type == elfcpp::R_ARM_CALL);
3986 val = (val & 0xffffff) | 0xfa000000 | ((branch_offset & 2) << 23);
3987 }
3988
3989 val = utils::bit_select(val, (branch_offset >> 2), 0xffffffUL);
3990 elfcpp::Swap<32, big_endian>::writeval(wv, val);
3991 return (utils::has_overflow<26>(branch_offset)
3992 ? This::STATUS_OVERFLOW : This::STATUS_OKAY);
3993}
3994
51938283
DK
3995// Relocate THUMB long branches. This handles relocation types
3996// R_ARM_THM_CALL, R_ARM_THM_JUMP24 and R_ARM_THM_XPC22.
3997// If IS_WEAK_UNDEFINED_WITH_PLT is true. The target symbol is weakly
3998// undefined and we do not use PLT in this relocation. In such a case,
3999// the branch is converted into an NOP.
4000
4001template<bool big_endian>
4002typename Arm_relocate_functions<big_endian>::Status
4003Arm_relocate_functions<big_endian>::thumb_branch_common(
4004 unsigned int r_type,
4005 const Relocate_info<32, big_endian>* relinfo,
ca09d69a 4006 unsigned char* view,
51938283
DK
4007 const Sized_symbol<32>* gsym,
4008 const Arm_relobj<big_endian>* object,
4009 unsigned int r_sym,
4010 const Symbol_value<32>* psymval,
4011 Arm_address address,
4012 Arm_address thumb_bit,
4013 bool is_weakly_undefined_without_plt)
4014{
4015 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
4016 Valtype* wv = reinterpret_cast<Valtype*>(view);
4017 uint32_t upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
4018 uint32_t lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
4019
4020 // FIXME: These tests are too loose and do not take THUMB/THUMB-2 difference
4021 // into account.
4022 bool is_bl_insn = (lower_insn & 0x1000U) == 0x1000U;
4023 bool is_blx_insn = (lower_insn & 0x1000U) == 0x0000U;
4024
4025 // Check that the instruction is valid.
4026 if (r_type == elfcpp::R_ARM_THM_CALL)
4027 {
4028 if (!is_bl_insn && !is_blx_insn)
4029 return This::STATUS_BAD_RELOC;
4030 }
4031 else if (r_type == elfcpp::R_ARM_THM_JUMP24)
4032 {
4033 // This cannot be a BLX.
4034 if (!is_bl_insn)
4035 return This::STATUS_BAD_RELOC;
4036 }
4037 else if (r_type == elfcpp::R_ARM_THM_XPC22)
4038 {
4039 // Check for Thumb to Thumb call.
4040 if (!is_blx_insn)
4041 return This::STATUS_BAD_RELOC;
4042 if (thumb_bit != 0)
4043 {
4044 gold_warning(_("%s: Thumb BLX instruction targets "
4045 "thumb function '%s'."),
4046 object->name().c_str(),
4047 (gsym ? gsym->name() : "(local)"));
4048 // Convert BLX to BL.
4049 lower_insn |= 0x1000U;
4050 }
4051 }
4052 else
4053 gold_unreachable();
4054
4055 // A branch to an undefined weak symbol is turned into a jump to
4056 // the next instruction unless a PLT entry will be created.
4057 // The jump to the next instruction is optimized as a NOP.W for
4058 // Thumb-2 enabled architectures.
4059 const Target_arm<big_endian>* arm_target =
4060 Target_arm<big_endian>::default_target();
4061 if (is_weakly_undefined_without_plt)
4062 {
5c388529 4063 gold_assert(!parameters->options().relocatable());
51938283
DK
4064 if (arm_target->may_use_thumb2_nop())
4065 {
4066 elfcpp::Swap<16, big_endian>::writeval(wv, 0xf3af);
4067 elfcpp::Swap<16, big_endian>::writeval(wv + 1, 0x8000);
4068 }
4069 else
4070 {
4071 elfcpp::Swap<16, big_endian>::writeval(wv, 0xe000);
4072 elfcpp::Swap<16, big_endian>::writeval(wv + 1, 0xbf00);
4073 }
4074 return This::STATUS_OKAY;
4075 }
4076
089d69dc 4077 int32_t addend = This::thumb32_branch_offset(upper_insn, lower_insn);
51938283 4078 Arm_address branch_target = psymval->value(object, addend);
a2c7281b
DK
4079
4080 // For BLX, bit 1 of target address comes from bit 1 of base address.
4081 bool may_use_blx = arm_target->may_use_blx();
4082 if (thumb_bit == 0 && may_use_blx)
4083 branch_target = utils::bit_select(branch_target, address, 0x2);
4084
51938283
DK
4085 int32_t branch_offset = branch_target - address;
4086
4087 // We need a stub if the branch offset is too large or if we need
4088 // to switch mode.
51938283 4089 bool thumb2 = arm_target->using_thumb2();
5c388529
DK
4090 if (!parameters->options().relocatable()
4091 && ((!thumb2 && utils::has_overflow<23>(branch_offset))
4092 || (thumb2 && utils::has_overflow<25>(branch_offset))
4093 || ((thumb_bit == 0)
4094 && (((r_type == elfcpp::R_ARM_THM_CALL) && !may_use_blx)
4095 || r_type == elfcpp::R_ARM_THM_JUMP24))))
51938283 4096 {
2a2b6d42
DK
4097 Arm_address unadjusted_branch_target = psymval->value(object, 0);
4098
51938283 4099 Stub_type stub_type =
2a2b6d42
DK
4100 Reloc_stub::stub_type_for_reloc(r_type, address,
4101 unadjusted_branch_target,
51938283 4102 (thumb_bit != 0));
2a2b6d42 4103
51938283
DK
4104 if (stub_type != arm_stub_none)
4105 {
2ea97941 4106 Stub_table<big_endian>* stub_table =
51938283 4107 object->stub_table(relinfo->data_shndx);
2ea97941 4108 gold_assert(stub_table != NULL);
51938283
DK
4109
4110 Reloc_stub::Key stub_key(stub_type, gsym, object, r_sym, addend);
2ea97941 4111 Reloc_stub* stub = stub_table->find_reloc_stub(stub_key);
51938283
DK
4112 gold_assert(stub != NULL);
4113 thumb_bit = stub->stub_template()->entry_in_thumb_mode() ? 1 : 0;
2ea97941 4114 branch_target = stub_table->address() + stub->offset() + addend;
a2c7281b
DK
4115 if (thumb_bit == 0 && may_use_blx)
4116 branch_target = utils::bit_select(branch_target, address, 0x2);
51938283
DK
4117 branch_offset = branch_target - address;
4118 }
4119 }
4120
4121 // At this point, if we still need to switch mode, the instruction
4122 // must either be a BLX or a BL that can be converted to a BLX.
4123 if (thumb_bit == 0)
4124 {
4125 gold_assert(may_use_blx
4126 && (r_type == elfcpp::R_ARM_THM_CALL
4127 || r_type == elfcpp::R_ARM_THM_XPC22));
4128 // Make sure this is a BLX.
4129 lower_insn &= ~0x1000U;
4130 }
4131 else
4132 {
4133 // Make sure this is a BL.
4134 lower_insn |= 0x1000U;
4135 }
4136
a2c7281b
DK
4137 // For a BLX instruction, make sure that the relocation is rounded up
4138 // to a word boundary. This follows the semantics of the instruction
4139 // which specifies that bit 1 of the target address will come from bit
4140 // 1 of the base address.
51938283 4141 if ((lower_insn & 0x5000U) == 0x4000U)
a2c7281b 4142 gold_assert((branch_offset & 3) == 0);
51938283
DK
4143
4144 // Put BRANCH_OFFSET back into the insn. Assumes two's complement.
4145 // We use the Thumb-2 encoding, which is safe even if dealing with
4146 // a Thumb-1 instruction by virtue of our overflow check above. */
089d69dc
DK
4147 upper_insn = This::thumb32_branch_upper(upper_insn, branch_offset);
4148 lower_insn = This::thumb32_branch_lower(lower_insn, branch_offset);
51938283
DK
4149
4150 elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
4151 elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
4152
a2c7281b
DK
4153 gold_assert(!utils::has_overflow<25>(branch_offset));
4154
51938283 4155 return ((thumb2
089d69dc
DK
4156 ? utils::has_overflow<25>(branch_offset)
4157 : utils::has_overflow<23>(branch_offset))
4158 ? This::STATUS_OVERFLOW
4159 : This::STATUS_OKAY);
4160}
4161
4162// Relocate THUMB-2 long conditional branches.
4163// If IS_WEAK_UNDEFINED_WITH_PLT is true. The target symbol is weakly
4164// undefined and we do not use PLT in this relocation. In such a case,
4165// the branch is converted into an NOP.
4166
4167template<bool big_endian>
4168typename Arm_relocate_functions<big_endian>::Status
4169Arm_relocate_functions<big_endian>::thm_jump19(
ca09d69a 4170 unsigned char* view,
089d69dc
DK
4171 const Arm_relobj<big_endian>* object,
4172 const Symbol_value<32>* psymval,
4173 Arm_address address,
4174 Arm_address thumb_bit)
4175{
4176 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
4177 Valtype* wv = reinterpret_cast<Valtype*>(view);
4178 uint32_t upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
4179 uint32_t lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
4180 int32_t addend = This::thumb32_cond_branch_offset(upper_insn, lower_insn);
4181
4182 Arm_address branch_target = psymval->value(object, addend);
4183 int32_t branch_offset = branch_target - address;
4184
4185 // ??? Should handle interworking? GCC might someday try to
4186 // use this for tail calls.
4187 // FIXME: We do support thumb entry to PLT yet.
4188 if (thumb_bit == 0)
4189 {
4190 gold_error(_("conditional branch to PLT in THUMB-2 not supported yet."));
4191 return This::STATUS_BAD_RELOC;
4192 }
4193
4194 // Put RELOCATION back into the insn.
4195 upper_insn = This::thumb32_cond_branch_upper(upper_insn, branch_offset);
4196 lower_insn = This::thumb32_cond_branch_lower(lower_insn, branch_offset);
4197
4198 // Put the relocated value back in the object file:
4199 elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
4200 elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
4201
4202 return (utils::has_overflow<21>(branch_offset)
51938283
DK
4203 ? This::STATUS_OVERFLOW
4204 : This::STATUS_OKAY);
4205}
4206
94cdfcff
DK
4207// Get the GOT section, creating it if necessary.
4208
4209template<bool big_endian>
4a54abbb 4210Arm_output_data_got<big_endian>*
94cdfcff
DK
4211Target_arm<big_endian>::got_section(Symbol_table* symtab, Layout* layout)
4212{
4213 if (this->got_ == NULL)
4214 {
4215 gold_assert(symtab != NULL && layout != NULL);
4216
4a54abbb 4217 this->got_ = new Arm_output_data_got<big_endian>(symtab, layout);
94cdfcff 4218
82742395 4219 layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
0c91cf04
DK
4220 (elfcpp::SHF_ALLOC | elfcpp::SHF_WRITE),
4221 this->got_, ORDER_DATA, false);
22f0da72 4222
94cdfcff
DK
4223 // The old GNU linker creates a .got.plt section. We just
4224 // create another set of data in the .got section. Note that we
4225 // always create a PLT if we create a GOT, although the PLT
4226 // might be empty.
4227 this->got_plt_ = new Output_data_space(4, "** GOT PLT");
82742395 4228 layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
0c91cf04 4229 (elfcpp::SHF_ALLOC | elfcpp::SHF_WRITE),
22f0da72 4230 this->got_plt_, ORDER_DATA, false);
94cdfcff
DK
4231
4232 // The first three entries are reserved.
4233 this->got_plt_->set_current_data_size(3 * 4);
4234
4235 // Define _GLOBAL_OFFSET_TABLE_ at the start of the PLT.
4236 symtab->define_in_output_data("_GLOBAL_OFFSET_TABLE_", NULL,
99fff23b 4237 Symbol_table::PREDEFINED,
94cdfcff
DK
4238 this->got_plt_,
4239 0, 0, elfcpp::STT_OBJECT,
4240 elfcpp::STB_LOCAL,
4241 elfcpp::STV_HIDDEN, 0,
4242 false, false);
4243 }
4244 return this->got_;
4245}
4246
4247// Get the dynamic reloc section, creating it if necessary.
4248
4249template<bool big_endian>
4250typename Target_arm<big_endian>::Reloc_section*
4251Target_arm<big_endian>::rel_dyn_section(Layout* layout)
4252{
4253 if (this->rel_dyn_ == NULL)
4254 {
4255 gold_assert(layout != NULL);
4256 this->rel_dyn_ = new Reloc_section(parameters->options().combreloc());
4257 layout->add_output_section_data(".rel.dyn", elfcpp::SHT_REL,
22f0da72
ILT
4258 elfcpp::SHF_ALLOC, this->rel_dyn_,
4259 ORDER_DYNAMIC_RELOCS, false);
94cdfcff
DK
4260 }
4261 return this->rel_dyn_;
4262}
4263
b569affa
DK
4264// Insn_template methods.
4265
4266// Return byte size of an instruction template.
4267
4268size_t
4269Insn_template::size() const
4270{
4271 switch (this->type())
4272 {
4273 case THUMB16_TYPE:
2fb7225c 4274 case THUMB16_SPECIAL_TYPE:
b569affa
DK
4275 return 2;
4276 case ARM_TYPE:
4277 case THUMB32_TYPE:
4278 case DATA_TYPE:
4279 return 4;
4280 default:
4281 gold_unreachable();
4282 }
4283}
4284
4285// Return alignment of an instruction template.
4286
4287unsigned
4288Insn_template::alignment() const
4289{
4290 switch (this->type())
4291 {
4292 case THUMB16_TYPE:
2fb7225c 4293 case THUMB16_SPECIAL_TYPE:
b569affa
DK
4294 case THUMB32_TYPE:
4295 return 2;
4296 case ARM_TYPE:
4297 case DATA_TYPE:
4298 return 4;
4299 default:
4300 gold_unreachable();
4301 }
4302}
4303
4304// Stub_template methods.
4305
4306Stub_template::Stub_template(
2ea97941
ILT
4307 Stub_type type, const Insn_template* insns,
4308 size_t insn_count)
4309 : type_(type), insns_(insns), insn_count_(insn_count), alignment_(1),
b569affa
DK
4310 entry_in_thumb_mode_(false), relocs_()
4311{
2ea97941 4312 off_t offset = 0;
b569affa
DK
4313
4314 // Compute byte size and alignment of stub template.
2ea97941 4315 for (size_t i = 0; i < insn_count; i++)
b569affa 4316 {
2ea97941
ILT
4317 unsigned insn_alignment = insns[i].alignment();
4318 size_t insn_size = insns[i].size();
4319 gold_assert((offset & (insn_alignment - 1)) == 0);
b569affa 4320 this->alignment_ = std::max(this->alignment_, insn_alignment);
2ea97941 4321 switch (insns[i].type())
b569affa
DK
4322 {
4323 case Insn_template::THUMB16_TYPE:
089d69dc 4324 case Insn_template::THUMB16_SPECIAL_TYPE:
b569affa
DK
4325 if (i == 0)
4326 this->entry_in_thumb_mode_ = true;
4327 break;
4328
4329 case Insn_template::THUMB32_TYPE:
2ea97941
ILT
4330 if (insns[i].r_type() != elfcpp::R_ARM_NONE)
4331 this->relocs_.push_back(Reloc(i, offset));
b569affa
DK
4332 if (i == 0)
4333 this->entry_in_thumb_mode_ = true;
4334 break;
4335
4336 case Insn_template::ARM_TYPE:
4337 // Handle cases where the target is encoded within the
4338 // instruction.
2ea97941
ILT
4339 if (insns[i].r_type() == elfcpp::R_ARM_JUMP24)
4340 this->relocs_.push_back(Reloc(i, offset));
b569affa
DK
4341 break;
4342
4343 case Insn_template::DATA_TYPE:
4344 // Entry point cannot be data.
4345 gold_assert(i != 0);
2ea97941 4346 this->relocs_.push_back(Reloc(i, offset));
b569affa
DK
4347 break;
4348
4349 default:
4350 gold_unreachable();
4351 }
2ea97941 4352 offset += insn_size;
b569affa 4353 }
2ea97941 4354 this->size_ = offset;
b569affa
DK
4355}
4356
bb0d3eb0
DK
4357// Stub methods.
4358
7296d933 4359// Template to implement do_write for a specific target endianness.
bb0d3eb0
DK
4360
4361template<bool big_endian>
4362void inline
4363Stub::do_fixed_endian_write(unsigned char* view, section_size_type view_size)
4364{
4365 const Stub_template* stub_template = this->stub_template();
4366 const Insn_template* insns = stub_template->insns();
4367
4368 // FIXME: We do not handle BE8 encoding yet.
4369 unsigned char* pov = view;
4370 for (size_t i = 0; i < stub_template->insn_count(); i++)
4371 {
4372 switch (insns[i].type())
4373 {
4374 case Insn_template::THUMB16_TYPE:
4375 elfcpp::Swap<16, big_endian>::writeval(pov, insns[i].data() & 0xffff);
4376 break;
4377 case Insn_template::THUMB16_SPECIAL_TYPE:
4378 elfcpp::Swap<16, big_endian>::writeval(
4379 pov,
4380 this->thumb16_special(i));
4381 break;
4382 case Insn_template::THUMB32_TYPE:
4383 {
4384 uint32_t hi = (insns[i].data() >> 16) & 0xffff;
4385 uint32_t lo = insns[i].data() & 0xffff;
4386 elfcpp::Swap<16, big_endian>::writeval(pov, hi);
4387 elfcpp::Swap<16, big_endian>::writeval(pov + 2, lo);
4388 }
4389 break;
4390 case Insn_template::ARM_TYPE:
4391 case Insn_template::DATA_TYPE:
4392 elfcpp::Swap<32, big_endian>::writeval(pov, insns[i].data());
4393 break;
4394 default:
4395 gold_unreachable();
4396 }
4397 pov += insns[i].size();
4398 }
4399 gold_assert(static_cast<section_size_type>(pov - view) == view_size);
4400}
4401
b569affa
DK
4402// Reloc_stub::Key methods.
4403
4404// Dump a Key as a string for debugging.
4405
4406std::string
4407Reloc_stub::Key::name() const
4408{
4409 if (this->r_sym_ == invalid_index)
4410 {
4411 // Global symbol key name
4412 // <stub-type>:<symbol name>:<addend>.
4413 const std::string sym_name = this->u_.symbol->name();
4414 // We need to print two hex number and two colons. So just add 100 bytes
4415 // to the symbol name size.
4416 size_t len = sym_name.size() + 100;
4417 char* buffer = new char[len];
4418 int c = snprintf(buffer, len, "%d:%s:%x", this->stub_type_,
4419 sym_name.c_str(), this->addend_);
4420 gold_assert(c > 0 && c < static_cast<int>(len));
4421 delete[] buffer;
4422 return std::string(buffer);
4423 }
4424 else
4425 {
4426 // local symbol key name
4427 // <stub-type>:<object>:<r_sym>:<addend>.
4428 const size_t len = 200;
4429 char buffer[len];
4430 int c = snprintf(buffer, len, "%d:%p:%u:%x", this->stub_type_,
4431 this->u_.relobj, this->r_sym_, this->addend_);
4432 gold_assert(c > 0 && c < static_cast<int>(len));
4433 return std::string(buffer);
4434 }
4435}
4436
4437// Reloc_stub methods.
4438
4439// Determine the type of stub needed, if any, for a relocation of R_TYPE at
4440// LOCATION to DESTINATION.
4441// This code is based on the arm_type_of_stub function in
9b547ce6 4442// bfd/elf32-arm.c. We have changed the interface a little to keep the Stub
b569affa
DK
4443// class simple.
4444
4445Stub_type
4446Reloc_stub::stub_type_for_reloc(
4447 unsigned int r_type,
4448 Arm_address location,
4449 Arm_address destination,
4450 bool target_is_thumb)
4451{
4452 Stub_type stub_type = arm_stub_none;
4453
4454 // This is a bit ugly but we want to avoid using a templated class for
4455 // big and little endianities.
4456 bool may_use_blx;
4457 bool should_force_pic_veneer;
4458 bool thumb2;
4459 bool thumb_only;
4460 if (parameters->target().is_big_endian())
4461 {
43d12afe 4462 const Target_arm<true>* big_endian_target =
b569affa 4463 Target_arm<true>::default_target();
43d12afe
DK
4464 may_use_blx = big_endian_target->may_use_blx();
4465 should_force_pic_veneer = big_endian_target->should_force_pic_veneer();
4466 thumb2 = big_endian_target->using_thumb2();
4467 thumb_only = big_endian_target->using_thumb_only();
b569affa
DK
4468 }
4469 else
4470 {
43d12afe 4471 const Target_arm<false>* little_endian_target =
b569affa 4472 Target_arm<false>::default_target();
43d12afe
DK
4473 may_use_blx = little_endian_target->may_use_blx();
4474 should_force_pic_veneer = little_endian_target->should_force_pic_veneer();
4475 thumb2 = little_endian_target->using_thumb2();
4476 thumb_only = little_endian_target->using_thumb_only();
b569affa
DK
4477 }
4478
a2c7281b 4479 int64_t branch_offset;
b569affa
DK
4480 if (r_type == elfcpp::R_ARM_THM_CALL || r_type == elfcpp::R_ARM_THM_JUMP24)
4481 {
a2c7281b
DK
4482 // For THUMB BLX instruction, bit 1 of target comes from bit 1 of the
4483 // base address (instruction address + 4).
4484 if ((r_type == elfcpp::R_ARM_THM_CALL) && may_use_blx && !target_is_thumb)
4485 destination = utils::bit_select(destination, location, 0x2);
4486 branch_offset = static_cast<int64_t>(destination) - location;
4487
b569affa
DK
4488 // Handle cases where:
4489 // - this call goes too far (different Thumb/Thumb2 max
4490 // distance)
4491 // - it's a Thumb->Arm call and blx is not available, or it's a
4492 // Thumb->Arm branch (not bl). A stub is needed in this case.
4493 if ((!thumb2
4494 && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
4495 || (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
4496 || (thumb2
4497 && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
4498 || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
4499 || ((!target_is_thumb)
4500 && (((r_type == elfcpp::R_ARM_THM_CALL) && !may_use_blx)
4501 || (r_type == elfcpp::R_ARM_THM_JUMP24))))
4502 {
4503 if (target_is_thumb)
4504 {
4505 // Thumb to thumb.
4506 if (!thumb_only)
4507 {
51938283
DK
4508 stub_type = (parameters->options().shared()
4509 || should_force_pic_veneer)
b569affa
DK
4510 // PIC stubs.
4511 ? ((may_use_blx
4512 && (r_type == elfcpp::R_ARM_THM_CALL))
4513 // V5T and above. Stub starts with ARM code, so
4514 // we must be able to switch mode before
4515 // reaching it, which is only possible for 'bl'
4516 // (ie R_ARM_THM_CALL relocation).
4517 ? arm_stub_long_branch_any_thumb_pic
4518 // On V4T, use Thumb code only.
4519 : arm_stub_long_branch_v4t_thumb_thumb_pic)
4520
4521 // non-PIC stubs.
4522 : ((may_use_blx
4523 && (r_type == elfcpp::R_ARM_THM_CALL))
4524 ? arm_stub_long_branch_any_any // V5T and above.
4525 : arm_stub_long_branch_v4t_thumb_thumb); // V4T.
4526 }
4527 else
4528 {
51938283
DK
4529 stub_type = (parameters->options().shared()
4530 || should_force_pic_veneer)
b569affa
DK
4531 ? arm_stub_long_branch_thumb_only_pic // PIC stub.
4532 : arm_stub_long_branch_thumb_only; // non-PIC stub.
4533 }
4534 }
4535 else
4536 {
4537 // Thumb to arm.
4538
4539 // FIXME: We should check that the input section is from an
4540 // object that has interwork enabled.
4541
4542 stub_type = (parameters->options().shared()
4543 || should_force_pic_veneer)
4544 // PIC stubs.
4545 ? ((may_use_blx
4546 && (r_type == elfcpp::R_ARM_THM_CALL))
4547 ? arm_stub_long_branch_any_arm_pic // V5T and above.
4548 : arm_stub_long_branch_v4t_thumb_arm_pic) // V4T.
4549
4550 // non-PIC stubs.
4551 : ((may_use_blx
4552 && (r_type == elfcpp::R_ARM_THM_CALL))
4553 ? arm_stub_long_branch_any_any // V5T and above.
4554 : arm_stub_long_branch_v4t_thumb_arm); // V4T.
4555
4556 // Handle v4t short branches.
4557 if ((stub_type == arm_stub_long_branch_v4t_thumb_arm)
4558 && (branch_offset <= THM_MAX_FWD_BRANCH_OFFSET)
4559 && (branch_offset >= THM_MAX_BWD_BRANCH_OFFSET))
4560 stub_type = arm_stub_short_branch_v4t_thumb_arm;
4561 }
4562 }
4563 }
4564 else if (r_type == elfcpp::R_ARM_CALL
4565 || r_type == elfcpp::R_ARM_JUMP24
4566 || r_type == elfcpp::R_ARM_PLT32)
4567 {
a2c7281b 4568 branch_offset = static_cast<int64_t>(destination) - location;
b569affa
DK
4569 if (target_is_thumb)
4570 {
4571 // Arm to thumb.
4572
4573 // FIXME: We should check that the input section is from an
4574 // object that has interwork enabled.
4575
4576 // We have an extra 2-bytes reach because of
4577 // the mode change (bit 24 (H) of BLX encoding).
4578 if (branch_offset > (ARM_MAX_FWD_BRANCH_OFFSET + 2)
4579 || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET)
4580 || ((r_type == elfcpp::R_ARM_CALL) && !may_use_blx)
4581 || (r_type == elfcpp::R_ARM_JUMP24)
4582 || (r_type == elfcpp::R_ARM_PLT32))
4583 {
4584 stub_type = (parameters->options().shared()
4585 || should_force_pic_veneer)
4586 // PIC stubs.
4587 ? (may_use_blx
4588 ? arm_stub_long_branch_any_thumb_pic// V5T and above.
4589 : arm_stub_long_branch_v4t_arm_thumb_pic) // V4T stub.
4590
4591 // non-PIC stubs.
4592 : (may_use_blx
4593 ? arm_stub_long_branch_any_any // V5T and above.
4594 : arm_stub_long_branch_v4t_arm_thumb); // V4T.
4595 }
4596 }
4597 else
4598 {
4599 // Arm to arm.
4600 if (branch_offset > ARM_MAX_FWD_BRANCH_OFFSET
4601 || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET))
4602 {
4603 stub_type = (parameters->options().shared()
4604 || should_force_pic_veneer)
4605 ? arm_stub_long_branch_any_arm_pic // PIC stubs.
4606 : arm_stub_long_branch_any_any; /// non-PIC.
4607 }
4608 }
4609 }
4610
4611 return stub_type;
4612}
4613
bb0d3eb0 4614// Cortex_a8_stub methods.
b569affa 4615
bb0d3eb0
DK
4616// Return the instruction for a THUMB16_SPECIAL_TYPE instruction template.
4617// I is the position of the instruction template in the stub template.
b569affa 4618
bb0d3eb0
DK
4619uint16_t
4620Cortex_a8_stub::do_thumb16_special(size_t i)
b569affa 4621{
bb0d3eb0
DK
4622 // The only use of this is to copy condition code from a conditional
4623 // branch being worked around to the corresponding conditional branch in
4624 // to the stub.
4625 gold_assert(this->stub_template()->type() == arm_stub_a8_veneer_b_cond
4626 && i == 0);
4627 uint16_t data = this->stub_template()->insns()[i].data();
4628 gold_assert((data & 0xff00U) == 0xd000U);
4629 data |= ((this->original_insn_ >> 22) & 0xf) << 8;
4630 return data;
b569affa
DK
4631}
4632
4633// Stub_factory methods.
4634
4635Stub_factory::Stub_factory()
4636{
4637 // The instruction template sequences are declared as static
4638 // objects and initialized first time the constructor runs.
4639
4640 // Arm/Thumb -> Arm/Thumb long branch stub. On V5T and above, use blx
4641 // to reach the stub if necessary.
4642 static const Insn_template elf32_arm_stub_long_branch_any_any[] =
4643 {
4644 Insn_template::arm_insn(0xe51ff004), // ldr pc, [pc, #-4]
4645 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4646 // dcd R_ARM_ABS32(X)
4647 };
4648
4649 // V4T Arm -> Thumb long branch stub. Used on V4T where blx is not
4650 // available.
4651 static const Insn_template elf32_arm_stub_long_branch_v4t_arm_thumb[] =
4652 {
4653 Insn_template::arm_insn(0xe59fc000), // ldr ip, [pc, #0]
4654 Insn_template::arm_insn(0xe12fff1c), // bx ip
4655 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4656 // dcd R_ARM_ABS32(X)
4657 };
4658
4659 // Thumb -> Thumb long branch stub. Used on M-profile architectures.
4660 static const Insn_template elf32_arm_stub_long_branch_thumb_only[] =
4661 {
4662 Insn_template::thumb16_insn(0xb401), // push {r0}
4663 Insn_template::thumb16_insn(0x4802), // ldr r0, [pc, #8]
4664 Insn_template::thumb16_insn(0x4684), // mov ip, r0
4665 Insn_template::thumb16_insn(0xbc01), // pop {r0}
4666 Insn_template::thumb16_insn(0x4760), // bx ip
4667 Insn_template::thumb16_insn(0xbf00), // nop
4668 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4669 // dcd R_ARM_ABS32(X)
4670 };
4671
4672 // V4T Thumb -> Thumb long branch stub. Using the stack is not
4673 // allowed.
4674 static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_thumb[] =
4675 {
4676 Insn_template::thumb16_insn(0x4778), // bx pc
4677 Insn_template::thumb16_insn(0x46c0), // nop
4678 Insn_template::arm_insn(0xe59fc000), // ldr ip, [pc, #0]
4679 Insn_template::arm_insn(0xe12fff1c), // bx ip
4680 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4681 // dcd R_ARM_ABS32(X)
4682 };
4683
4684 // V4T Thumb -> ARM long branch stub. Used on V4T where blx is not
4685 // available.
4686 static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_arm[] =
4687 {
4688 Insn_template::thumb16_insn(0x4778), // bx pc
4689 Insn_template::thumb16_insn(0x46c0), // nop
4690 Insn_template::arm_insn(0xe51ff004), // ldr pc, [pc, #-4]
4691 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4692 // dcd R_ARM_ABS32(X)
4693 };
4694
4695 // V4T Thumb -> ARM short branch stub. Shorter variant of the above
4696 // one, when the destination is close enough.
4697 static const Insn_template elf32_arm_stub_short_branch_v4t_thumb_arm[] =
4698 {
4699 Insn_template::thumb16_insn(0x4778), // bx pc
4700 Insn_template::thumb16_insn(0x46c0), // nop
4701 Insn_template::arm_rel_insn(0xea000000, -8), // b (X-8)
4702 };
4703
4704 // ARM/Thumb -> ARM long branch stub, PIC. On V5T and above, use
4705 // blx to reach the stub if necessary.
4706 static const Insn_template elf32_arm_stub_long_branch_any_arm_pic[] =
4707 {
4708 Insn_template::arm_insn(0xe59fc000), // ldr r12, [pc]
4709 Insn_template::arm_insn(0xe08ff00c), // add pc, pc, ip
4710 Insn_template::data_word(0, elfcpp::R_ARM_REL32, -4),
4711 // dcd R_ARM_REL32(X-4)
4712 };
4713
4714 // ARM/Thumb -> Thumb long branch stub, PIC. On V5T and above, use
4715 // blx to reach the stub if necessary. We can not add into pc;
4716 // it is not guaranteed to mode switch (different in ARMv6 and
4717 // ARMv7).
4718 static const Insn_template elf32_arm_stub_long_branch_any_thumb_pic[] =
4719 {
4720 Insn_template::arm_insn(0xe59fc004), // ldr r12, [pc, #4]
4721 Insn_template::arm_insn(0xe08fc00c), // add ip, pc, ip
4722 Insn_template::arm_insn(0xe12fff1c), // bx ip
4723 Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
4724 // dcd R_ARM_REL32(X)
4725 };
4726
4727 // V4T ARM -> ARM long branch stub, PIC.
4728 static const Insn_template elf32_arm_stub_long_branch_v4t_arm_thumb_pic[] =
4729 {
4730 Insn_template::arm_insn(0xe59fc004), // ldr ip, [pc, #4]
4731 Insn_template::arm_insn(0xe08fc00c), // add ip, pc, ip
4732 Insn_template::arm_insn(0xe12fff1c), // bx ip
4733 Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
4734 // dcd R_ARM_REL32(X)
4735 };
4736
4737 // V4T Thumb -> ARM long branch stub, PIC.
4738 static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_arm_pic[] =
4739 {
4740 Insn_template::thumb16_insn(0x4778), // bx pc
4741 Insn_template::thumb16_insn(0x46c0), // nop
4742 Insn_template::arm_insn(0xe59fc000), // ldr ip, [pc, #0]
4743 Insn_template::arm_insn(0xe08cf00f), // add pc, ip, pc
4744 Insn_template::data_word(0, elfcpp::R_ARM_REL32, -4),
4745 // dcd R_ARM_REL32(X)
4746 };
4747
4748 // Thumb -> Thumb long branch stub, PIC. Used on M-profile
4749 // architectures.
4750 static const Insn_template elf32_arm_stub_long_branch_thumb_only_pic[] =
4751 {
4752 Insn_template::thumb16_insn(0xb401), // push {r0}
4753 Insn_template::thumb16_insn(0x4802), // ldr r0, [pc, #8]
4754 Insn_template::thumb16_insn(0x46fc), // mov ip, pc
4755 Insn_template::thumb16_insn(0x4484), // add ip, r0
4756 Insn_template::thumb16_insn(0xbc01), // pop {r0}
4757 Insn_template::thumb16_insn(0x4760), // bx ip
4758 Insn_template::data_word(0, elfcpp::R_ARM_REL32, 4),
4759 // dcd R_ARM_REL32(X)
4760 };
4761
4762 // V4T Thumb -> Thumb long branch stub, PIC. Using the stack is not
4763 // allowed.
4764 static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_thumb_pic[] =
4765 {
4766 Insn_template::thumb16_insn(0x4778), // bx pc
4767 Insn_template::thumb16_insn(0x46c0), // nop
4768 Insn_template::arm_insn(0xe59fc004), // ldr ip, [pc, #4]
4769 Insn_template::arm_insn(0xe08fc00c), // add ip, pc, ip
4770 Insn_template::arm_insn(0xe12fff1c), // bx ip
4771 Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
4772 // dcd R_ARM_REL32(X)
4773 };
4774
4775 // Cortex-A8 erratum-workaround stubs.
4776
4777 // Stub used for conditional branches (which may be beyond +/-1MB away,
4778 // so we can't use a conditional branch to reach this stub).
4779
4780 // original code:
4781 //
4782 // b<cond> X
4783 // after:
4784 //
4785 static const Insn_template elf32_arm_stub_a8_veneer_b_cond[] =
4786 {
4787 Insn_template::thumb16_bcond_insn(0xd001), // b<cond>.n true
4788 Insn_template::thumb32_b_insn(0xf000b800, -4), // b.w after
4789 Insn_template::thumb32_b_insn(0xf000b800, -4) // true:
4790 // b.w X
4791 };
4792
4793 // Stub used for b.w and bl.w instructions.
4794
4795 static const Insn_template elf32_arm_stub_a8_veneer_b[] =
4796 {
4797 Insn_template::thumb32_b_insn(0xf000b800, -4) // b.w dest
4798 };
4799
4800 static const Insn_template elf32_arm_stub_a8_veneer_bl[] =
4801 {
4802 Insn_template::thumb32_b_insn(0xf000b800, -4) // b.w dest
4803 };
4804
4805 // Stub used for Thumb-2 blx.w instructions. We modified the original blx.w
4806 // instruction (which switches to ARM mode) to point to this stub. Jump to
4807 // the real destination using an ARM-mode branch.
bb0d3eb0 4808 static const Insn_template elf32_arm_stub_a8_veneer_blx[] =
b569affa
DK
4809 {
4810 Insn_template::arm_rel_insn(0xea000000, -8) // b dest
4811 };
4812
a2162063
ILT
4813 // Stub used to provide an interworking for R_ARM_V4BX relocation
4814 // (bx r[n] instruction).
4815 static const Insn_template elf32_arm_stub_v4_veneer_bx[] =
4816 {
4817 Insn_template::arm_insn(0xe3100001), // tst r<n>, #1
4818 Insn_template::arm_insn(0x01a0f000), // moveq pc, r<n>
4819 Insn_template::arm_insn(0xe12fff10) // bx r<n>
4820 };
4821
b569affa
DK
4822 // Fill in the stub template look-up table. Stub templates are constructed
4823 // per instance of Stub_factory for fast look-up without locking
4824 // in a thread-enabled environment.
4825
4826 this->stub_templates_[arm_stub_none] =
4827 new Stub_template(arm_stub_none, NULL, 0);
4828
4829#define DEF_STUB(x) \
4830 do \
4831 { \
4832 size_t array_size \
4833 = sizeof(elf32_arm_stub_##x) / sizeof(elf32_arm_stub_##x[0]); \
4834 Stub_type type = arm_stub_##x; \
4835 this->stub_templates_[type] = \
4836 new Stub_template(type, elf32_arm_stub_##x, array_size); \
4837 } \
4838 while (0);
4839
4840 DEF_STUBS
4841#undef DEF_STUB
4842}
4843
56ee5e00
DK
4844// Stub_table methods.
4845
9b547ce6 4846// Remove all Cortex-A8 stub.
56ee5e00
DK
4847
4848template<bool big_endian>
4849void
2fb7225c
DK
4850Stub_table<big_endian>::remove_all_cortex_a8_stubs()
4851{
4852 for (Cortex_a8_stub_list::iterator p = this->cortex_a8_stubs_.begin();
4853 p != this->cortex_a8_stubs_.end();
4854 ++p)
4855 delete p->second;
4856 this->cortex_a8_stubs_.clear();
4857}
4858
4859// Relocate one stub. This is a helper for Stub_table::relocate_stubs().
4860
4861template<bool big_endian>
4862void
4863Stub_table<big_endian>::relocate_stub(
4864 Stub* stub,
4865 const Relocate_info<32, big_endian>* relinfo,
4866 Target_arm<big_endian>* arm_target,
4867 Output_section* output_section,
4868 unsigned char* view,
4869 Arm_address address,
4870 section_size_type view_size)
56ee5e00 4871{
2ea97941 4872 const Stub_template* stub_template = stub->stub_template();
2fb7225c
DK
4873 if (stub_template->reloc_count() != 0)
4874 {
4875 // Adjust view to cover the stub only.
4876 section_size_type offset = stub->offset();
4877 section_size_type stub_size = stub_template->size();
4878 gold_assert(offset + stub_size <= view_size);
4879
4880 arm_target->relocate_stub(stub, relinfo, output_section, view + offset,
4881 address + offset, stub_size);
4882 }
56ee5e00
DK
4883}
4884
2fb7225c
DK
4885// Relocate all stubs in this stub table.
4886
56ee5e00
DK
4887template<bool big_endian>
4888void
4889Stub_table<big_endian>::relocate_stubs(
4890 const Relocate_info<32, big_endian>* relinfo,
4891 Target_arm<big_endian>* arm_target,
2ea97941 4892 Output_section* output_section,
56ee5e00 4893 unsigned char* view,
2ea97941 4894 Arm_address address,
56ee5e00
DK
4895 section_size_type view_size)
4896{
4897 // If we are passed a view bigger than the stub table's. we need to
4898 // adjust the view.
2ea97941 4899 gold_assert(address == this->address()
56ee5e00
DK
4900 && (view_size
4901 == static_cast<section_size_type>(this->data_size())));
4902
2fb7225c
DK
4903 // Relocate all relocation stubs.
4904 for (typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.begin();
4905 p != this->reloc_stubs_.end();
4906 ++p)
4907 this->relocate_stub(p->second, relinfo, arm_target, output_section, view,
4908 address, view_size);
4909
4910 // Relocate all Cortex-A8 stubs.
4911 for (Cortex_a8_stub_list::iterator p = this->cortex_a8_stubs_.begin();
4912 p != this->cortex_a8_stubs_.end();
4913 ++p)
4914 this->relocate_stub(p->second, relinfo, arm_target, output_section, view,
4915 address, view_size);
a2162063
ILT
4916
4917 // Relocate all ARM V4BX stubs.
4918 for (Arm_v4bx_stub_list::iterator p = this->arm_v4bx_stubs_.begin();
4919 p != this->arm_v4bx_stubs_.end();
4920 ++p)
4921 {
4922 if (*p != NULL)
4923 this->relocate_stub(*p, relinfo, arm_target, output_section, view,
4924 address, view_size);
4925 }
2fb7225c
DK
4926}
4927
4928// Write out the stubs to file.
4929
4930template<bool big_endian>
4931void
4932Stub_table<big_endian>::do_write(Output_file* of)
4933{
4934 off_t offset = this->offset();
4935 const section_size_type oview_size =
4936 convert_to_section_size_type(this->data_size());
4937 unsigned char* const oview = of->get_output_view(offset, oview_size);
4938
4939 // Write relocation stubs.
56ee5e00
DK
4940 for (typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.begin();
4941 p != this->reloc_stubs_.end();
4942 ++p)
4943 {
4944 Reloc_stub* stub = p->second;
2fb7225c
DK
4945 Arm_address address = this->address() + stub->offset();
4946 gold_assert(address
4947 == align_address(address,
4948 stub->stub_template()->alignment()));
4949 stub->write(oview + stub->offset(), stub->stub_template()->size(),
4950 big_endian);
56ee5e00 4951 }
2fb7225c
DK
4952
4953 // Write Cortex-A8 stubs.
4954 for (Cortex_a8_stub_list::const_iterator p = this->cortex_a8_stubs_.begin();
4955 p != this->cortex_a8_stubs_.end();
4956 ++p)
4957 {
4958 Cortex_a8_stub* stub = p->second;
4959 Arm_address address = this->address() + stub->offset();
4960 gold_assert(address
4961 == align_address(address,
4962 stub->stub_template()->alignment()));
4963 stub->write(oview + stub->offset(), stub->stub_template()->size(),
4964 big_endian);
4965 }
4966
a2162063
ILT
4967 // Write ARM V4BX relocation stubs.
4968 for (Arm_v4bx_stub_list::const_iterator p = this->arm_v4bx_stubs_.begin();
4969 p != this->arm_v4bx_stubs_.end();
4970 ++p)
4971 {
4972 if (*p == NULL)
4973 continue;
4974
4975 Arm_address address = this->address() + (*p)->offset();
4976 gold_assert(address
4977 == align_address(address,
4978 (*p)->stub_template()->alignment()));
4979 (*p)->write(oview + (*p)->offset(), (*p)->stub_template()->size(),
4980 big_endian);
4981 }
4982
2fb7225c 4983 of->write_output_view(this->offset(), oview_size, oview);
56ee5e00
DK
4984}
4985
2fb7225c
DK
4986// Update the data size and address alignment of the stub table at the end
4987// of a relaxation pass. Return true if either the data size or the
4988// alignment changed in this relaxation pass.
4989
4990template<bool big_endian>
4991bool
4992Stub_table<big_endian>::update_data_size_and_addralign()
4993{
2fb7225c 4994 // Go over all stubs in table to compute data size and address alignment.
d099120c
DK
4995 off_t size = this->reloc_stubs_size_;
4996 unsigned addralign = this->reloc_stubs_addralign_;
2fb7225c
DK
4997
4998 for (Cortex_a8_stub_list::const_iterator p = this->cortex_a8_stubs_.begin();
4999 p != this->cortex_a8_stubs_.end();
5000 ++p)
5001 {
5002 const Stub_template* stub_template = p->second->stub_template();
5003 addralign = std::max(addralign, stub_template->alignment());
5004 size = (align_address(size, stub_template->alignment())
5005 + stub_template->size());
5006 }
5007
a2162063
ILT
5008 for (Arm_v4bx_stub_list::const_iterator p = this->arm_v4bx_stubs_.begin();
5009 p != this->arm_v4bx_stubs_.end();
5010 ++p)
5011 {
5012 if (*p == NULL)
5013 continue;
5014
5015 const Stub_template* stub_template = (*p)->stub_template();
5016 addralign = std::max(addralign, stub_template->alignment());
5017 size = (align_address(size, stub_template->alignment())
5018 + stub_template->size());
5019 }
5020
2fb7225c
DK
5021 // Check if either data size or alignment changed in this pass.
5022 // Update prev_data_size_ and prev_addralign_. These will be used
5023 // as the current data size and address alignment for the next pass.
5024 bool changed = size != this->prev_data_size_;
5025 this->prev_data_size_ = size;
5026
5027 if (addralign != this->prev_addralign_)
5028 changed = true;
5029 this->prev_addralign_ = addralign;
5030
5031 return changed;
5032}
5033
5034// Finalize the stubs. This sets the offsets of the stubs within the stub
5035// table. It also marks all input sections needing Cortex-A8 workaround.
56ee5e00
DK
5036
5037template<bool big_endian>
5038void
2fb7225c 5039Stub_table<big_endian>::finalize_stubs()
56ee5e00 5040{
d099120c 5041 off_t off = this->reloc_stubs_size_;
2fb7225c
DK
5042 for (Cortex_a8_stub_list::const_iterator p = this->cortex_a8_stubs_.begin();
5043 p != this->cortex_a8_stubs_.end();
5044 ++p)
5045 {
5046 Cortex_a8_stub* stub = p->second;
5047 const Stub_template* stub_template = stub->stub_template();
5048 uint64_t stub_addralign = stub_template->alignment();
5049 off = align_address(off, stub_addralign);
5050 stub->set_offset(off);
5051 off += stub_template->size();
5052
5053 // Mark input section so that we can determine later if a code section
5054 // needs the Cortex-A8 workaround quickly.
5055 Arm_relobj<big_endian>* arm_relobj =
5056 Arm_relobj<big_endian>::as_arm_relobj(stub->relobj());
5057 arm_relobj->mark_section_for_cortex_a8_workaround(stub->shndx());
5058 }
5059
a2162063
ILT
5060 for (Arm_v4bx_stub_list::const_iterator p = this->arm_v4bx_stubs_.begin();
5061 p != this->arm_v4bx_stubs_.end();
5062 ++p)
5063 {
5064 if (*p == NULL)
5065 continue;
5066
5067 const Stub_template* stub_template = (*p)->stub_template();
5068 uint64_t stub_addralign = stub_template->alignment();
5069 off = align_address(off, stub_addralign);
5070 (*p)->set_offset(off);
5071 off += stub_template->size();
5072 }
5073
2fb7225c 5074 gold_assert(off <= this->prev_data_size_);
56ee5e00
DK
5075}
5076
2fb7225c
DK
5077// Apply Cortex-A8 workaround to an address range between VIEW_ADDRESS
5078// and VIEW_ADDRESS + VIEW_SIZE - 1. VIEW points to the mapped address
5079// of the address range seen by the linker.
56ee5e00
DK
5080
5081template<bool big_endian>
5082void
2fb7225c
DK
5083Stub_table<big_endian>::apply_cortex_a8_workaround_to_address_range(
5084 Target_arm<big_endian>* arm_target,
5085 unsigned char* view,
5086 Arm_address view_address,
5087 section_size_type view_size)
56ee5e00 5088{
2fb7225c
DK
5089 // Cortex-A8 stubs are sorted by addresses of branches being fixed up.
5090 for (Cortex_a8_stub_list::const_iterator p =
5091 this->cortex_a8_stubs_.lower_bound(view_address);
5092 ((p != this->cortex_a8_stubs_.end())
5093 && (p->first < (view_address + view_size)));
5094 ++p)
56ee5e00 5095 {
2fb7225c
DK
5096 // We do not store the THUMB bit in the LSB of either the branch address
5097 // or the stub offset. There is no need to strip the LSB.
5098 Arm_address branch_address = p->first;
5099 const Cortex_a8_stub* stub = p->second;
5100 Arm_address stub_address = this->address() + stub->offset();
5101
5102 // Offset of the branch instruction relative to this view.
5103 section_size_type offset =
5104 convert_to_section_size_type(branch_address - view_address);
5105 gold_assert((offset + 4) <= view_size);
5106
5107 arm_target->apply_cortex_a8_workaround(stub, stub_address,
5108 view + offset, branch_address);
5109 }
56ee5e00
DK
5110}
5111
10ad9fe5
DK
5112// Arm_input_section methods.
5113
5114// Initialize an Arm_input_section.
5115
5116template<bool big_endian>
5117void
5118Arm_input_section<big_endian>::init()
5119{
2ea97941
ILT
5120 Relobj* relobj = this->relobj();
5121 unsigned int shndx = this->shndx();
10ad9fe5 5122
f625ae50
DK
5123 // We have to cache original size, alignment and contents to avoid locking
5124 // the original file.
6625d24e
DK
5125 this->original_addralign_ =
5126 convert_types<uint32_t, uint64_t>(relobj->section_addralign(shndx));
f625ae50
DK
5127
5128 // This is not efficient but we expect only a small number of relaxed
5129 // input sections for stubs.
5130 section_size_type section_size;
5131 const unsigned char* section_contents =
5132 relobj->section_contents(shndx, &section_size, false);
6625d24e
DK
5133 this->original_size_ =
5134 convert_types<uint32_t, uint64_t>(relobj->section_size(shndx));
10ad9fe5 5135
f625ae50
DK
5136 gold_assert(this->original_contents_ == NULL);
5137 this->original_contents_ = new unsigned char[section_size];
5138 memcpy(this->original_contents_, section_contents, section_size);
5139
10ad9fe5
DK
5140 // We want to make this look like the original input section after
5141 // output sections are finalized.
2ea97941
ILT
5142 Output_section* os = relobj->output_section(shndx);
5143 off_t offset = relobj->output_section_offset(shndx);
5144 gold_assert(os != NULL && !relobj->is_output_section_offset_invalid(shndx));
5145 this->set_address(os->address() + offset);
5146 this->set_file_offset(os->offset() + offset);
10ad9fe5
DK
5147
5148 this->set_current_data_size(this->original_size_);
5149 this->finalize_data_size();
5150}
5151
5152template<bool big_endian>
5153void
5154Arm_input_section<big_endian>::do_write(Output_file* of)
5155{
5156 // We have to write out the original section content.
f625ae50
DK
5157 gold_assert(this->original_contents_ != NULL);
5158 of->write(this->offset(), this->original_contents_,
5159 this->original_size_);
10ad9fe5
DK
5160
5161 // If this owns a stub table and it is not empty, write it.
5162 if (this->is_stub_table_owner() && !this->stub_table_->empty())
5163 this->stub_table_->write(of);
5164}
5165
5166// Finalize data size.
5167
5168template<bool big_endian>
5169void
5170Arm_input_section<big_endian>::set_final_data_size()
5171{
153e7da4
DK
5172 off_t off = convert_types<off_t, uint64_t>(this->original_size_);
5173
10ad9fe5
DK
5174 if (this->is_stub_table_owner())
5175 {
6625d24e 5176 this->stub_table_->finalize_data_size();
153e7da4 5177 off = align_address(off, this->stub_table_->addralign());
153e7da4 5178 off += this->stub_table_->data_size();
10ad9fe5 5179 }
153e7da4 5180 this->set_data_size(off);
10ad9fe5
DK
5181}
5182
5183// Reset address and file offset.
5184
5185template<bool big_endian>
5186void
5187Arm_input_section<big_endian>::do_reset_address_and_file_offset()
5188{
5189 // Size of the original input section contents.
5190 off_t off = convert_types<off_t, uint64_t>(this->original_size_);
5191
5192 // If this is a stub table owner, account for the stub table size.
5193 if (this->is_stub_table_owner())
5194 {
2ea97941 5195 Stub_table<big_endian>* stub_table = this->stub_table_;
10ad9fe5
DK
5196
5197 // Reset the stub table's address and file offset. The
5198 // current data size for child will be updated after that.
5199 stub_table_->reset_address_and_file_offset();
5200 off = align_address(off, stub_table_->addralign());
2ea97941 5201 off += stub_table->current_data_size();
10ad9fe5
DK
5202 }
5203
5204 this->set_current_data_size(off);
5205}
5206
af2cdeae
DK
5207// Arm_exidx_cantunwind methods.
5208
7296d933 5209// Write this to Output file OF for a fixed endianness.
af2cdeae
DK
5210
5211template<bool big_endian>
5212void
5213Arm_exidx_cantunwind::do_fixed_endian_write(Output_file* of)
5214{
5215 off_t offset = this->offset();
5216 const section_size_type oview_size = 8;
5217 unsigned char* const oview = of->get_output_view(offset, oview_size);
5218
5219 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
5220 Valtype* wv = reinterpret_cast<Valtype*>(oview);
5221
5222 Output_section* os = this->relobj_->output_section(this->shndx_);
5223 gold_assert(os != NULL);
5224
5225 Arm_relobj<big_endian>* arm_relobj =
5226 Arm_relobj<big_endian>::as_arm_relobj(this->relobj_);
5227 Arm_address output_offset =
5228 arm_relobj->get_output_section_offset(this->shndx_);
5229 Arm_address section_start;
f625ae50
DK
5230 section_size_type section_size;
5231
5232 // Find out the end of the text section referred by this.
7296d933 5233 if (output_offset != Arm_relobj<big_endian>::invalid_address)
f625ae50
DK
5234 {
5235 section_start = os->address() + output_offset;
5236 const Arm_exidx_input_section* exidx_input_section =
5237 arm_relobj->exidx_input_section_by_link(this->shndx_);
5238 gold_assert(exidx_input_section != NULL);
5239 section_size =
5240 convert_to_section_size_type(exidx_input_section->text_size());
5241 }
af2cdeae
DK
5242 else
5243 {
5244 // Currently this only happens for a relaxed section.
5245 const Output_relaxed_input_section* poris =
5246 os->find_relaxed_input_section(this->relobj_, this->shndx_);
5247 gold_assert(poris != NULL);
5248 section_start = poris->address();
f625ae50 5249 section_size = convert_to_section_size_type(poris->data_size());
af2cdeae
DK
5250 }
5251
5252 // We always append this to the end of an EXIDX section.
f625ae50 5253 Arm_address output_address = section_start + section_size;
af2cdeae
DK
5254
5255 // Write out the entry. The first word either points to the beginning
5256 // or after the end of a text section. The second word is the special
5257 // EXIDX_CANTUNWIND value.
e7eca48c
DK
5258 uint32_t prel31_offset = output_address - this->address();
5259 if (utils::has_overflow<31>(offset))
5260 gold_error(_("PREL31 overflow in EXIDX_CANTUNWIND entry"));
5261 elfcpp::Swap<32, big_endian>::writeval(wv, prel31_offset & 0x7fffffffU);
af2cdeae
DK
5262 elfcpp::Swap<32, big_endian>::writeval(wv + 1, elfcpp::EXIDX_CANTUNWIND);
5263
5264 of->write_output_view(this->offset(), oview_size, oview);
5265}
5266
5267// Arm_exidx_merged_section methods.
5268
5269// Constructor for Arm_exidx_merged_section.
5270// EXIDX_INPUT_SECTION points to the unmodified EXIDX input section.
5271// SECTION_OFFSET_MAP points to a section offset map describing how
5272// parts of the input section are mapped to output. DELETED_BYTES is
5273// the number of bytes deleted from the EXIDX input section.
5274
5275Arm_exidx_merged_section::Arm_exidx_merged_section(
5276 const Arm_exidx_input_section& exidx_input_section,
5277 const Arm_exidx_section_offset_map& section_offset_map,
5278 uint32_t deleted_bytes)
5279 : Output_relaxed_input_section(exidx_input_section.relobj(),
5280 exidx_input_section.shndx(),
5281 exidx_input_section.addralign()),
5282 exidx_input_section_(exidx_input_section),
5283 section_offset_map_(section_offset_map)
5284{
f625ae50
DK
5285 // If we retain or discard the whole EXIDX input section, we would
5286 // not be here.
5287 gold_assert(deleted_bytes != 0
5288 && deleted_bytes != this->exidx_input_section_.size());
5289
af2cdeae 5290 // Fix size here so that we do not need to implement set_final_data_size.
f625ae50
DK
5291 uint32_t size = exidx_input_section.size() - deleted_bytes;
5292 this->set_data_size(size);
af2cdeae 5293 this->fix_data_size();
f625ae50
DK
5294
5295 // Allocate buffer for section contents and build contents.
5296 this->section_contents_ = new unsigned char[size];
5297}
5298
5299// Build the contents of a merged EXIDX output section.
5300
5301void
5302Arm_exidx_merged_section::build_contents(
5303 const unsigned char* original_contents,
5304 section_size_type original_size)
5305{
5306 // Go over spans of input offsets and write only those that are not
5307 // discarded.
5308 section_offset_type in_start = 0;
5309 section_offset_type out_start = 0;
5310 section_offset_type in_max =
5311 convert_types<section_offset_type>(original_size);
5312 section_offset_type out_max =
5313 convert_types<section_offset_type>(this->data_size());
5314 for (Arm_exidx_section_offset_map::const_iterator p =
5315 this->section_offset_map_.begin();
5316 p != this->section_offset_map_.end();
5317 ++p)
5318 {
5319 section_offset_type in_end = p->first;
5320 gold_assert(in_end >= in_start);
5321 section_offset_type out_end = p->second;
5322 size_t in_chunk_size = convert_types<size_t>(in_end - in_start + 1);
5323 if (out_end != -1)
5324 {
5325 size_t out_chunk_size =
5326 convert_types<size_t>(out_end - out_start + 1);
5327
5328 gold_assert(out_chunk_size == in_chunk_size
5329 && in_end < in_max && out_end < out_max);
5330
5331 memcpy(this->section_contents_ + out_start,
5332 original_contents + in_start,
5333 out_chunk_size);
5334 out_start += out_chunk_size;
5335 }
5336 in_start += in_chunk_size;
5337 }
af2cdeae
DK
5338}
5339
5340// Given an input OBJECT, an input section index SHNDX within that
5341// object, and an OFFSET relative to the start of that input
5342// section, return whether or not the corresponding offset within
5343// the output section is known. If this function returns true, it
5344// sets *POUTPUT to the output offset. The value -1 indicates that
5345// this input offset is being discarded.
5346
5347bool
5348Arm_exidx_merged_section::do_output_offset(
5349 const Relobj* relobj,
5350 unsigned int shndx,
5351 section_offset_type offset,
5352 section_offset_type* poutput) const
5353{
5354 // We only handle offsets for the original EXIDX input section.
5355 if (relobj != this->exidx_input_section_.relobj()
5356 || shndx != this->exidx_input_section_.shndx())
5357 return false;
5358
c7f3c371
DK
5359 section_offset_type section_size =
5360 convert_types<section_offset_type>(this->exidx_input_section_.size());
5361 if (offset < 0 || offset >= section_size)
af2cdeae
DK
5362 // Input offset is out of valid range.
5363 *poutput = -1;
5364 else
5365 {
5366 // We need to look up the section offset map to determine the output
5367 // offset. Find the reference point in map that is first offset
5368 // bigger than or equal to this offset.
5369 Arm_exidx_section_offset_map::const_iterator p =
5370 this->section_offset_map_.lower_bound(offset);
5371
5372 // The section offset maps are build such that this should not happen if
5373 // input offset is in the valid range.
5374 gold_assert(p != this->section_offset_map_.end());
5375
5376 // We need to check if this is dropped.
5377 section_offset_type ref = p->first;
5378 section_offset_type mapped_ref = p->second;
5379
5380 if (mapped_ref != Arm_exidx_input_section::invalid_offset)
5381 // Offset is present in output.
5382 *poutput = mapped_ref + (offset - ref);
5383 else
5384 // Offset is discarded owing to EXIDX entry merging.
5385 *poutput = -1;
5386 }
5387
5388 return true;
5389}
5390
5391// Write this to output file OF.
5392
5393void
5394Arm_exidx_merged_section::do_write(Output_file* of)
5395{
af2cdeae
DK
5396 off_t offset = this->offset();
5397 const section_size_type oview_size = this->data_size();
5398 unsigned char* const oview = of->get_output_view(offset, oview_size);
5399
5400 Output_section* os = this->relobj()->output_section(this->shndx());
5401 gold_assert(os != NULL);
5402
f625ae50 5403 memcpy(oview, this->section_contents_, oview_size);
af2cdeae
DK
5404 of->write_output_view(this->offset(), oview_size, oview);
5405}
5406
80d0d023
DK
5407// Arm_exidx_fixup methods.
5408
5409// Append an EXIDX_CANTUNWIND in the current output section if the last entry
5410// is not an EXIDX_CANTUNWIND entry already. The new EXIDX_CANTUNWIND entry
5411// points to the end of the last seen EXIDX section.
5412
5413void
5414Arm_exidx_fixup::add_exidx_cantunwind_as_needed()
5415{
5416 if (this->last_unwind_type_ != UT_EXIDX_CANTUNWIND
5417 && this->last_input_section_ != NULL)
5418 {
5419 Relobj* relobj = this->last_input_section_->relobj();
2b328d4e 5420 unsigned int text_shndx = this->last_input_section_->link();
80d0d023 5421 Arm_exidx_cantunwind* cantunwind =
2b328d4e 5422 new Arm_exidx_cantunwind(relobj, text_shndx);
80d0d023
DK
5423 this->exidx_output_section_->add_output_section_data(cantunwind);
5424 this->last_unwind_type_ = UT_EXIDX_CANTUNWIND;
5425 }
5426}
5427
5428// Process an EXIDX section entry in input. Return whether this entry
5429// can be deleted in the output. SECOND_WORD in the second word of the
5430// EXIDX entry.
5431
5432bool
5433Arm_exidx_fixup::process_exidx_entry(uint32_t second_word)
5434{
5435 bool delete_entry;
5436 if (second_word == elfcpp::EXIDX_CANTUNWIND)
5437 {
5438 // Merge if previous entry is also an EXIDX_CANTUNWIND.
5439 delete_entry = this->last_unwind_type_ == UT_EXIDX_CANTUNWIND;
5440 this->last_unwind_type_ = UT_EXIDX_CANTUNWIND;
5441 }
5442 else if ((second_word & 0x80000000) != 0)
5443 {
5444 // Inlined unwinding data. Merge if equal to previous.
85fdf906
AH
5445 delete_entry = (merge_exidx_entries_
5446 && this->last_unwind_type_ == UT_INLINED_ENTRY
80d0d023
DK
5447 && this->last_inlined_entry_ == second_word);
5448 this->last_unwind_type_ = UT_INLINED_ENTRY;
5449 this->last_inlined_entry_ = second_word;
5450 }
5451 else
5452 {
5453 // Normal table entry. In theory we could merge these too,
5454 // but duplicate entries are likely to be much less common.
5455 delete_entry = false;
5456 this->last_unwind_type_ = UT_NORMAL_ENTRY;
5457 }
5458 return delete_entry;
5459}
5460
5461// Update the current section offset map during EXIDX section fix-up.
5462// If there is no map, create one. INPUT_OFFSET is the offset of a
5463// reference point, DELETED_BYTES is the number of deleted by in the
5464// section so far. If DELETE_ENTRY is true, the reference point and
5465// all offsets after the previous reference point are discarded.
5466
5467void
5468Arm_exidx_fixup::update_offset_map(
5469 section_offset_type input_offset,
5470 section_size_type deleted_bytes,
5471 bool delete_entry)
5472{
5473 if (this->section_offset_map_ == NULL)
5474 this->section_offset_map_ = new Arm_exidx_section_offset_map();
4fcd97eb
DK
5475 section_offset_type output_offset;
5476 if (delete_entry)
5477 output_offset = Arm_exidx_input_section::invalid_offset;
5478 else
5479 output_offset = input_offset - deleted_bytes;
80d0d023
DK
5480 (*this->section_offset_map_)[input_offset] = output_offset;
5481}
5482
5483// Process EXIDX_INPUT_SECTION for EXIDX entry merging. Return the number of
f625ae50
DK
5484// bytes deleted. SECTION_CONTENTS points to the contents of the EXIDX
5485// section and SECTION_SIZE is the number of bytes pointed by SECTION_CONTENTS.
5486// If some entries are merged, also store a pointer to a newly created
5487// Arm_exidx_section_offset_map object in *PSECTION_OFFSET_MAP. The caller
5488// owns the map and is responsible for releasing it after use.
80d0d023
DK
5489
5490template<bool big_endian>
5491uint32_t
5492Arm_exidx_fixup::process_exidx_section(
5493 const Arm_exidx_input_section* exidx_input_section,
f625ae50
DK
5494 const unsigned char* section_contents,
5495 section_size_type section_size,
80d0d023
DK
5496 Arm_exidx_section_offset_map** psection_offset_map)
5497{
5498 Relobj* relobj = exidx_input_section->relobj();
5499 unsigned shndx = exidx_input_section->shndx();
80d0d023
DK
5500
5501 if ((section_size % 8) != 0)
5502 {
5503 // Something is wrong with this section. Better not touch it.
5504 gold_error(_("uneven .ARM.exidx section size in %s section %u"),
5505 relobj->name().c_str(), shndx);
5506 this->last_input_section_ = exidx_input_section;
5507 this->last_unwind_type_ = UT_NONE;
5508 return 0;
5509 }
5510
5511 uint32_t deleted_bytes = 0;
5512 bool prev_delete_entry = false;
5513 gold_assert(this->section_offset_map_ == NULL);
5514
5515 for (section_size_type i = 0; i < section_size; i += 8)
5516 {
5517 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
5518 const Valtype* wv =
5519 reinterpret_cast<const Valtype*>(section_contents + i + 4);
5520 uint32_t second_word = elfcpp::Swap<32, big_endian>::readval(wv);
5521
5522 bool delete_entry = this->process_exidx_entry(second_word);
5523
5524 // Entry deletion causes changes in output offsets. We use a std::map
5525 // to record these. And entry (x, y) means input offset x
5526 // is mapped to output offset y. If y is invalid_offset, then x is
5527 // dropped in the output. Because of the way std::map::lower_bound
5528 // works, we record the last offset in a region w.r.t to keeping or
5529 // dropping. If there is no entry (x0, y0) for an input offset x0,
5530 // the output offset y0 of it is determined by the output offset y1 of
5531 // the smallest input offset x1 > x0 that there is an (x1, y1) entry
9b547ce6 5532 // in the map. If y1 is not -1, then y0 = y1 + x0 - x1. Otherwise, y1
80d0d023
DK
5533 // y0 is also -1.
5534 if (delete_entry != prev_delete_entry && i != 0)
5535 this->update_offset_map(i - 1, deleted_bytes, prev_delete_entry);
5536
5537 // Update total deleted bytes for this entry.
5538 if (delete_entry)
5539 deleted_bytes += 8;
5540
5541 prev_delete_entry = delete_entry;
5542 }
5543
5544 // If section offset map is not NULL, make an entry for the end of
5545 // section.
5546 if (this->section_offset_map_ != NULL)
5547 update_offset_map(section_size - 1, deleted_bytes, prev_delete_entry);
5548
5549 *psection_offset_map = this->section_offset_map_;
5550 this->section_offset_map_ = NULL;
5551 this->last_input_section_ = exidx_input_section;
5552
546c7457
DK
5553 // Set the first output text section so that we can link the EXIDX output
5554 // section to it. Ignore any EXIDX input section that is completely merged.
5555 if (this->first_output_text_section_ == NULL
5556 && deleted_bytes != section_size)
5557 {
5558 unsigned int link = exidx_input_section->link();
5559 Output_section* os = relobj->output_section(link);
5560 gold_assert(os != NULL);
5561 this->first_output_text_section_ = os;
5562 }
5563
80d0d023
DK
5564 return deleted_bytes;
5565}
5566
07f508a2
DK
5567// Arm_output_section methods.
5568
5569// Create a stub group for input sections from BEGIN to END. OWNER
5570// points to the input section to be the owner a new stub table.
5571
5572template<bool big_endian>
5573void
5574Arm_output_section<big_endian>::create_stub_group(
5575 Input_section_list::const_iterator begin,
5576 Input_section_list::const_iterator end,
5577 Input_section_list::const_iterator owner,
5578 Target_arm<big_endian>* target,
f625ae50
DK
5579 std::vector<Output_relaxed_input_section*>* new_relaxed_sections,
5580 const Task* task)
07f508a2 5581{
2b328d4e
DK
5582 // We use a different kind of relaxed section in an EXIDX section.
5583 // The static casting from Output_relaxed_input_section to
5584 // Arm_input_section is invalid in an EXIDX section. We are okay
5585 // because we should not be calling this for an EXIDX section.
5586 gold_assert(this->type() != elfcpp::SHT_ARM_EXIDX);
5587
07f508a2
DK
5588 // Currently we convert ordinary input sections into relaxed sections only
5589 // at this point but we may want to support creating relaxed input section
5590 // very early. So we check here to see if owner is already a relaxed
5591 // section.
5592
5593 Arm_input_section<big_endian>* arm_input_section;
5594 if (owner->is_relaxed_input_section())
5595 {
5596 arm_input_section =
5597 Arm_input_section<big_endian>::as_arm_input_section(
5598 owner->relaxed_input_section());
5599 }
5600 else
5601 {
5602 gold_assert(owner->is_input_section());
f625ae50
DK
5603 // Create a new relaxed input section. We need to lock the original
5604 // file.
5605 Task_lock_obj<Object> tl(task, owner->relobj());
07f508a2
DK
5606 arm_input_section =
5607 target->new_arm_input_section(owner->relobj(), owner->shndx());
5608 new_relaxed_sections->push_back(arm_input_section);
5609 }
5610
5611 // Create a stub table.
2ea97941 5612 Stub_table<big_endian>* stub_table =
07f508a2
DK
5613 target->new_stub_table(arm_input_section);
5614
2ea97941 5615 arm_input_section->set_stub_table(stub_table);
07f508a2
DK
5616
5617 Input_section_list::const_iterator p = begin;
5618 Input_section_list::const_iterator prev_p;
5619
5620 // Look for input sections or relaxed input sections in [begin ... end].
5621 do
5622 {
5623 if (p->is_input_section() || p->is_relaxed_input_section())
5624 {
5625 // The stub table information for input sections live
5626 // in their objects.
5627 Arm_relobj<big_endian>* arm_relobj =
5628 Arm_relobj<big_endian>::as_arm_relobj(p->relobj());
2ea97941 5629 arm_relobj->set_stub_table(p->shndx(), stub_table);
07f508a2
DK
5630 }
5631 prev_p = p++;
5632 }
5633 while (prev_p != end);
5634}
5635
5636// Group input sections for stub generation. GROUP_SIZE is roughly the limit
5637// of stub groups. We grow a stub group by adding input section until the
5638// size is just below GROUP_SIZE. The last input section will be converted
5639// into a stub table. If STUB_ALWAYS_AFTER_BRANCH is false, we also add
5640// input section after the stub table, effectively double the group size.
5641//
5642// This is similar to the group_sections() function in elf32-arm.c but is
5643// implemented differently.
5644
5645template<bool big_endian>
5646void
5647Arm_output_section<big_endian>::group_sections(
5648 section_size_type group_size,
5649 bool stubs_always_after_branch,
f625ae50
DK
5650 Target_arm<big_endian>* target,
5651 const Task* task)
07f508a2
DK
5652{
5653 // We only care about sections containing code.
5654 if ((this->flags() & elfcpp::SHF_EXECINSTR) == 0)
5655 return;
5656
5657 // States for grouping.
5658 typedef enum
5659 {
5660 // No group is being built.
5661 NO_GROUP,
5662 // A group is being built but the stub table is not found yet.
5663 // We keep group a stub group until the size is just under GROUP_SIZE.
5664 // The last input section in the group will be used as the stub table.
5665 FINDING_STUB_SECTION,
5666 // A group is being built and we have already found a stub table.
5667 // We enter this state to grow a stub group by adding input section
5668 // after the stub table. This effectively doubles the group size.
5669 HAS_STUB_SECTION
5670 } State;
5671
5672 // Any newly created relaxed sections are stored here.
5673 std::vector<Output_relaxed_input_section*> new_relaxed_sections;
5674
5675 State state = NO_GROUP;
5676 section_size_type off = 0;
5677 section_size_type group_begin_offset = 0;
5678 section_size_type group_end_offset = 0;
5679 section_size_type stub_table_end_offset = 0;
5680 Input_section_list::const_iterator group_begin =
5681 this->input_sections().end();
2ea97941 5682 Input_section_list::const_iterator stub_table =
07f508a2
DK
5683 this->input_sections().end();
5684 Input_section_list::const_iterator group_end = this->input_sections().end();
5685 for (Input_section_list::const_iterator p = this->input_sections().begin();
5686 p != this->input_sections().end();
5687 ++p)
5688 {
5689 section_size_type section_begin_offset =
5690 align_address(off, p->addralign());
5691 section_size_type section_end_offset =
5692 section_begin_offset + p->data_size();
5693
9b547ce6 5694 // Check to see if we should group the previously seen sections.
e9bbb538 5695 switch (state)
07f508a2
DK
5696 {
5697 case NO_GROUP:
5698 break;
5699
5700 case FINDING_STUB_SECTION:
5701 // Adding this section makes the group larger than GROUP_SIZE.
5702 if (section_end_offset - group_begin_offset >= group_size)
5703 {
5704 if (stubs_always_after_branch)
5705 {
5706 gold_assert(group_end != this->input_sections().end());
5707 this->create_stub_group(group_begin, group_end, group_end,
f625ae50
DK
5708 target, &new_relaxed_sections,
5709 task);
07f508a2
DK
5710 state = NO_GROUP;
5711 }
5712 else
5713 {
5714 // But wait, there's more! Input sections up to
5715 // stub_group_size bytes after the stub table can be
5716 // handled by it too.
5717 state = HAS_STUB_SECTION;
2ea97941 5718 stub_table = group_end;
07f508a2
DK
5719 stub_table_end_offset = group_end_offset;
5720 }
5721 }
5722 break;
5723
5724 case HAS_STUB_SECTION:
5725 // Adding this section makes the post stub-section group larger
5726 // than GROUP_SIZE.
5727 if (section_end_offset - stub_table_end_offset >= group_size)
5728 {
5729 gold_assert(group_end != this->input_sections().end());
2ea97941 5730 this->create_stub_group(group_begin, group_end, stub_table,
f625ae50 5731 target, &new_relaxed_sections, task);
07f508a2
DK
5732 state = NO_GROUP;
5733 }
5734 break;
5735
5736 default:
5737 gold_unreachable();
5738 }
5739
5740 // If we see an input section and currently there is no group, start
f625ae50
DK
5741 // a new one. Skip any empty sections. We look at the data size
5742 // instead of calling p->relobj()->section_size() to avoid locking.
07f508a2 5743 if ((p->is_input_section() || p->is_relaxed_input_section())
f625ae50 5744 && (p->data_size() != 0))
07f508a2
DK
5745 {
5746 if (state == NO_GROUP)
5747 {
5748 state = FINDING_STUB_SECTION;
5749 group_begin = p;
5750 group_begin_offset = section_begin_offset;
5751 }
5752
5753 // Keep track of the last input section seen.
5754 group_end = p;
5755 group_end_offset = section_end_offset;
5756 }
5757
5758 off = section_end_offset;
5759 }
5760
5761 // Create a stub group for any ungrouped sections.
5762 if (state == FINDING_STUB_SECTION || state == HAS_STUB_SECTION)
5763 {
5764 gold_assert(group_end != this->input_sections().end());
5765 this->create_stub_group(group_begin, group_end,
5766 (state == FINDING_STUB_SECTION
5767 ? group_end
2ea97941 5768 : stub_table),
f625ae50 5769 target, &new_relaxed_sections, task);
07f508a2
DK
5770 }
5771
5772 // Convert input section into relaxed input section in a batch.
5773 if (!new_relaxed_sections.empty())
5774 this->convert_input_sections_to_relaxed_sections(new_relaxed_sections);
5775
5776 // Update the section offsets
5777 for (size_t i = 0; i < new_relaxed_sections.size(); ++i)
5778 {
5779 Arm_relobj<big_endian>* arm_relobj =
5780 Arm_relobj<big_endian>::as_arm_relobj(
5781 new_relaxed_sections[i]->relobj());
2ea97941 5782 unsigned int shndx = new_relaxed_sections[i]->shndx();
07f508a2 5783 // Tell Arm_relobj that this input section is converted.
2ea97941 5784 arm_relobj->convert_input_section_to_relaxed_section(shndx);
07f508a2
DK
5785 }
5786}
5787
2b328d4e
DK
5788// Append non empty text sections in this to LIST in ascending
5789// order of their position in this.
5790
5791template<bool big_endian>
5792void
5793Arm_output_section<big_endian>::append_text_sections_to_list(
5794 Text_section_list* list)
5795{
2b328d4e
DK
5796 gold_assert((this->flags() & elfcpp::SHF_ALLOC) != 0);
5797
5798 for (Input_section_list::const_iterator p = this->input_sections().begin();
5799 p != this->input_sections().end();
5800 ++p)
5801 {
5802 // We only care about plain or relaxed input sections. We also
5803 // ignore any merged sections.
5804 if ((p->is_input_section() || p->is_relaxed_input_section())
5805 && p->data_size() != 0)
5806 list->push_back(Text_section_list::value_type(p->relobj(),
5807 p->shndx()));
5808 }
5809}
5810
5811template<bool big_endian>
5812void
5813Arm_output_section<big_endian>::fix_exidx_coverage(
4a54abbb 5814 Layout* layout,
2b328d4e 5815 const Text_section_list& sorted_text_sections,
85fdf906 5816 Symbol_table* symtab,
f625ae50
DK
5817 bool merge_exidx_entries,
5818 const Task* task)
2b328d4e
DK
5819{
5820 // We should only do this for the EXIDX output section.
5821 gold_assert(this->type() == elfcpp::SHT_ARM_EXIDX);
5822
5823 // We don't want the relaxation loop to undo these changes, so we discard
5824 // the current saved states and take another one after the fix-up.
5825 this->discard_states();
5826
5827 // Remove all input sections.
5828 uint64_t address = this->address();
6625d24e
DK
5829 typedef std::list<Output_section::Input_section> Input_section_list;
5830 Input_section_list input_sections;
2b328d4e
DK
5831 this->reset_address_and_file_offset();
5832 this->get_input_sections(address, std::string(""), &input_sections);
5833
5834 if (!this->input_sections().empty())
5835 gold_error(_("Found non-EXIDX input sections in EXIDX output section"));
5836
5837 // Go through all the known input sections and record them.
5838 typedef Unordered_set<Section_id, Section_id_hash> Section_id_set;
6625d24e
DK
5839 typedef Unordered_map<Section_id, const Output_section::Input_section*,
5840 Section_id_hash> Text_to_exidx_map;
5841 Text_to_exidx_map text_to_exidx_map;
5842 for (Input_section_list::const_iterator p = input_sections.begin();
2b328d4e
DK
5843 p != input_sections.end();
5844 ++p)
5845 {
5846 // This should never happen. At this point, we should only see
5847 // plain EXIDX input sections.
5848 gold_assert(!p->is_relaxed_input_section());
6625d24e 5849 text_to_exidx_map[Section_id(p->relobj(), p->shndx())] = &(*p);
2b328d4e
DK
5850 }
5851
85fdf906 5852 Arm_exidx_fixup exidx_fixup(this, merge_exidx_entries);
2b328d4e
DK
5853
5854 // Go over the sorted text sections.
6625d24e 5855 typedef Unordered_set<Section_id, Section_id_hash> Section_id_set;
2b328d4e
DK
5856 Section_id_set processed_input_sections;
5857 for (Text_section_list::const_iterator p = sorted_text_sections.begin();
5858 p != sorted_text_sections.end();
5859 ++p)
5860 {
5861 Relobj* relobj = p->first;
5862 unsigned int shndx = p->second;
5863
5864 Arm_relobj<big_endian>* arm_relobj =
5865 Arm_relobj<big_endian>::as_arm_relobj(relobj);
5866 const Arm_exidx_input_section* exidx_input_section =
5867 arm_relobj->exidx_input_section_by_link(shndx);
5868
131687b4
DK
5869 // If this text section has no EXIDX section or if the EXIDX section
5870 // has errors, force an EXIDX_CANTUNWIND entry pointing to the end
5871 // of the last seen EXIDX section.
5872 if (exidx_input_section == NULL || exidx_input_section->has_errors())
2b328d4e
DK
5873 {
5874 exidx_fixup.add_exidx_cantunwind_as_needed();
5875 continue;
5876 }
5877
5878 Relobj* exidx_relobj = exidx_input_section->relobj();
5879 unsigned int exidx_shndx = exidx_input_section->shndx();
5880 Section_id sid(exidx_relobj, exidx_shndx);
6625d24e
DK
5881 Text_to_exidx_map::const_iterator iter = text_to_exidx_map.find(sid);
5882 if (iter == text_to_exidx_map.end())
2b328d4e
DK
5883 {
5884 // This is odd. We have not seen this EXIDX input section before.
4a54abbb
DK
5885 // We cannot do fix-up. If we saw a SECTIONS clause in a script,
5886 // issue a warning instead. We assume the user knows what he
5887 // or she is doing. Otherwise, this is an error.
5888 if (layout->script_options()->saw_sections_clause())
5889 gold_warning(_("unwinding may not work because EXIDX input section"
5890 " %u of %s is not in EXIDX output section"),
5891 exidx_shndx, exidx_relobj->name().c_str());
5892 else
5893 gold_error(_("unwinding may not work because EXIDX input section"
5894 " %u of %s is not in EXIDX output section"),
5895 exidx_shndx, exidx_relobj->name().c_str());
5896
2b328d4e
DK
5897 exidx_fixup.add_exidx_cantunwind_as_needed();
5898 continue;
5899 }
5900
f625ae50
DK
5901 // We need to access the contents of the EXIDX section, lock the
5902 // object here.
5903 Task_lock_obj<Object> tl(task, exidx_relobj);
5904 section_size_type exidx_size;
5905 const unsigned char* exidx_contents =
5906 exidx_relobj->section_contents(exidx_shndx, &exidx_size, false);
5907
2b328d4e
DK
5908 // Fix up coverage and append input section to output data list.
5909 Arm_exidx_section_offset_map* section_offset_map = NULL;
5910 uint32_t deleted_bytes =
5911 exidx_fixup.process_exidx_section<big_endian>(exidx_input_section,
f625ae50
DK
5912 exidx_contents,
5913 exidx_size,
2b328d4e
DK
5914 &section_offset_map);
5915
5916 if (deleted_bytes == exidx_input_section->size())
5917 {
5918 // The whole EXIDX section got merged. Remove it from output.
5919 gold_assert(section_offset_map == NULL);
5920 exidx_relobj->set_output_section(exidx_shndx, NULL);
e7eca48c
DK
5921
5922 // All local symbols defined in this input section will be dropped.
5923 // We need to adjust output local symbol count.
5924 arm_relobj->set_output_local_symbol_count_needs_update();
2b328d4e
DK
5925 }
5926 else if (deleted_bytes > 0)
5927 {
5928 // Some entries are merged. We need to convert this EXIDX input
5929 // section into a relaxed section.
5930 gold_assert(section_offset_map != NULL);
f625ae50 5931
2b328d4e
DK
5932 Arm_exidx_merged_section* merged_section =
5933 new Arm_exidx_merged_section(*exidx_input_section,
5934 *section_offset_map, deleted_bytes);
f625ae50
DK
5935 merged_section->build_contents(exidx_contents, exidx_size);
5936
d06fb4d1
DK
5937 const std::string secname = exidx_relobj->section_name(exidx_shndx);
5938 this->add_relaxed_input_section(layout, merged_section, secname);
2b328d4e 5939 arm_relobj->convert_input_section_to_relaxed_section(exidx_shndx);
e7eca48c
DK
5940
5941 // All local symbols defined in discarded portions of this input
5942 // section will be dropped. We need to adjust output local symbol
5943 // count.
5944 arm_relobj->set_output_local_symbol_count_needs_update();
2b328d4e
DK
5945 }
5946 else
5947 {
5948 // Just add back the EXIDX input section.
5949 gold_assert(section_offset_map == NULL);
6625d24e
DK
5950 const Output_section::Input_section* pis = iter->second;
5951 gold_assert(pis->is_input_section());
5952 this->add_script_input_section(*pis);
2b328d4e
DK
5953 }
5954
5955 processed_input_sections.insert(Section_id(exidx_relobj, exidx_shndx));
5956 }
5957
5958 // Insert an EXIDX_CANTUNWIND entry at the end of output if necessary.
5959 exidx_fixup.add_exidx_cantunwind_as_needed();
5960
5961 // Remove any known EXIDX input sections that are not processed.
6625d24e 5962 for (Input_section_list::const_iterator p = input_sections.begin();
2b328d4e
DK
5963 p != input_sections.end();
5964 ++p)
5965 {
5966 if (processed_input_sections.find(Section_id(p->relobj(), p->shndx()))
5967 == processed_input_sections.end())
5968 {
131687b4
DK
5969 // We discard a known EXIDX section because its linked
5970 // text section has been folded by ICF. We also discard an
5971 // EXIDX section with error, the output does not matter in this
5972 // case. We do this to avoid triggering asserts.
2b328d4e
DK
5973 Arm_relobj<big_endian>* arm_relobj =
5974 Arm_relobj<big_endian>::as_arm_relobj(p->relobj());
5975 const Arm_exidx_input_section* exidx_input_section =
5976 arm_relobj->exidx_input_section_by_shndx(p->shndx());
5977 gold_assert(exidx_input_section != NULL);
131687b4
DK
5978 if (!exidx_input_section->has_errors())
5979 {
5980 unsigned int text_shndx = exidx_input_section->link();
5981 gold_assert(symtab->is_section_folded(p->relobj(), text_shndx));
5982 }
2b328d4e 5983
04ceb17c
DK
5984 // Remove this from link. We also need to recount the
5985 // local symbols.
2b328d4e 5986 p->relobj()->set_output_section(p->shndx(), NULL);
04ceb17c 5987 arm_relobj->set_output_local_symbol_count_needs_update();
2b328d4e
DK
5988 }
5989 }
5990
546c7457
DK
5991 // Link exidx output section to the first seen output section and
5992 // set correct entry size.
5993 this->set_link_section(exidx_fixup.first_output_text_section());
5994 this->set_entsize(8);
5995
2b328d4e
DK
5996 // Make changes permanent.
5997 this->save_states();
5998 this->set_section_offsets_need_adjustment();
5999}
6000
131687b4
DK
6001// Link EXIDX output sections to text output sections.
6002
6003template<bool big_endian>
6004void
6005Arm_output_section<big_endian>::set_exidx_section_link()
6006{
6007 gold_assert(this->type() == elfcpp::SHT_ARM_EXIDX);
6008 if (!this->input_sections().empty())
6009 {
6010 Input_section_list::const_iterator p = this->input_sections().begin();
6011 Arm_relobj<big_endian>* arm_relobj =
6012 Arm_relobj<big_endian>::as_arm_relobj(p->relobj());
6013 unsigned exidx_shndx = p->shndx();
6014 const Arm_exidx_input_section* exidx_input_section =
6015 arm_relobj->exidx_input_section_by_shndx(exidx_shndx);
6016 gold_assert(exidx_input_section != NULL);
6017 unsigned int text_shndx = exidx_input_section->link();
6018 Output_section* os = arm_relobj->output_section(text_shndx);
6019 this->set_link_section(os);
6020 }
6021}
6022
8ffa3667
DK
6023// Arm_relobj methods.
6024
cf846138
DK
6025// Determine if an input section is scannable for stub processing. SHDR is
6026// the header of the section and SHNDX is the section index. OS is the output
6027// section for the input section and SYMTAB is the global symbol table used to
6028// look up ICF information.
6029
6030template<bool big_endian>
6031bool
6032Arm_relobj<big_endian>::section_is_scannable(
6033 const elfcpp::Shdr<32, big_endian>& shdr,
6034 unsigned int shndx,
6035 const Output_section* os,
ca09d69a 6036 const Symbol_table* symtab)
cf846138
DK
6037{
6038 // Skip any empty sections, unallocated sections or sections whose
6039 // type are not SHT_PROGBITS.
6040 if (shdr.get_sh_size() == 0
6041 || (shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0
6042 || shdr.get_sh_type() != elfcpp::SHT_PROGBITS)
6043 return false;
6044
6045 // Skip any discarded or ICF'ed sections.
6046 if (os == NULL || symtab->is_section_folded(this, shndx))
6047 return false;
6048
6049 // If this requires special offset handling, check to see if it is
6050 // a relaxed section. If this is not, then it is a merged section that
6051 // we cannot handle.
6052 if (this->is_output_section_offset_invalid(shndx))
6053 {
6054 const Output_relaxed_input_section* poris =
6055 os->find_relaxed_input_section(this, shndx);
6056 if (poris == NULL)
6057 return false;
6058 }
6059
6060 return true;
6061}
6062
44272192
DK
6063// Determine if we want to scan the SHNDX-th section for relocation stubs.
6064// This is a helper for Arm_relobj::scan_sections_for_stubs() below.
6065
6066template<bool big_endian>
6067bool
6068Arm_relobj<big_endian>::section_needs_reloc_stub_scanning(
6069 const elfcpp::Shdr<32, big_endian>& shdr,
6070 const Relobj::Output_sections& out_sections,
ca09d69a 6071 const Symbol_table* symtab,
2b328d4e 6072 const unsigned char* pshdrs)
44272192
DK
6073{
6074 unsigned int sh_type = shdr.get_sh_type();
6075 if (sh_type != elfcpp::SHT_REL && sh_type != elfcpp::SHT_RELA)
6076 return false;
6077
6078 // Ignore empty section.
6079 off_t sh_size = shdr.get_sh_size();
6080 if (sh_size == 0)
6081 return false;
6082
44272192
DK
6083 // Ignore reloc section with unexpected symbol table. The
6084 // error will be reported in the final link.
6085 if (this->adjust_shndx(shdr.get_sh_link()) != this->symtab_shndx())
6086 return false;
6087
b521dfe4
DK
6088 unsigned int reloc_size;
6089 if (sh_type == elfcpp::SHT_REL)
6090 reloc_size = elfcpp::Elf_sizes<32>::rel_size;
6091 else
6092 reloc_size = elfcpp::Elf_sizes<32>::rela_size;
44272192
DK
6093
6094 // Ignore reloc section with unexpected entsize or uneven size.
6095 // The error will be reported in the final link.
6096 if (reloc_size != shdr.get_sh_entsize() || sh_size % reloc_size != 0)
6097 return false;
6098
cf846138
DK
6099 // Ignore reloc section with bad info. This error will be
6100 // reported in the final link.
6101 unsigned int index = this->adjust_shndx(shdr.get_sh_info());
6102 if (index >= this->shnum())
6103 return false;
6104
6105 const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
6106 const elfcpp::Shdr<32, big_endian> text_shdr(pshdrs + index * shdr_size);
6107 return this->section_is_scannable(text_shdr, index,
6108 out_sections[index], symtab);
44272192
DK
6109}
6110
cb1be87e
DK
6111// Return the output address of either a plain input section or a relaxed
6112// input section. SHNDX is the section index. We define and use this
6113// instead of calling Output_section::output_address because that is slow
6114// for large output.
6115
6116template<bool big_endian>
6117Arm_address
6118Arm_relobj<big_endian>::simple_input_section_output_address(
6119 unsigned int shndx,
6120 Output_section* os)
6121{
6122 if (this->is_output_section_offset_invalid(shndx))
6123 {
6124 const Output_relaxed_input_section* poris =
6125 os->find_relaxed_input_section(this, shndx);
6126 // We do not handle merged sections here.
6127 gold_assert(poris != NULL);
6128 return poris->address();
6129 }
6130 else
6131 return os->address() + this->get_output_section_offset(shndx);
6132}
6133
44272192
DK
6134// Determine if we want to scan the SHNDX-th section for non-relocation stubs.
6135// This is a helper for Arm_relobj::scan_sections_for_stubs() below.
6136
6137template<bool big_endian>
6138bool
6139Arm_relobj<big_endian>::section_needs_cortex_a8_stub_scanning(
6140 const elfcpp::Shdr<32, big_endian>& shdr,
6141 unsigned int shndx,
6142 Output_section* os,
6143 const Symbol_table* symtab)
6144{
cf846138 6145 if (!this->section_is_scannable(shdr, shndx, os, symtab))
44272192
DK
6146 return false;
6147
44272192
DK
6148 // If the section does not cross any 4K-boundaries, it does not need to
6149 // be scanned.
cb1be87e 6150 Arm_address address = this->simple_input_section_output_address(shndx, os);
44272192
DK
6151 if ((address & ~0xfffU) == ((address + shdr.get_sh_size() - 1) & ~0xfffU))
6152 return false;
6153
6154 return true;
6155}
6156
6157// Scan a section for Cortex-A8 workaround.
6158
6159template<bool big_endian>
6160void
6161Arm_relobj<big_endian>::scan_section_for_cortex_a8_erratum(
6162 const elfcpp::Shdr<32, big_endian>& shdr,
6163 unsigned int shndx,
6164 Output_section* os,
6165 Target_arm<big_endian>* arm_target)
6166{
c8761b9a
DK
6167 // Look for the first mapping symbol in this section. It should be
6168 // at (shndx, 0).
6169 Mapping_symbol_position section_start(shndx, 0);
6170 typename Mapping_symbols_info::const_iterator p =
6171 this->mapping_symbols_info_.lower_bound(section_start);
6172
6173 // There are no mapping symbols for this section. Treat it as a data-only
24af6f92
DK
6174 // section. Issue a warning if section is marked as containing
6175 // instructions.
c8761b9a 6176 if (p == this->mapping_symbols_info_.end() || p->first.first != shndx)
24af6f92
DK
6177 {
6178 if ((this->section_flags(shndx) & elfcpp::SHF_EXECINSTR) != 0)
6179 gold_warning(_("cannot scan executable section %u of %s for Cortex-A8 "
6180 "erratum because it has no mapping symbols."),
6181 shndx, this->name().c_str());
6182 return;
6183 }
c8761b9a 6184
cb1be87e
DK
6185 Arm_address output_address =
6186 this->simple_input_section_output_address(shndx, os);
44272192
DK
6187
6188 // Get the section contents.
6189 section_size_type input_view_size = 0;
6190 const unsigned char* input_view =
6191 this->section_contents(shndx, &input_view_size, false);
6192
6193 // We need to go through the mapping symbols to determine what to
6194 // scan. There are two reasons. First, we should look at THUMB code and
6195 // THUMB code only. Second, we only want to look at the 4K-page boundary
6196 // to speed up the scanning.
6197
44272192
DK
6198 while (p != this->mapping_symbols_info_.end()
6199 && p->first.first == shndx)
6200 {
6201 typename Mapping_symbols_info::const_iterator next =
6202 this->mapping_symbols_info_.upper_bound(p->first);
6203
6204 // Only scan part of a section with THUMB code.
6205 if (p->second == 't')
6206 {
6207 // Determine the end of this range.
6208 section_size_type span_start =
6209 convert_to_section_size_type(p->first.second);
6210 section_size_type span_end;
6211 if (next != this->mapping_symbols_info_.end()
6212 && next->first.first == shndx)
6213 span_end = convert_to_section_size_type(next->first.second);
6214 else
6215 span_end = convert_to_section_size_type(shdr.get_sh_size());
6216
6217 if (((span_start + output_address) & ~0xfffUL)
6218 != ((span_end + output_address - 1) & ~0xfffUL))
6219 {
6220 arm_target->scan_span_for_cortex_a8_erratum(this, shndx,
6221 span_start, span_end,
6222 input_view,
6223 output_address);
6224 }
6225 }
6226
6227 p = next;
6228 }
6229}
6230
8ffa3667
DK
6231// Scan relocations for stub generation.
6232
6233template<bool big_endian>
6234void
6235Arm_relobj<big_endian>::scan_sections_for_stubs(
6236 Target_arm<big_endian>* arm_target,
6237 const Symbol_table* symtab,
2ea97941 6238 const Layout* layout)
8ffa3667 6239{
2ea97941
ILT
6240 unsigned int shnum = this->shnum();
6241 const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
8ffa3667
DK
6242
6243 // Read the section headers.
6244 const unsigned char* pshdrs = this->get_view(this->elf_file()->shoff(),
2ea97941 6245 shnum * shdr_size,
8ffa3667
DK
6246 true, true);
6247
6248 // To speed up processing, we set up hash tables for fast lookup of
6249 // input offsets to output addresses.
6250 this->initialize_input_to_output_maps();
6251
6252 const Relobj::Output_sections& out_sections(this->output_sections());
6253
6254 Relocate_info<32, big_endian> relinfo;
8ffa3667 6255 relinfo.symtab = symtab;
2ea97941 6256 relinfo.layout = layout;
8ffa3667
DK
6257 relinfo.object = this;
6258
44272192 6259 // Do relocation stubs scanning.
2ea97941
ILT
6260 const unsigned char* p = pshdrs + shdr_size;
6261 for (unsigned int i = 1; i < shnum; ++i, p += shdr_size)
8ffa3667 6262 {
44272192 6263 const elfcpp::Shdr<32, big_endian> shdr(p);
2b328d4e
DK
6264 if (this->section_needs_reloc_stub_scanning(shdr, out_sections, symtab,
6265 pshdrs))
8ffa3667 6266 {
44272192
DK
6267 unsigned int index = this->adjust_shndx(shdr.get_sh_info());
6268 Arm_address output_offset = this->get_output_section_offset(index);
6269 Arm_address output_address;
7296d933 6270 if (output_offset != invalid_address)
44272192
DK
6271 output_address = out_sections[index]->address() + output_offset;
6272 else
6273 {
6274 // Currently this only happens for a relaxed section.
6275 const Output_relaxed_input_section* poris =
6276 out_sections[index]->find_relaxed_input_section(this, index);
6277 gold_assert(poris != NULL);
6278 output_address = poris->address();
6279 }
8ffa3667 6280
44272192
DK
6281 // Get the relocations.
6282 const unsigned char* prelocs = this->get_view(shdr.get_sh_offset(),
6283 shdr.get_sh_size(),
6284 true, false);
6285
6286 // Get the section contents. This does work for the case in which
6287 // we modify the contents of an input section. We need to pass the
6288 // output view under such circumstances.
6289 section_size_type input_view_size = 0;
6290 const unsigned char* input_view =
6291 this->section_contents(index, &input_view_size, false);
6292
6293 relinfo.reloc_shndx = i;
6294 relinfo.data_shndx = index;
6295 unsigned int sh_type = shdr.get_sh_type();
b521dfe4
DK
6296 unsigned int reloc_size;
6297 if (sh_type == elfcpp::SHT_REL)
6298 reloc_size = elfcpp::Elf_sizes<32>::rel_size;
6299 else
6300 reloc_size = elfcpp::Elf_sizes<32>::rela_size;
44272192
DK
6301
6302 Output_section* os = out_sections[index];
6303 arm_target->scan_section_for_stubs(&relinfo, sh_type, prelocs,
6304 shdr.get_sh_size() / reloc_size,
6305 os,
6306 output_offset == invalid_address,
6307 input_view, output_address,
6308 input_view_size);
8ffa3667 6309 }
44272192 6310 }
8ffa3667 6311
44272192
DK
6312 // Do Cortex-A8 erratum stubs scanning. This has to be done for a section
6313 // after its relocation section, if there is one, is processed for
6314 // relocation stubs. Merging this loop with the one above would have been
6315 // complicated since we would have had to make sure that relocation stub
6316 // scanning is done first.
6317 if (arm_target->fix_cortex_a8())
6318 {
6319 const unsigned char* p = pshdrs + shdr_size;
6320 for (unsigned int i = 1; i < shnum; ++i, p += shdr_size)
8ffa3667 6321 {
44272192
DK
6322 const elfcpp::Shdr<32, big_endian> shdr(p);
6323 if (this->section_needs_cortex_a8_stub_scanning(shdr, i,
6324 out_sections[i],
6325 symtab))
6326 this->scan_section_for_cortex_a8_erratum(shdr, i, out_sections[i],
6327 arm_target);
8ffa3667 6328 }
8ffa3667
DK
6329 }
6330
6331 // After we've done the relocations, we release the hash tables,
6332 // since we no longer need them.
6333 this->free_input_to_output_maps();
6334}
6335
6336// Count the local symbols. The ARM backend needs to know if a symbol
6337// is a THUMB function or not. For global symbols, it is easy because
6338// the Symbol object keeps the ELF symbol type. For local symbol it is
6339// harder because we cannot access this information. So we override the
6340// do_count_local_symbol in parent and scan local symbols to mark
6341// THUMB functions. This is not the most efficient way but I do not want to
9b547ce6 6342// slow down other ports by calling a per symbol target hook inside
8ffa3667
DK
6343// Sized_relobj<size, big_endian>::do_count_local_symbols.
6344
6345template<bool big_endian>
6346void
6347Arm_relobj<big_endian>::do_count_local_symbols(
6348 Stringpool_template<char>* pool,
6349 Stringpool_template<char>* dynpool)
6350{
6351 // We need to fix-up the values of any local symbols whose type are
6352 // STT_ARM_TFUNC.
6353
6354 // Ask parent to count the local symbols.
6355 Sized_relobj<32, big_endian>::do_count_local_symbols(pool, dynpool);
6356 const unsigned int loccount = this->local_symbol_count();
6357 if (loccount == 0)
6358 return;
6359
9b547ce6 6360 // Initialize the thumb function bit-vector.
8ffa3667
DK
6361 std::vector<bool> empty_vector(loccount, false);
6362 this->local_symbol_is_thumb_function_.swap(empty_vector);
6363
6364 // Read the symbol table section header.
2ea97941 6365 const unsigned int symtab_shndx = this->symtab_shndx();
8ffa3667 6366 elfcpp::Shdr<32, big_endian>
2ea97941 6367 symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
8ffa3667
DK
6368 gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
6369
6370 // Read the local symbols.
2ea97941 6371 const int sym_size =elfcpp::Elf_sizes<32>::sym_size;
8ffa3667 6372 gold_assert(loccount == symtabshdr.get_sh_info());
2ea97941 6373 off_t locsize = loccount * sym_size;
8ffa3667
DK
6374 const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
6375 locsize, true, true);
6376
20138696
DK
6377 // For mapping symbol processing, we need to read the symbol names.
6378 unsigned int strtab_shndx = this->adjust_shndx(symtabshdr.get_sh_link());
6379 if (strtab_shndx >= this->shnum())
6380 {
6381 this->error(_("invalid symbol table name index: %u"), strtab_shndx);
6382 return;
6383 }
6384
6385 elfcpp::Shdr<32, big_endian>
6386 strtabshdr(this, this->elf_file()->section_header(strtab_shndx));
6387 if (strtabshdr.get_sh_type() != elfcpp::SHT_STRTAB)
6388 {
6389 this->error(_("symbol table name section has wrong type: %u"),
6390 static_cast<unsigned int>(strtabshdr.get_sh_type()));
6391 return;
6392 }
6393 const char* pnames =
6394 reinterpret_cast<const char*>(this->get_view(strtabshdr.get_sh_offset(),
6395 strtabshdr.get_sh_size(),
6396 false, false));
6397
8ffa3667
DK
6398 // Loop over the local symbols and mark any local symbols pointing
6399 // to THUMB functions.
6400
6401 // Skip the first dummy symbol.
2ea97941 6402 psyms += sym_size;
8ffa3667
DK
6403 typename Sized_relobj<32, big_endian>::Local_values* plocal_values =
6404 this->local_values();
2ea97941 6405 for (unsigned int i = 1; i < loccount; ++i, psyms += sym_size)
8ffa3667
DK
6406 {
6407 elfcpp::Sym<32, big_endian> sym(psyms);
6408 elfcpp::STT st_type = sym.get_st_type();
6409 Symbol_value<32>& lv((*plocal_values)[i]);
6410 Arm_address input_value = lv.input_value();
6411
20138696
DK
6412 // Check to see if this is a mapping symbol.
6413 const char* sym_name = pnames + sym.get_st_name();
6414 if (Target_arm<big_endian>::is_mapping_symbol_name(sym_name))
6415 {
24af6f92
DK
6416 bool is_ordinary;
6417 unsigned int input_shndx =
6418 this->adjust_sym_shndx(i, sym.get_st_shndx(), &is_ordinary);
6419 gold_assert(is_ordinary);
20138696
DK
6420
6421 // Strip of LSB in case this is a THUMB symbol.
6422 Mapping_symbol_position msp(input_shndx, input_value & ~1U);
6423 this->mapping_symbols_info_[msp] = sym_name[1];
6424 }
6425
8ffa3667
DK
6426 if (st_type == elfcpp::STT_ARM_TFUNC
6427 || (st_type == elfcpp::STT_FUNC && ((input_value & 1) != 0)))
6428 {
6429 // This is a THUMB function. Mark this and canonicalize the
6430 // symbol value by setting LSB.
6431 this->local_symbol_is_thumb_function_[i] = true;
6432 if ((input_value & 1) == 0)
6433 lv.set_input_value(input_value | 1);
6434 }
6435 }
6436}
6437
6438// Relocate sections.
6439template<bool big_endian>
6440void
6441Arm_relobj<big_endian>::do_relocate_sections(
8ffa3667 6442 const Symbol_table* symtab,
2ea97941 6443 const Layout* layout,
8ffa3667 6444 const unsigned char* pshdrs,
aa98ff75 6445 Output_file* of,
8ffa3667
DK
6446 typename Sized_relobj<32, big_endian>::Views* pviews)
6447{
6448 // Call parent to relocate sections.
2ea97941 6449 Sized_relobj<32, big_endian>::do_relocate_sections(symtab, layout, pshdrs,
aa98ff75 6450 of, pviews);
8ffa3667
DK
6451
6452 // We do not generate stubs if doing a relocatable link.
6453 if (parameters->options().relocatable())
6454 return;
6455
6456 // Relocate stub tables.
2ea97941 6457 unsigned int shnum = this->shnum();
8ffa3667
DK
6458
6459 Target_arm<big_endian>* arm_target =
6460 Target_arm<big_endian>::default_target();
6461
6462 Relocate_info<32, big_endian> relinfo;
8ffa3667 6463 relinfo.symtab = symtab;
2ea97941 6464 relinfo.layout = layout;
8ffa3667
DK
6465 relinfo.object = this;
6466
2ea97941 6467 for (unsigned int i = 1; i < shnum; ++i)
8ffa3667
DK
6468 {
6469 Arm_input_section<big_endian>* arm_input_section =
6470 arm_target->find_arm_input_section(this, i);
6471
41263c05
DK
6472 if (arm_input_section != NULL
6473 && arm_input_section->is_stub_table_owner()
6474 && !arm_input_section->stub_table()->empty())
6475 {
6476 // We cannot discard a section if it owns a stub table.
6477 Output_section* os = this->output_section(i);
6478 gold_assert(os != NULL);
6479
6480 relinfo.reloc_shndx = elfcpp::SHN_UNDEF;
6481 relinfo.reloc_shdr = NULL;
6482 relinfo.data_shndx = i;
6483 relinfo.data_shdr = pshdrs + i * elfcpp::Elf_sizes<32>::shdr_size;
6484
6485 gold_assert((*pviews)[i].view != NULL);
6486
6487 // We are passed the output section view. Adjust it to cover the
6488 // stub table only.
6489 Stub_table<big_endian>* stub_table = arm_input_section->stub_table();
6490 gold_assert((stub_table->address() >= (*pviews)[i].address)
6491 && ((stub_table->address() + stub_table->data_size())
6492 <= (*pviews)[i].address + (*pviews)[i].view_size));
6493
6494 off_t offset = stub_table->address() - (*pviews)[i].address;
6495 unsigned char* view = (*pviews)[i].view + offset;
6496 Arm_address address = stub_table->address();
6497 section_size_type view_size = stub_table->data_size();
8ffa3667 6498
41263c05
DK
6499 stub_table->relocate_stubs(&relinfo, arm_target, os, view, address,
6500 view_size);
6501 }
6502
6503 // Apply Cortex A8 workaround if applicable.
6504 if (this->section_has_cortex_a8_workaround(i))
6505 {
6506 unsigned char* view = (*pviews)[i].view;
6507 Arm_address view_address = (*pviews)[i].address;
6508 section_size_type view_size = (*pviews)[i].view_size;
6509 Stub_table<big_endian>* stub_table = this->stub_tables_[i];
6510
6511 // Adjust view to cover section.
6512 Output_section* os = this->output_section(i);
6513 gold_assert(os != NULL);
cb1be87e
DK
6514 Arm_address section_address =
6515 this->simple_input_section_output_address(i, os);
41263c05
DK
6516 uint64_t section_size = this->section_size(i);
6517
6518 gold_assert(section_address >= view_address
6519 && ((section_address + section_size)
6520 <= (view_address + view_size)));
6521
6522 unsigned char* section_view = view + (section_address - view_address);
6523
6524 // Apply the Cortex-A8 workaround to the output address range
6525 // corresponding to this input section.
6526 stub_table->apply_cortex_a8_workaround_to_address_range(
6527 arm_target,
6528 section_view,
6529 section_address,
6530 section_size);
6531 }
8ffa3667
DK
6532 }
6533}
6534
9b547ce6 6535// Find the linked text section of an EXIDX section by looking at the first
c8761b9a 6536// relocation. 4.4.1 of the EHABI specifications says that an EXIDX section
9b547ce6 6537// must be linked to its associated code section via the sh_link field of
c8761b9a
DK
6538// its section header. However, some tools are broken and the link is not
6539// always set. LD just drops such an EXIDX section silently, causing the
6540// associated code not unwindabled. Here we try a little bit harder to
6541// discover the linked code section.
6542//
6543// PSHDR points to the section header of a relocation section of an EXIDX
6544// section. If we can find a linked text section, return true and
6545// store the text section index in the location PSHNDX. Otherwise
6546// return false.
a0351a69
DK
6547
6548template<bool big_endian>
c8761b9a
DK
6549bool
6550Arm_relobj<big_endian>::find_linked_text_section(
6551 const unsigned char* pshdr,
6552 const unsigned char* psyms,
6553 unsigned int* pshndx)
a0351a69 6554{
c8761b9a
DK
6555 elfcpp::Shdr<32, big_endian> shdr(pshdr);
6556
6557 // If there is no relocation, we cannot find the linked text section.
6558 size_t reloc_size;
6559 if (shdr.get_sh_type() == elfcpp::SHT_REL)
6560 reloc_size = elfcpp::Elf_sizes<32>::rel_size;
6561 else
6562 reloc_size = elfcpp::Elf_sizes<32>::rela_size;
6563 size_t reloc_count = shdr.get_sh_size() / reloc_size;
6564
6565 // Get the relocations.
6566 const unsigned char* prelocs =
6567 this->get_view(shdr.get_sh_offset(), shdr.get_sh_size(), true, false);
993d07c1 6568
c8761b9a
DK
6569 // Find the REL31 relocation for the first word of the first EXIDX entry.
6570 for (size_t i = 0; i < reloc_count; ++i, prelocs += reloc_size)
a0351a69 6571 {
c8761b9a
DK
6572 Arm_address r_offset;
6573 typename elfcpp::Elf_types<32>::Elf_WXword r_info;
6574 if (shdr.get_sh_type() == elfcpp::SHT_REL)
6575 {
6576 typename elfcpp::Rel<32, big_endian> reloc(prelocs);
6577 r_info = reloc.get_r_info();
6578 r_offset = reloc.get_r_offset();
6579 }
6580 else
6581 {
6582 typename elfcpp::Rela<32, big_endian> reloc(prelocs);
6583 r_info = reloc.get_r_info();
6584 r_offset = reloc.get_r_offset();
6585 }
6586
6587 unsigned int r_type = elfcpp::elf_r_type<32>(r_info);
6588 if (r_type != elfcpp::R_ARM_PREL31 && r_type != elfcpp::R_ARM_SBREL31)
6589 continue;
6590
6591 unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
6592 if (r_sym == 0
6593 || r_sym >= this->local_symbol_count()
6594 || r_offset != 0)
6595 continue;
6596
6597 // This is the relocation for the first word of the first EXIDX entry.
6598 // We expect to see a local section symbol.
6599 const int sym_size = elfcpp::Elf_sizes<32>::sym_size;
6600 elfcpp::Sym<32, big_endian> sym(psyms + r_sym * sym_size);
6601 if (sym.get_st_type() == elfcpp::STT_SECTION)
6602 {
24af6f92
DK
6603 bool is_ordinary;
6604 *pshndx =
6605 this->adjust_sym_shndx(r_sym, sym.get_st_shndx(), &is_ordinary);
6606 gold_assert(is_ordinary);
c8761b9a
DK
6607 return true;
6608 }
6609 else
6610 return false;
993d07c1 6611 }
c8761b9a
DK
6612
6613 return false;
6614}
6615
6616// Make an EXIDX input section object for an EXIDX section whose index is
6617// SHNDX. SHDR is the section header of the EXIDX section and TEXT_SHNDX
6618// is the section index of the linked text section.
6619
6620template<bool big_endian>
6621void
6622Arm_relobj<big_endian>::make_exidx_input_section(
6623 unsigned int shndx,
6624 const elfcpp::Shdr<32, big_endian>& shdr,
131687b4
DK
6625 unsigned int text_shndx,
6626 const elfcpp::Shdr<32, big_endian>& text_shdr)
c8761b9a 6627{
993d07c1
DK
6628 // Create an Arm_exidx_input_section object for this EXIDX section.
6629 Arm_exidx_input_section* exidx_input_section =
6630 new Arm_exidx_input_section(this, shndx, text_shndx, shdr.get_sh_size(),
f625ae50
DK
6631 shdr.get_sh_addralign(),
6632 text_shdr.get_sh_size());
993d07c1 6633
993d07c1
DK
6634 gold_assert(this->exidx_section_map_[shndx] == NULL);
6635 this->exidx_section_map_[shndx] = exidx_input_section;
131687b4
DK
6636
6637 if (text_shndx == elfcpp::SHN_UNDEF || text_shndx >= this->shnum())
6638 {
6639 gold_error(_("EXIDX section %s(%u) links to invalid section %u in %s"),
6640 this->section_name(shndx).c_str(), shndx, text_shndx,
6641 this->name().c_str());
6642 exidx_input_section->set_has_errors();
6643 }
6644 else if (this->exidx_section_map_[text_shndx] != NULL)
6645 {
6646 unsigned other_exidx_shndx =
6647 this->exidx_section_map_[text_shndx]->shndx();
6648 gold_error(_("EXIDX sections %s(%u) and %s(%u) both link to text section"
6649 "%s(%u) in %s"),
6650 this->section_name(shndx).c_str(), shndx,
6651 this->section_name(other_exidx_shndx).c_str(),
6652 other_exidx_shndx, this->section_name(text_shndx).c_str(),
6653 text_shndx, this->name().c_str());
6654 exidx_input_section->set_has_errors();
6655 }
6656 else
6657 this->exidx_section_map_[text_shndx] = exidx_input_section;
6658
6659 // Check section flags of text section.
6660 if ((text_shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0)
6661 {
6662 gold_error(_("EXIDX section %s(%u) links to non-allocated section %s(%u) "
6663 " in %s"),
6664 this->section_name(shndx).c_str(), shndx,
6665 this->section_name(text_shndx).c_str(), text_shndx,
6666 this->name().c_str());
6667 exidx_input_section->set_has_errors();
6668 }
6669 else if ((text_shdr.get_sh_flags() & elfcpp::SHF_EXECINSTR) == 0)
9b547ce6 6670 // I would like to make this an error but currently ld just ignores
131687b4
DK
6671 // this.
6672 gold_warning(_("EXIDX section %s(%u) links to non-executable section "
6673 "%s(%u) in %s"),
6674 this->section_name(shndx).c_str(), shndx,
6675 this->section_name(text_shndx).c_str(), text_shndx,
6676 this->name().c_str());
a0351a69
DK
6677}
6678
d5b40221
DK
6679// Read the symbol information.
6680
6681template<bool big_endian>
6682void
6683Arm_relobj<big_endian>::do_read_symbols(Read_symbols_data* sd)
6684{
6685 // Call parent class to read symbol information.
6686 Sized_relobj<32, big_endian>::do_read_symbols(sd);
6687
7296d933
DK
6688 // If this input file is a binary file, it has no processor
6689 // specific flags and attributes section.
6690 Input_file::Format format = this->input_file()->format();
6691 if (format != Input_file::FORMAT_ELF)
6692 {
6693 gold_assert(format == Input_file::FORMAT_BINARY);
6694 this->merge_flags_and_attributes_ = false;
6695 return;
6696 }
6697
d5b40221
DK
6698 // Read processor-specific flags in ELF file header.
6699 const unsigned char* pehdr = this->get_view(elfcpp::file_header_offset,
6700 elfcpp::Elf_sizes<32>::ehdr_size,
6701 true, false);
6702 elfcpp::Ehdr<32, big_endian> ehdr(pehdr);
6703 this->processor_specific_flags_ = ehdr.get_e_flags();
993d07c1
DK
6704
6705 // Go over the section headers and look for .ARM.attributes and .ARM.exidx
6706 // sections.
c8761b9a 6707 std::vector<unsigned int> deferred_exidx_sections;
993d07c1 6708 const size_t shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
c8761b9a 6709 const unsigned char* pshdrs = sd->section_headers->data();
ca09d69a 6710 const unsigned char* ps = pshdrs + shdr_size;
7296d933 6711 bool must_merge_flags_and_attributes = false;
993d07c1
DK
6712 for (unsigned int i = 1; i < this->shnum(); ++i, ps += shdr_size)
6713 {
6714 elfcpp::Shdr<32, big_endian> shdr(ps);
7296d933
DK
6715
6716 // Sometimes an object has no contents except the section name string
6717 // table and an empty symbol table with the undefined symbol. We
6718 // don't want to merge processor-specific flags from such an object.
6719 if (shdr.get_sh_type() == elfcpp::SHT_SYMTAB)
6720 {
6721 // Symbol table is not empty.
6722 const elfcpp::Elf_types<32>::Elf_WXword sym_size =
6723 elfcpp::Elf_sizes<32>::sym_size;
6724 if (shdr.get_sh_size() > sym_size)
6725 must_merge_flags_and_attributes = true;
6726 }
6727 else if (shdr.get_sh_type() != elfcpp::SHT_STRTAB)
6728 // If this is neither an empty symbol table nor a string table,
6729 // be conservative.
6730 must_merge_flags_and_attributes = true;
6731
993d07c1
DK
6732 if (shdr.get_sh_type() == elfcpp::SHT_ARM_ATTRIBUTES)
6733 {
6734 gold_assert(this->attributes_section_data_ == NULL);
6735 section_offset_type section_offset = shdr.get_sh_offset();
6736 section_size_type section_size =
6737 convert_to_section_size_type(shdr.get_sh_size());
f625ae50
DK
6738 const unsigned char* view =
6739 this->get_view(section_offset, section_size, true, false);
993d07c1 6740 this->attributes_section_data_ =
f625ae50 6741 new Attributes_section_data(view, section_size);
993d07c1
DK
6742 }
6743 else if (shdr.get_sh_type() == elfcpp::SHT_ARM_EXIDX)
c8761b9a
DK
6744 {
6745 unsigned int text_shndx = this->adjust_shndx(shdr.get_sh_link());
131687b4 6746 if (text_shndx == elfcpp::SHN_UNDEF)
c8761b9a
DK
6747 deferred_exidx_sections.push_back(i);
6748 else
131687b4
DK
6749 {
6750 elfcpp::Shdr<32, big_endian> text_shdr(pshdrs
6751 + text_shndx * shdr_size);
6752 this->make_exidx_input_section(i, shdr, text_shndx, text_shdr);
6753 }
c9484ea5
DK
6754 // EHABI 4.4.1 requires that SHF_LINK_ORDER flag to be set.
6755 if ((shdr.get_sh_flags() & elfcpp::SHF_LINK_ORDER) == 0)
6756 gold_warning(_("SHF_LINK_ORDER not set in EXIDX section %s of %s"),
6757 this->section_name(i).c_str(), this->name().c_str());
c8761b9a
DK
6758 }
6759 }
6760
7296d933
DK
6761 // This is rare.
6762 if (!must_merge_flags_and_attributes)
6763 {
131687b4 6764 gold_assert(deferred_exidx_sections.empty());
7296d933
DK
6765 this->merge_flags_and_attributes_ = false;
6766 return;
6767 }
6768
c8761b9a
DK
6769 // Some tools are broken and they do not set the link of EXIDX sections.
6770 // We look at the first relocation to figure out the linked sections.
6771 if (!deferred_exidx_sections.empty())
6772 {
6773 // We need to go over the section headers again to find the mapping
6774 // from sections being relocated to their relocation sections. This is
6775 // a bit inefficient as we could do that in the loop above. However,
6776 // we do not expect any deferred EXIDX sections normally. So we do not
6777 // want to slow down the most common path.
6778 typedef Unordered_map<unsigned int, unsigned int> Reloc_map;
6779 Reloc_map reloc_map;
6780 ps = pshdrs + shdr_size;
6781 for (unsigned int i = 1; i < this->shnum(); ++i, ps += shdr_size)
6782 {
6783 elfcpp::Shdr<32, big_endian> shdr(ps);
6784 elfcpp::Elf_Word sh_type = shdr.get_sh_type();
6785 if (sh_type == elfcpp::SHT_REL || sh_type == elfcpp::SHT_RELA)
6786 {
6787 unsigned int info_shndx = this->adjust_shndx(shdr.get_sh_info());
6788 if (info_shndx >= this->shnum())
6789 gold_error(_("relocation section %u has invalid info %u"),
6790 i, info_shndx);
6791 Reloc_map::value_type value(info_shndx, i);
6792 std::pair<Reloc_map::iterator, bool> result =
6793 reloc_map.insert(value);
6794 if (!result.second)
6795 gold_error(_("section %u has multiple relocation sections "
6796 "%u and %u"),
6797 info_shndx, i, reloc_map[info_shndx]);
6798 }
6799 }
6800
6801 // Read the symbol table section header.
6802 const unsigned int symtab_shndx = this->symtab_shndx();
6803 elfcpp::Shdr<32, big_endian>
6804 symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
6805 gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
6806
6807 // Read the local symbols.
6808 const int sym_size =elfcpp::Elf_sizes<32>::sym_size;
6809 const unsigned int loccount = this->local_symbol_count();
6810 gold_assert(loccount == symtabshdr.get_sh_info());
6811 off_t locsize = loccount * sym_size;
6812 const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
6813 locsize, true, true);
6814
6815 // Process the deferred EXIDX sections.
f625ae50 6816 for (unsigned int i = 0; i < deferred_exidx_sections.size(); ++i)
c8761b9a
DK
6817 {
6818 unsigned int shndx = deferred_exidx_sections[i];
6819 elfcpp::Shdr<32, big_endian> shdr(pshdrs + shndx * shdr_size);
131687b4 6820 unsigned int text_shndx = elfcpp::SHN_UNDEF;
c8761b9a 6821 Reloc_map::const_iterator it = reloc_map.find(shndx);
131687b4
DK
6822 if (it != reloc_map.end())
6823 find_linked_text_section(pshdrs + it->second * shdr_size,
6824 psyms, &text_shndx);
6825 elfcpp::Shdr<32, big_endian> text_shdr(pshdrs
6826 + text_shndx * shdr_size);
6827 this->make_exidx_input_section(shndx, shdr, text_shndx, text_shdr);
c8761b9a 6828 }
993d07c1 6829 }
d5b40221
DK
6830}
6831
99e5bff2
DK
6832// Process relocations for garbage collection. The ARM target uses .ARM.exidx
6833// sections for unwinding. These sections are referenced implicitly by
9b547ce6 6834// text sections linked in the section headers. If we ignore these implicit
99e5bff2
DK
6835// references, the .ARM.exidx sections and any .ARM.extab sections they use
6836// will be garbage-collected incorrectly. Hence we override the same function
6837// in the base class to handle these implicit references.
6838
6839template<bool big_endian>
6840void
6841Arm_relobj<big_endian>::do_gc_process_relocs(Symbol_table* symtab,
6842 Layout* layout,
6843 Read_relocs_data* rd)
6844{
6845 // First, call base class method to process relocations in this object.
6846 Sized_relobj<32, big_endian>::do_gc_process_relocs(symtab, layout, rd);
6847
4a54abbb
DK
6848 // If --gc-sections is not specified, there is nothing more to do.
6849 // This happens when --icf is used but --gc-sections is not.
6850 if (!parameters->options().gc_sections())
6851 return;
6852
99e5bff2
DK
6853 unsigned int shnum = this->shnum();
6854 const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
6855 const unsigned char* pshdrs = this->get_view(this->elf_file()->shoff(),
6856 shnum * shdr_size,
6857 true, true);
6858
6859 // Scan section headers for sections of type SHT_ARM_EXIDX. Add references
6860 // to these from the linked text sections.
6861 const unsigned char* ps = pshdrs + shdr_size;
6862 for (unsigned int i = 1; i < shnum; ++i, ps += shdr_size)
6863 {
6864 elfcpp::Shdr<32, big_endian> shdr(ps);
6865 if (shdr.get_sh_type() == elfcpp::SHT_ARM_EXIDX)
6866 {
6867 // Found an .ARM.exidx section, add it to the set of reachable
6868 // sections from its linked text section.
6869 unsigned int text_shndx = this->adjust_shndx(shdr.get_sh_link());
6870 symtab->gc()->add_reference(this, text_shndx, this, i);
6871 }
6872 }
6873}
6874
e7eca48c
DK
6875// Update output local symbol count. Owing to EXIDX entry merging, some local
6876// symbols will be removed in output. Adjust output local symbol count
6877// accordingly. We can only changed the static output local symbol count. It
6878// is too late to change the dynamic symbols.
6879
6880template<bool big_endian>
6881void
6882Arm_relobj<big_endian>::update_output_local_symbol_count()
6883{
6884 // Caller should check that this needs updating. We want caller checking
6885 // because output_local_symbol_count_needs_update() is most likely inlined.
6886 gold_assert(this->output_local_symbol_count_needs_update_);
6887
6888 gold_assert(this->symtab_shndx() != -1U);
6889 if (this->symtab_shndx() == 0)
6890 {
6891 // This object has no symbols. Weird but legal.
6892 return;
6893 }
6894
6895 // Read the symbol table section header.
6896 const unsigned int symtab_shndx = this->symtab_shndx();
6897 elfcpp::Shdr<32, big_endian>
6898 symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
6899 gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
6900
6901 // Read the local symbols.
6902 const int sym_size = elfcpp::Elf_sizes<32>::sym_size;
6903 const unsigned int loccount = this->local_symbol_count();
6904 gold_assert(loccount == symtabshdr.get_sh_info());
6905 off_t locsize = loccount * sym_size;
6906 const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
6907 locsize, true, true);
6908
6909 // Loop over the local symbols.
6910
6911 typedef typename Sized_relobj<32, big_endian>::Output_sections
6912 Output_sections;
6913 const Output_sections& out_sections(this->output_sections());
6914 unsigned int shnum = this->shnum();
6915 unsigned int count = 0;
6916 // Skip the first, dummy, symbol.
6917 psyms += sym_size;
6918 for (unsigned int i = 1; i < loccount; ++i, psyms += sym_size)
6919 {
6920 elfcpp::Sym<32, big_endian> sym(psyms);
6921
6922 Symbol_value<32>& lv((*this->local_values())[i]);
6923
6924 // This local symbol was already discarded by do_count_local_symbols.
9177756d 6925 if (lv.is_output_symtab_index_set() && !lv.has_output_symtab_entry())
e7eca48c
DK
6926 continue;
6927
6928 bool is_ordinary;
6929 unsigned int shndx = this->adjust_sym_shndx(i, sym.get_st_shndx(),
6930 &is_ordinary);
6931
6932 if (shndx < shnum)
6933 {
6934 Output_section* os = out_sections[shndx];
6935
6936 // This local symbol no longer has an output section. Discard it.
6937 if (os == NULL)
6938 {
6939 lv.set_no_output_symtab_entry();
6940 continue;
6941 }
6942
6943 // Currently we only discard parts of EXIDX input sections.
6944 // We explicitly check for a merged EXIDX input section to avoid
6945 // calling Output_section_data::output_offset unless necessary.
6946 if ((this->get_output_section_offset(shndx) == invalid_address)
6947 && (this->exidx_input_section_by_shndx(shndx) != NULL))
6948 {
6949 section_offset_type output_offset =
6950 os->output_offset(this, shndx, lv.input_value());
6951 if (output_offset == -1)
6952 {
6953 // This symbol is defined in a part of an EXIDX input section
6954 // that is discarded due to entry merging.
6955 lv.set_no_output_symtab_entry();
6956 continue;
6957 }
6958 }
6959 }
6960
6961 ++count;
6962 }
6963
6964 this->set_output_local_symbol_count(count);
6965 this->output_local_symbol_count_needs_update_ = false;
6966}
6967
d5b40221
DK
6968// Arm_dynobj methods.
6969
6970// Read the symbol information.
6971
6972template<bool big_endian>
6973void
6974Arm_dynobj<big_endian>::do_read_symbols(Read_symbols_data* sd)
6975{
6976 // Call parent class to read symbol information.
6977 Sized_dynobj<32, big_endian>::do_read_symbols(sd);
6978
6979 // Read processor-specific flags in ELF file header.
6980 const unsigned char* pehdr = this->get_view(elfcpp::file_header_offset,
6981 elfcpp::Elf_sizes<32>::ehdr_size,
6982 true, false);
6983 elfcpp::Ehdr<32, big_endian> ehdr(pehdr);
6984 this->processor_specific_flags_ = ehdr.get_e_flags();
993d07c1
DK
6985
6986 // Read the attributes section if there is one.
6987 // We read from the end because gas seems to put it near the end of
6988 // the section headers.
6989 const size_t shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
ca09d69a 6990 const unsigned char* ps =
993d07c1
DK
6991 sd->section_headers->data() + shdr_size * (this->shnum() - 1);
6992 for (unsigned int i = this->shnum(); i > 0; --i, ps -= shdr_size)
6993 {
6994 elfcpp::Shdr<32, big_endian> shdr(ps);
6995 if (shdr.get_sh_type() == elfcpp::SHT_ARM_ATTRIBUTES)
6996 {
6997 section_offset_type section_offset = shdr.get_sh_offset();
6998 section_size_type section_size =
6999 convert_to_section_size_type(shdr.get_sh_size());
f625ae50
DK
7000 const unsigned char* view =
7001 this->get_view(section_offset, section_size, true, false);
993d07c1 7002 this->attributes_section_data_ =
f625ae50 7003 new Attributes_section_data(view, section_size);
993d07c1
DK
7004 break;
7005 }
7006 }
d5b40221
DK
7007}
7008
e9bbb538
DK
7009// Stub_addend_reader methods.
7010
7011// Read the addend of a REL relocation of type R_TYPE at VIEW.
7012
7013template<bool big_endian>
7014elfcpp::Elf_types<32>::Elf_Swxword
7015Stub_addend_reader<elfcpp::SHT_REL, big_endian>::operator()(
7016 unsigned int r_type,
7017 const unsigned char* view,
7018 const typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc&) const
7019{
089d69dc
DK
7020 typedef struct Arm_relocate_functions<big_endian> RelocFuncs;
7021
e9bbb538
DK
7022 switch (r_type)
7023 {
7024 case elfcpp::R_ARM_CALL:
7025 case elfcpp::R_ARM_JUMP24:
7026 case elfcpp::R_ARM_PLT32:
7027 {
7028 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
7029 const Valtype* wv = reinterpret_cast<const Valtype*>(view);
7030 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
7031 return utils::sign_extend<26>(val << 2);
7032 }
7033
7034 case elfcpp::R_ARM_THM_CALL:
7035 case elfcpp::R_ARM_THM_JUMP24:
7036 case elfcpp::R_ARM_THM_XPC22:
7037 {
e9bbb538
DK
7038 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
7039 const Valtype* wv = reinterpret_cast<const Valtype*>(view);
7040 Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
7041 Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
089d69dc 7042 return RelocFuncs::thumb32_branch_offset(upper_insn, lower_insn);
e9bbb538
DK
7043 }
7044
7045 case elfcpp::R_ARM_THM_JUMP19:
7046 {
7047 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
7048 const Valtype* wv = reinterpret_cast<const Valtype*>(view);
7049 Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
7050 Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
089d69dc 7051 return RelocFuncs::thumb32_cond_branch_offset(upper_insn, lower_insn);
e9bbb538
DK
7052 }
7053
7054 default:
7055 gold_unreachable();
7056 }
7057}
7058
4a54abbb
DK
7059// Arm_output_data_got methods.
7060
7061// Add a GOT pair for R_ARM_TLS_GD32. The creates a pair of GOT entries.
7062// The first one is initialized to be 1, which is the module index for
7063// the main executable and the second one 0. A reloc of the type
7064// R_ARM_TLS_DTPOFF32 will be created for the second GOT entry and will
7065// be applied by gold. GSYM is a global symbol.
7066//
7067template<bool big_endian>
7068void
7069Arm_output_data_got<big_endian>::add_tls_gd32_with_static_reloc(
7070 unsigned int got_type,
7071 Symbol* gsym)
7072{
7073 if (gsym->has_got_offset(got_type))
7074 return;
7075
7076 // We are doing a static link. Just mark it as belong to module 1,
7077 // the executable.
7078 unsigned int got_offset = this->add_constant(1);
7079 gsym->set_got_offset(got_type, got_offset);
7080 got_offset = this->add_constant(0);
7081 this->static_relocs_.push_back(Static_reloc(got_offset,
7082 elfcpp::R_ARM_TLS_DTPOFF32,
7083 gsym));
7084}
7085
7086// Same as the above but for a local symbol.
7087
7088template<bool big_endian>
7089void
7090Arm_output_data_got<big_endian>::add_tls_gd32_with_static_reloc(
7091 unsigned int got_type,
7092 Sized_relobj<32, big_endian>* object,
7093 unsigned int index)
7094{
7095 if (object->local_has_got_offset(index, got_type))
7096 return;
7097
7098 // We are doing a static link. Just mark it as belong to module 1,
7099 // the executable.
7100 unsigned int got_offset = this->add_constant(1);
7101 object->set_local_got_offset(index, got_type, got_offset);
7102 got_offset = this->add_constant(0);
7103 this->static_relocs_.push_back(Static_reloc(got_offset,
7104 elfcpp::R_ARM_TLS_DTPOFF32,
7105 object, index));
7106}
7107
7108template<bool big_endian>
7109void
7110Arm_output_data_got<big_endian>::do_write(Output_file* of)
7111{
7112 // Call parent to write out GOT.
7113 Output_data_got<32, big_endian>::do_write(of);
7114
7115 // We are done if there is no fix up.
7116 if (this->static_relocs_.empty())
7117 return;
7118
7119 gold_assert(parameters->doing_static_link());
7120
7121 const off_t offset = this->offset();
7122 const section_size_type oview_size =
7123 convert_to_section_size_type(this->data_size());
7124 unsigned char* const oview = of->get_output_view(offset, oview_size);
7125
7126 Output_segment* tls_segment = this->layout_->tls_segment();
7127 gold_assert(tls_segment != NULL);
7128
7129 // The thread pointer $tp points to the TCB, which is followed by the
7130 // TLS. So we need to adjust $tp relative addressing by this amount.
7131 Arm_address aligned_tcb_size =
7132 align_address(ARM_TCB_SIZE, tls_segment->maximum_alignment());
7133
7134 for (size_t i = 0; i < this->static_relocs_.size(); ++i)
7135 {
7136 Static_reloc& reloc(this->static_relocs_[i]);
7137
7138 Arm_address value;
7139 if (!reloc.symbol_is_global())
7140 {
7141 Sized_relobj<32, big_endian>* object = reloc.relobj();
7142 const Symbol_value<32>* psymval =
7143 reloc.relobj()->local_symbol(reloc.index());
7144
7145 // We are doing static linking. Issue an error and skip this
7146 // relocation if the symbol is undefined or in a discarded_section.
7147 bool is_ordinary;
7148 unsigned int shndx = psymval->input_shndx(&is_ordinary);
7149 if ((shndx == elfcpp::SHN_UNDEF)
7150 || (is_ordinary
7151 && shndx != elfcpp::SHN_UNDEF
7152 && !object->is_section_included(shndx)
7153 && !this->symbol_table_->is_section_folded(object, shndx)))
7154 {
7155 gold_error(_("undefined or discarded local symbol %u from "
7156 " object %s in GOT"),
7157 reloc.index(), reloc.relobj()->name().c_str());
7158 continue;
7159 }
7160
7161 value = psymval->value(object, 0);
7162 }
7163 else
7164 {
7165 const Symbol* gsym = reloc.symbol();
7166 gold_assert(gsym != NULL);
7167 if (gsym->is_forwarder())
7168 gsym = this->symbol_table_->resolve_forwards(gsym);
7169
7170 // We are doing static linking. Issue an error and skip this
7171 // relocation if the symbol is undefined or in a discarded_section
7172 // unless it is a weakly_undefined symbol.
7173 if ((gsym->is_defined_in_discarded_section()
7174 || gsym->is_undefined())
7175 && !gsym->is_weak_undefined())
7176 {
7177 gold_error(_("undefined or discarded symbol %s in GOT"),
7178 gsym->name());
7179 continue;
7180 }
7181
7182 if (!gsym->is_weak_undefined())
7183 {
7184 const Sized_symbol<32>* sym =
7185 static_cast<const Sized_symbol<32>*>(gsym);
7186 value = sym->value();
7187 }
7188 else
7189 value = 0;
7190 }
7191
7192 unsigned got_offset = reloc.got_offset();
7193 gold_assert(got_offset < oview_size);
7194
7195 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
7196 Valtype* wv = reinterpret_cast<Valtype*>(oview + got_offset);
7197 Valtype x;
7198 switch (reloc.r_type())
7199 {
7200 case elfcpp::R_ARM_TLS_DTPOFF32:
7201 x = value;
7202 break;
7203 case elfcpp::R_ARM_TLS_TPOFF32:
7204 x = value + aligned_tcb_size;
7205 break;
7206 default:
7207 gold_unreachable();
7208 }
7209 elfcpp::Swap<32, big_endian>::writeval(wv, x);
7210 }
7211
7212 of->write_output_view(offset, oview_size, oview);
7213}
7214
94cdfcff
DK
7215// A class to handle the PLT data.
7216
7217template<bool big_endian>
7218class Output_data_plt_arm : public Output_section_data
7219{
7220 public:
7221 typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, big_endian>
7222 Reloc_section;
7223
7224 Output_data_plt_arm(Layout*, Output_data_space*);
7225
7226 // Add an entry to the PLT.
7227 void
7228 add_entry(Symbol* gsym);
7229
7230 // Return the .rel.plt section data.
7231 const Reloc_section*
7232 rel_plt() const
7233 { return this->rel_; }
7234
0e70b911
CC
7235 // Return the number of PLT entries.
7236 unsigned int
7237 entry_count() const
7238 { return this->count_; }
7239
7240 // Return the offset of the first non-reserved PLT entry.
7241 static unsigned int
7242 first_plt_entry_offset()
7243 { return sizeof(first_plt_entry); }
7244
7245 // Return the size of a PLT entry.
7246 static unsigned int
7247 get_plt_entry_size()
7248 { return sizeof(plt_entry); }
7249
94cdfcff
DK
7250 protected:
7251 void
7252 do_adjust_output_section(Output_section* os);
7253
7254 // Write to a map file.
7255 void
7256 do_print_to_mapfile(Mapfile* mapfile) const
7257 { mapfile->print_output_data(this, _("** PLT")); }
7258
7259 private:
7260 // Template for the first PLT entry.
7261 static const uint32_t first_plt_entry[5];
7262
7263 // Template for subsequent PLT entries.
7264 static const uint32_t plt_entry[3];
7265
7266 // Set the final size.
7267 void
7268 set_final_data_size()
7269 {
7270 this->set_data_size(sizeof(first_plt_entry)
7271 + this->count_ * sizeof(plt_entry));
7272 }
7273
7274 // Write out the PLT data.
7275 void
7276 do_write(Output_file*);
7277
7278 // The reloc section.
7279 Reloc_section* rel_;
7280 // The .got.plt section.
7281 Output_data_space* got_plt_;
7282 // The number of PLT entries.
7283 unsigned int count_;
7284};
7285
7286// Create the PLT section. The ordinary .got section is an argument,
7287// since we need to refer to the start. We also create our own .got
7288// section just for PLT entries.
7289
7290template<bool big_endian>
2ea97941 7291Output_data_plt_arm<big_endian>::Output_data_plt_arm(Layout* layout,
94cdfcff
DK
7292 Output_data_space* got_plt)
7293 : Output_section_data(4), got_plt_(got_plt), count_(0)
7294{
7295 this->rel_ = new Reloc_section(false);
2ea97941 7296 layout->add_output_section_data(".rel.plt", elfcpp::SHT_REL,
22f0da72
ILT
7297 elfcpp::SHF_ALLOC, this->rel_,
7298 ORDER_DYNAMIC_PLT_RELOCS, false);
94cdfcff
DK
7299}
7300
7301template<bool big_endian>
7302void
7303Output_data_plt_arm<big_endian>::do_adjust_output_section(Output_section* os)
7304{
7305 os->set_entsize(0);
7306}
7307
7308// Add an entry to the PLT.
7309
7310template<bool big_endian>
7311void
7312Output_data_plt_arm<big_endian>::add_entry(Symbol* gsym)
7313{
7314 gold_assert(!gsym->has_plt_offset());
7315
7316 // Note that when setting the PLT offset we skip the initial
7317 // reserved PLT entry.
7318 gsym->set_plt_offset((this->count_) * sizeof(plt_entry)
7319 + sizeof(first_plt_entry));
7320
7321 ++this->count_;
7322
7323 section_offset_type got_offset = this->got_plt_->current_data_size();
7324
7325 // Every PLT entry needs a GOT entry which points back to the PLT
7326 // entry (this will be changed by the dynamic linker, normally
7327 // lazily when the function is called).
7328 this->got_plt_->set_current_data_size(got_offset + 4);
7329
7330 // Every PLT entry needs a reloc.
7331 gsym->set_needs_dynsym_entry();
7332 this->rel_->add_global(gsym, elfcpp::R_ARM_JUMP_SLOT, this->got_plt_,
7333 got_offset);
7334
7335 // Note that we don't need to save the symbol. The contents of the
7336 // PLT are independent of which symbols are used. The symbols only
7337 // appear in the relocations.
7338}
7339
7340// ARM PLTs.
7341// FIXME: This is not very flexible. Right now this has only been tested
7342// on armv5te. If we are to support additional architecture features like
7343// Thumb-2 or BE8, we need to make this more flexible like GNU ld.
7344
7345// The first entry in the PLT.
7346template<bool big_endian>
7347const uint32_t Output_data_plt_arm<big_endian>::first_plt_entry[5] =
7348{
7349 0xe52de004, // str lr, [sp, #-4]!
7350 0xe59fe004, // ldr lr, [pc, #4]
7351 0xe08fe00e, // add lr, pc, lr
7352 0xe5bef008, // ldr pc, [lr, #8]!
7353 0x00000000, // &GOT[0] - .
7354};
7355
7356// Subsequent entries in the PLT.
7357
7358template<bool big_endian>
7359const uint32_t Output_data_plt_arm<big_endian>::plt_entry[3] =
7360{
7361 0xe28fc600, // add ip, pc, #0xNN00000
7362 0xe28cca00, // add ip, ip, #0xNN000
7363 0xe5bcf000, // ldr pc, [ip, #0xNNN]!
7364};
7365
7366// Write out the PLT. This uses the hand-coded instructions above,
7367// and adjusts them as needed. This is all specified by the arm ELF
7368// Processor Supplement.
7369
7370template<bool big_endian>
7371void
7372Output_data_plt_arm<big_endian>::do_write(Output_file* of)
7373{
2ea97941 7374 const off_t offset = this->offset();
94cdfcff
DK
7375 const section_size_type oview_size =
7376 convert_to_section_size_type(this->data_size());
2ea97941 7377 unsigned char* const oview = of->get_output_view(offset, oview_size);
94cdfcff
DK
7378
7379 const off_t got_file_offset = this->got_plt_->offset();
7380 const section_size_type got_size =
7381 convert_to_section_size_type(this->got_plt_->data_size());
7382 unsigned char* const got_view = of->get_output_view(got_file_offset,
7383 got_size);
7384 unsigned char* pov = oview;
7385
ebabffbd
DK
7386 Arm_address plt_address = this->address();
7387 Arm_address got_address = this->got_plt_->address();
94cdfcff
DK
7388
7389 // Write first PLT entry. All but the last word are constants.
7390 const size_t num_first_plt_words = (sizeof(first_plt_entry)
7391 / sizeof(plt_entry[0]));
7392 for (size_t i = 0; i < num_first_plt_words - 1; i++)
7393 elfcpp::Swap<32, big_endian>::writeval(pov + i * 4, first_plt_entry[i]);
7394 // Last word in first PLT entry is &GOT[0] - .
7395 elfcpp::Swap<32, big_endian>::writeval(pov + 16,
7396 got_address - (plt_address + 16));
7397 pov += sizeof(first_plt_entry);
7398
7399 unsigned char* got_pov = got_view;
7400
7401 memset(got_pov, 0, 12);
7402 got_pov += 12;
7403
7404 const int rel_size = elfcpp::Elf_sizes<32>::rel_size;
7405 unsigned int plt_offset = sizeof(first_plt_entry);
7406 unsigned int plt_rel_offset = 0;
7407 unsigned int got_offset = 12;
7408 const unsigned int count = this->count_;
7409 for (unsigned int i = 0;
7410 i < count;
7411 ++i,
7412 pov += sizeof(plt_entry),
7413 got_pov += 4,
7414 plt_offset += sizeof(plt_entry),
7415 plt_rel_offset += rel_size,
7416 got_offset += 4)
7417 {
7418 // Set and adjust the PLT entry itself.
2ea97941
ILT
7419 int32_t offset = ((got_address + got_offset)
7420 - (plt_address + plt_offset + 8));
94cdfcff 7421
2ea97941
ILT
7422 gold_assert(offset >= 0 && offset < 0x0fffffff);
7423 uint32_t plt_insn0 = plt_entry[0] | ((offset >> 20) & 0xff);
94cdfcff 7424 elfcpp::Swap<32, big_endian>::writeval(pov, plt_insn0);
2ea97941 7425 uint32_t plt_insn1 = plt_entry[1] | ((offset >> 12) & 0xff);
94cdfcff 7426 elfcpp::Swap<32, big_endian>::writeval(pov + 4, plt_insn1);
2ea97941 7427 uint32_t plt_insn2 = plt_entry[2] | (offset & 0xfff);
94cdfcff
DK
7428 elfcpp::Swap<32, big_endian>::writeval(pov + 8, plt_insn2);
7429
7430 // Set the entry in the GOT.
7431 elfcpp::Swap<32, big_endian>::writeval(got_pov, plt_address);
7432 }
7433
7434 gold_assert(static_cast<section_size_type>(pov - oview) == oview_size);
7435 gold_assert(static_cast<section_size_type>(got_pov - got_view) == got_size);
7436
2ea97941 7437 of->write_output_view(offset, oview_size, oview);
94cdfcff
DK
7438 of->write_output_view(got_file_offset, got_size, got_view);
7439}
7440
7441// Create a PLT entry for a global symbol.
7442
7443template<bool big_endian>
7444void
2ea97941 7445Target_arm<big_endian>::make_plt_entry(Symbol_table* symtab, Layout* layout,
94cdfcff
DK
7446 Symbol* gsym)
7447{
7448 if (gsym->has_plt_offset())
7449 return;
7450
7451 if (this->plt_ == NULL)
7452 {
7453 // Create the GOT sections first.
2ea97941 7454 this->got_section(symtab, layout);
94cdfcff 7455
2ea97941
ILT
7456 this->plt_ = new Output_data_plt_arm<big_endian>(layout, this->got_plt_);
7457 layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS,
7458 (elfcpp::SHF_ALLOC
7459 | elfcpp::SHF_EXECINSTR),
22f0da72 7460 this->plt_, ORDER_PLT, false);
94cdfcff
DK
7461 }
7462 this->plt_->add_entry(gsym);
7463}
7464
0e70b911
CC
7465// Return the number of entries in the PLT.
7466
7467template<bool big_endian>
7468unsigned int
7469Target_arm<big_endian>::plt_entry_count() const
7470{
7471 if (this->plt_ == NULL)
7472 return 0;
7473 return this->plt_->entry_count();
7474}
7475
7476// Return the offset of the first non-reserved PLT entry.
7477
7478template<bool big_endian>
7479unsigned int
7480Target_arm<big_endian>::first_plt_entry_offset() const
7481{
7482 return Output_data_plt_arm<big_endian>::first_plt_entry_offset();
7483}
7484
7485// Return the size of each PLT entry.
7486
7487template<bool big_endian>
7488unsigned int
7489Target_arm<big_endian>::plt_entry_size() const
7490{
7491 return Output_data_plt_arm<big_endian>::get_plt_entry_size();
7492}
7493
f96accdf
DK
7494// Get the section to use for TLS_DESC relocations.
7495
7496template<bool big_endian>
7497typename Target_arm<big_endian>::Reloc_section*
7498Target_arm<big_endian>::rel_tls_desc_section(Layout* layout) const
7499{
7500 return this->plt_section()->rel_tls_desc(layout);
7501}
7502
7503// Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
7504
7505template<bool big_endian>
7506void
7507Target_arm<big_endian>::define_tls_base_symbol(
7508 Symbol_table* symtab,
7509 Layout* layout)
7510{
7511 if (this->tls_base_symbol_defined_)
7512 return;
7513
7514 Output_segment* tls_segment = layout->tls_segment();
7515 if (tls_segment != NULL)
7516 {
7517 bool is_exec = parameters->options().output_is_executable();
7518 symtab->define_in_output_segment("_TLS_MODULE_BASE_", NULL,
7519 Symbol_table::PREDEFINED,
7520 tls_segment, 0, 0,
7521 elfcpp::STT_TLS,
7522 elfcpp::STB_LOCAL,
7523 elfcpp::STV_HIDDEN, 0,
7524 (is_exec
7525 ? Symbol::SEGMENT_END
7526 : Symbol::SEGMENT_START),
7527 true);
7528 }
7529 this->tls_base_symbol_defined_ = true;
7530}
7531
7532// Create a GOT entry for the TLS module index.
7533
7534template<bool big_endian>
7535unsigned int
7536Target_arm<big_endian>::got_mod_index_entry(
7537 Symbol_table* symtab,
7538 Layout* layout,
7539 Sized_relobj<32, big_endian>* object)
7540{
7541 if (this->got_mod_index_offset_ == -1U)
7542 {
7543 gold_assert(symtab != NULL && layout != NULL && object != NULL);
4a54abbb
DK
7544 Arm_output_data_got<big_endian>* got = this->got_section(symtab, layout);
7545 unsigned int got_offset;
7546 if (!parameters->doing_static_link())
7547 {
7548 got_offset = got->add_constant(0);
7549 Reloc_section* rel_dyn = this->rel_dyn_section(layout);
7550 rel_dyn->add_local(object, 0, elfcpp::R_ARM_TLS_DTPMOD32, got,
7551 got_offset);
7552 }
7553 else
7554 {
7555 // We are doing a static link. Just mark it as belong to module 1,
7556 // the executable.
7557 got_offset = got->add_constant(1);
7558 }
7559
f96accdf
DK
7560 got->add_constant(0);
7561 this->got_mod_index_offset_ = got_offset;
7562 }
7563 return this->got_mod_index_offset_;
7564}
7565
7566// Optimize the TLS relocation type based on what we know about the
7567// symbol. IS_FINAL is true if the final address of this symbol is
7568// known at link time.
7569
7570template<bool big_endian>
7571tls::Tls_optimization
7572Target_arm<big_endian>::optimize_tls_reloc(bool, int)
7573{
7574 // FIXME: Currently we do not do any TLS optimization.
7575 return tls::TLSOPT_NONE;
7576}
7577
95a2c8d6
RS
7578// Get the Reference_flags for a particular relocation.
7579
7580template<bool big_endian>
7581int
7582Target_arm<big_endian>::Scan::get_reference_flags(unsigned int r_type)
7583{
7584 switch (r_type)
7585 {
7586 case elfcpp::R_ARM_NONE:
7587 case elfcpp::R_ARM_V4BX:
7588 case elfcpp::R_ARM_GNU_VTENTRY:
7589 case elfcpp::R_ARM_GNU_VTINHERIT:
7590 // No symbol reference.
7591 return 0;
7592
7593 case elfcpp::R_ARM_ABS32:
7594 case elfcpp::R_ARM_ABS16:
7595 case elfcpp::R_ARM_ABS12:
7596 case elfcpp::R_ARM_THM_ABS5:
7597 case elfcpp::R_ARM_ABS8:
7598 case elfcpp::R_ARM_BASE_ABS:
7599 case elfcpp::R_ARM_MOVW_ABS_NC:
7600 case elfcpp::R_ARM_MOVT_ABS:
7601 case elfcpp::R_ARM_THM_MOVW_ABS_NC:
7602 case elfcpp::R_ARM_THM_MOVT_ABS:
7603 case elfcpp::R_ARM_ABS32_NOI:
7604 return Symbol::ABSOLUTE_REF;
7605
7606 case elfcpp::R_ARM_REL32:
7607 case elfcpp::R_ARM_LDR_PC_G0:
7608 case elfcpp::R_ARM_SBREL32:
7609 case elfcpp::R_ARM_THM_PC8:
7610 case elfcpp::R_ARM_BASE_PREL:
7611 case elfcpp::R_ARM_MOVW_PREL_NC:
7612 case elfcpp::R_ARM_MOVT_PREL:
7613 case elfcpp::R_ARM_THM_MOVW_PREL_NC:
7614 case elfcpp::R_ARM_THM_MOVT_PREL:
7615 case elfcpp::R_ARM_THM_ALU_PREL_11_0:
7616 case elfcpp::R_ARM_THM_PC12:
7617 case elfcpp::R_ARM_REL32_NOI:
7618 case elfcpp::R_ARM_ALU_PC_G0_NC:
7619 case elfcpp::R_ARM_ALU_PC_G0:
7620 case elfcpp::R_ARM_ALU_PC_G1_NC:
7621 case elfcpp::R_ARM_ALU_PC_G1:
7622 case elfcpp::R_ARM_ALU_PC_G2:
7623 case elfcpp::R_ARM_LDR_PC_G1:
7624 case elfcpp::R_ARM_LDR_PC_G2:
7625 case elfcpp::R_ARM_LDRS_PC_G0:
7626 case elfcpp::R_ARM_LDRS_PC_G1:
7627 case elfcpp::R_ARM_LDRS_PC_G2:
7628 case elfcpp::R_ARM_LDC_PC_G0:
7629 case elfcpp::R_ARM_LDC_PC_G1:
7630 case elfcpp::R_ARM_LDC_PC_G2:
7631 case elfcpp::R_ARM_ALU_SB_G0_NC:
7632 case elfcpp::R_ARM_ALU_SB_G0:
7633 case elfcpp::R_ARM_ALU_SB_G1_NC:
7634 case elfcpp::R_ARM_ALU_SB_G1:
7635 case elfcpp::R_ARM_ALU_SB_G2:
7636 case elfcpp::R_ARM_LDR_SB_G0:
7637 case elfcpp::R_ARM_LDR_SB_G1:
7638 case elfcpp::R_ARM_LDR_SB_G2:
7639 case elfcpp::R_ARM_LDRS_SB_G0:
7640 case elfcpp::R_ARM_LDRS_SB_G1:
7641 case elfcpp::R_ARM_LDRS_SB_G2:
7642 case elfcpp::R_ARM_LDC_SB_G0:
7643 case elfcpp::R_ARM_LDC_SB_G1:
7644 case elfcpp::R_ARM_LDC_SB_G2:
7645 case elfcpp::R_ARM_MOVW_BREL_NC:
7646 case elfcpp::R_ARM_MOVT_BREL:
7647 case elfcpp::R_ARM_MOVW_BREL:
7648 case elfcpp::R_ARM_THM_MOVW_BREL_NC:
7649 case elfcpp::R_ARM_THM_MOVT_BREL:
7650 case elfcpp::R_ARM_THM_MOVW_BREL:
7651 case elfcpp::R_ARM_GOTOFF32:
7652 case elfcpp::R_ARM_GOTOFF12:
95a2c8d6
RS
7653 case elfcpp::R_ARM_SBREL31:
7654 return Symbol::RELATIVE_REF;
7655
7656 case elfcpp::R_ARM_PLT32:
7657 case elfcpp::R_ARM_CALL:
7658 case elfcpp::R_ARM_JUMP24:
7659 case elfcpp::R_ARM_THM_CALL:
7660 case elfcpp::R_ARM_THM_JUMP24:
7661 case elfcpp::R_ARM_THM_JUMP19:
7662 case elfcpp::R_ARM_THM_JUMP6:
7663 case elfcpp::R_ARM_THM_JUMP11:
7664 case elfcpp::R_ARM_THM_JUMP8:
017257f8
DK
7665 // R_ARM_PREL31 is not used to relocate call/jump instructions but
7666 // in unwind tables. It may point to functions via PLTs.
7667 // So we treat it like call/jump relocations above.
7668 case elfcpp::R_ARM_PREL31:
95a2c8d6
RS
7669 return Symbol::FUNCTION_CALL | Symbol::RELATIVE_REF;
7670
7671 case elfcpp::R_ARM_GOT_BREL:
7672 case elfcpp::R_ARM_GOT_ABS:
7673 case elfcpp::R_ARM_GOT_PREL:
7674 // Absolute in GOT.
7675 return Symbol::ABSOLUTE_REF;
7676
7677 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
7678 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
7679 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
7680 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
7681 case elfcpp::R_ARM_TLS_LE32: // Local-exec
7682 return Symbol::TLS_REF;
7683
7684 case elfcpp::R_ARM_TARGET1:
7685 case elfcpp::R_ARM_TARGET2:
7686 case elfcpp::R_ARM_COPY:
7687 case elfcpp::R_ARM_GLOB_DAT:
7688 case elfcpp::R_ARM_JUMP_SLOT:
7689 case elfcpp::R_ARM_RELATIVE:
7690 case elfcpp::R_ARM_PC24:
7691 case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
7692 case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
7693 case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
7694 default:
7695 // Not expected. We will give an error later.
7696 return 0;
7697 }
7698}
7699
4a657b0d
DK
7700// Report an unsupported relocation against a local symbol.
7701
7702template<bool big_endian>
7703void
7704Target_arm<big_endian>::Scan::unsupported_reloc_local(
7705 Sized_relobj<32, big_endian>* object,
7706 unsigned int r_type)
7707{
7708 gold_error(_("%s: unsupported reloc %u against local symbol"),
7709 object->name().c_str(), r_type);
7710}
7711
bec53400
DK
7712// We are about to emit a dynamic relocation of type R_TYPE. If the
7713// dynamic linker does not support it, issue an error. The GNU linker
7714// only issues a non-PIC error for an allocated read-only section.
7715// Here we know the section is allocated, but we don't know that it is
7716// read-only. But we check for all the relocation types which the
7717// glibc dynamic linker supports, so it seems appropriate to issue an
7718// error even if the section is not read-only.
7719
7720template<bool big_endian>
7721void
7722Target_arm<big_endian>::Scan::check_non_pic(Relobj* object,
7723 unsigned int r_type)
7724{
7725 switch (r_type)
7726 {
7727 // These are the relocation types supported by glibc for ARM.
7728 case elfcpp::R_ARM_RELATIVE:
7729 case elfcpp::R_ARM_COPY:
7730 case elfcpp::R_ARM_GLOB_DAT:
7731 case elfcpp::R_ARM_JUMP_SLOT:
7732 case elfcpp::R_ARM_ABS32:
be8fcb75 7733 case elfcpp::R_ARM_ABS32_NOI:
bec53400
DK
7734 case elfcpp::R_ARM_PC24:
7735 // FIXME: The following 3 types are not supported by Android's dynamic
7736 // linker.
7737 case elfcpp::R_ARM_TLS_DTPMOD32:
7738 case elfcpp::R_ARM_TLS_DTPOFF32:
7739 case elfcpp::R_ARM_TLS_TPOFF32:
7740 return;
7741
7742 default:
c8761b9a
DK
7743 {
7744 // This prevents us from issuing more than one error per reloc
7745 // section. But we can still wind up issuing more than one
7746 // error per object file.
7747 if (this->issued_non_pic_error_)
7748 return;
7749 const Arm_reloc_property* reloc_property =
7750 arm_reloc_property_table->get_reloc_property(r_type);
7751 gold_assert(reloc_property != NULL);
7752 object->error(_("requires unsupported dynamic reloc %s; "
7753 "recompile with -fPIC"),
7754 reloc_property->name().c_str());
7755 this->issued_non_pic_error_ = true;
bec53400 7756 return;
c8761b9a 7757 }
bec53400
DK
7758
7759 case elfcpp::R_ARM_NONE:
7760 gold_unreachable();
7761 }
7762}
7763
4a657b0d 7764// Scan a relocation for a local symbol.
bec53400
DK
7765// FIXME: This only handles a subset of relocation types used by Android
7766// on ARM v5te devices.
4a657b0d
DK
7767
7768template<bool big_endian>
7769inline void
ad0f2072 7770Target_arm<big_endian>::Scan::local(Symbol_table* symtab,
2ea97941 7771 Layout* layout,
bec53400 7772 Target_arm* target,
4a657b0d 7773 Sized_relobj<32, big_endian>* object,
bec53400
DK
7774 unsigned int data_shndx,
7775 Output_section* output_section,
7776 const elfcpp::Rel<32, big_endian>& reloc,
4a657b0d 7777 unsigned int r_type,
e4782e83 7778 const elfcpp::Sym<32, big_endian>& lsym)
4a657b0d 7779{
a6d1ef57 7780 r_type = get_real_reloc_type(r_type);
4a657b0d
DK
7781 switch (r_type)
7782 {
7783 case elfcpp::R_ARM_NONE:
e4782e83
DK
7784 case elfcpp::R_ARM_V4BX:
7785 case elfcpp::R_ARM_GNU_VTENTRY:
7786 case elfcpp::R_ARM_GNU_VTINHERIT:
4a657b0d
DK
7787 break;
7788
bec53400 7789 case elfcpp::R_ARM_ABS32:
be8fcb75 7790 case elfcpp::R_ARM_ABS32_NOI:
bec53400
DK
7791 // If building a shared library (or a position-independent
7792 // executable), we need to create a dynamic relocation for
7793 // this location. The relocation applied at link time will
7794 // apply the link-time value, so we flag the location with
7795 // an R_ARM_RELATIVE relocation so the dynamic loader can
7796 // relocate it easily.
7797 if (parameters->options().output_is_position_independent())
7798 {
2ea97941 7799 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
bec53400
DK
7800 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7801 // If we are to add more other reloc types than R_ARM_ABS32,
7802 // we need to add check_non_pic(object, r_type) here.
7803 rel_dyn->add_local_relative(object, r_sym, elfcpp::R_ARM_RELATIVE,
7804 output_section, data_shndx,
7805 reloc.get_r_offset());
7806 }
7807 break;
7808
e4782e83
DK
7809 case elfcpp::R_ARM_ABS16:
7810 case elfcpp::R_ARM_ABS12:
be8fcb75
ILT
7811 case elfcpp::R_ARM_THM_ABS5:
7812 case elfcpp::R_ARM_ABS8:
be8fcb75 7813 case elfcpp::R_ARM_BASE_ABS:
fd3c5f0b
ILT
7814 case elfcpp::R_ARM_MOVW_ABS_NC:
7815 case elfcpp::R_ARM_MOVT_ABS:
7816 case elfcpp::R_ARM_THM_MOVW_ABS_NC:
7817 case elfcpp::R_ARM_THM_MOVT_ABS:
e4782e83
DK
7818 // If building a shared library (or a position-independent
7819 // executable), we need to create a dynamic relocation for
7820 // this location. Because the addend needs to remain in the
7821 // data section, we need to be careful not to apply this
7822 // relocation statically.
7823 if (parameters->options().output_is_position_independent())
7824 {
7825 check_non_pic(object, r_type);
7826 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7827 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7828 if (lsym.get_st_type() != elfcpp::STT_SECTION)
7829 rel_dyn->add_local(object, r_sym, r_type, output_section,
7830 data_shndx, reloc.get_r_offset());
7831 else
7832 {
7833 gold_assert(lsym.get_st_value() == 0);
7834 unsigned int shndx = lsym.get_st_shndx();
7835 bool is_ordinary;
7836 shndx = object->adjust_sym_shndx(r_sym, shndx,
7837 &is_ordinary);
7838 if (!is_ordinary)
7839 object->error(_("section symbol %u has bad shndx %u"),
7840 r_sym, shndx);
7841 else
7842 rel_dyn->add_local_section(object, shndx,
7843 r_type, output_section,
7844 data_shndx, reloc.get_r_offset());
7845 }
7846 }
7847 break;
7848
e4782e83
DK
7849 case elfcpp::R_ARM_REL32:
7850 case elfcpp::R_ARM_LDR_PC_G0:
7851 case elfcpp::R_ARM_SBREL32:
7852 case elfcpp::R_ARM_THM_CALL:
7853 case elfcpp::R_ARM_THM_PC8:
7854 case elfcpp::R_ARM_BASE_PREL:
7855 case elfcpp::R_ARM_PLT32:
7856 case elfcpp::R_ARM_CALL:
7857 case elfcpp::R_ARM_JUMP24:
7858 case elfcpp::R_ARM_THM_JUMP24:
e4782e83
DK
7859 case elfcpp::R_ARM_SBREL31:
7860 case elfcpp::R_ARM_PREL31:
c2a122b6
ILT
7861 case elfcpp::R_ARM_MOVW_PREL_NC:
7862 case elfcpp::R_ARM_MOVT_PREL:
7863 case elfcpp::R_ARM_THM_MOVW_PREL_NC:
7864 case elfcpp::R_ARM_THM_MOVT_PREL:
e4782e83 7865 case elfcpp::R_ARM_THM_JUMP19:
800d0f56 7866 case elfcpp::R_ARM_THM_JUMP6:
11b861d5 7867 case elfcpp::R_ARM_THM_ALU_PREL_11_0:
e4782e83
DK
7868 case elfcpp::R_ARM_THM_PC12:
7869 case elfcpp::R_ARM_REL32_NOI:
b10d2873
ILT
7870 case elfcpp::R_ARM_ALU_PC_G0_NC:
7871 case elfcpp::R_ARM_ALU_PC_G0:
7872 case elfcpp::R_ARM_ALU_PC_G1_NC:
7873 case elfcpp::R_ARM_ALU_PC_G1:
7874 case elfcpp::R_ARM_ALU_PC_G2:
e4782e83
DK
7875 case elfcpp::R_ARM_LDR_PC_G1:
7876 case elfcpp::R_ARM_LDR_PC_G2:
7877 case elfcpp::R_ARM_LDRS_PC_G0:
7878 case elfcpp::R_ARM_LDRS_PC_G1:
7879 case elfcpp::R_ARM_LDRS_PC_G2:
7880 case elfcpp::R_ARM_LDC_PC_G0:
7881 case elfcpp::R_ARM_LDC_PC_G1:
7882 case elfcpp::R_ARM_LDC_PC_G2:
b10d2873
ILT
7883 case elfcpp::R_ARM_ALU_SB_G0_NC:
7884 case elfcpp::R_ARM_ALU_SB_G0:
7885 case elfcpp::R_ARM_ALU_SB_G1_NC:
7886 case elfcpp::R_ARM_ALU_SB_G1:
7887 case elfcpp::R_ARM_ALU_SB_G2:
b10d2873
ILT
7888 case elfcpp::R_ARM_LDR_SB_G0:
7889 case elfcpp::R_ARM_LDR_SB_G1:
7890 case elfcpp::R_ARM_LDR_SB_G2:
b10d2873
ILT
7891 case elfcpp::R_ARM_LDRS_SB_G0:
7892 case elfcpp::R_ARM_LDRS_SB_G1:
7893 case elfcpp::R_ARM_LDRS_SB_G2:
b10d2873
ILT
7894 case elfcpp::R_ARM_LDC_SB_G0:
7895 case elfcpp::R_ARM_LDC_SB_G1:
7896 case elfcpp::R_ARM_LDC_SB_G2:
e4782e83
DK
7897 case elfcpp::R_ARM_MOVW_BREL_NC:
7898 case elfcpp::R_ARM_MOVT_BREL:
7899 case elfcpp::R_ARM_MOVW_BREL:
7900 case elfcpp::R_ARM_THM_MOVW_BREL_NC:
7901 case elfcpp::R_ARM_THM_MOVT_BREL:
7902 case elfcpp::R_ARM_THM_MOVW_BREL:
7903 case elfcpp::R_ARM_THM_JUMP11:
7904 case elfcpp::R_ARM_THM_JUMP8:
7905 // We don't need to do anything for a relative addressing relocation
7906 // against a local symbol if it does not reference the GOT.
bec53400
DK
7907 break;
7908
7909 case elfcpp::R_ARM_GOTOFF32:
e4782e83 7910 case elfcpp::R_ARM_GOTOFF12:
bec53400 7911 // We need a GOT section:
2ea97941 7912 target->got_section(symtab, layout);
bec53400
DK
7913 break;
7914
bec53400 7915 case elfcpp::R_ARM_GOT_BREL:
7f5309a5 7916 case elfcpp::R_ARM_GOT_PREL:
bec53400
DK
7917 {
7918 // The symbol requires a GOT entry.
4a54abbb 7919 Arm_output_data_got<big_endian>* got =
2ea97941 7920 target->got_section(symtab, layout);
bec53400
DK
7921 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7922 if (got->add_local(object, r_sym, GOT_TYPE_STANDARD))
7923 {
7924 // If we are generating a shared object, we need to add a
7925 // dynamic RELATIVE relocation for this symbol's GOT entry.
7926 if (parameters->options().output_is_position_independent())
7927 {
2ea97941
ILT
7928 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7929 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
bec53400 7930 rel_dyn->add_local_relative(
2ea97941
ILT
7931 object, r_sym, elfcpp::R_ARM_RELATIVE, got,
7932 object->local_got_offset(r_sym, GOT_TYPE_STANDARD));
bec53400
DK
7933 }
7934 }
7935 }
7936 break;
7937
7938 case elfcpp::R_ARM_TARGET1:
e4782e83 7939 case elfcpp::R_ARM_TARGET2:
bec53400
DK
7940 // This should have been mapped to another type already.
7941 // Fall through.
7942 case elfcpp::R_ARM_COPY:
7943 case elfcpp::R_ARM_GLOB_DAT:
7944 case elfcpp::R_ARM_JUMP_SLOT:
7945 case elfcpp::R_ARM_RELATIVE:
7946 // These are relocations which should only be seen by the
7947 // dynamic linker, and should never be seen here.
7948 gold_error(_("%s: unexpected reloc %u in object file"),
7949 object->name().c_str(), r_type);
7950 break;
7951
f96accdf
DK
7952
7953 // These are initial TLS relocs, which are expected when
7954 // linking.
7955 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
7956 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
7957 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
7958 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
7959 case elfcpp::R_ARM_TLS_LE32: // Local-exec
7960 {
7961 bool output_is_shared = parameters->options().shared();
7962 const tls::Tls_optimization optimized_type
7963 = Target_arm<big_endian>::optimize_tls_reloc(!output_is_shared,
7964 r_type);
7965 switch (r_type)
7966 {
7967 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
7968 if (optimized_type == tls::TLSOPT_NONE)
7969 {
7970 // Create a pair of GOT entries for the module index and
7971 // dtv-relative offset.
4a54abbb 7972 Arm_output_data_got<big_endian>* got
f96accdf
DK
7973 = target->got_section(symtab, layout);
7974 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7975 unsigned int shndx = lsym.get_st_shndx();
7976 bool is_ordinary;
7977 shndx = object->adjust_sym_shndx(r_sym, shndx, &is_ordinary);
7978 if (!is_ordinary)
4a54abbb
DK
7979 {
7980 object->error(_("local symbol %u has bad shndx %u"),
7981 r_sym, shndx);
7982 break;
7983 }
7984
7985 if (!parameters->doing_static_link())
f96accdf
DK
7986 got->add_local_pair_with_rel(object, r_sym, shndx,
7987 GOT_TYPE_TLS_PAIR,
7988 target->rel_dyn_section(layout),
7989 elfcpp::R_ARM_TLS_DTPMOD32, 0);
4a54abbb
DK
7990 else
7991 got->add_tls_gd32_with_static_reloc(GOT_TYPE_TLS_PAIR,
7992 object, r_sym);
f96accdf
DK
7993 }
7994 else
7995 // FIXME: TLS optimization not supported yet.
7996 gold_unreachable();
7997 break;
7998
7999 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
8000 if (optimized_type == tls::TLSOPT_NONE)
8001 {
8002 // Create a GOT entry for the module index.
8003 target->got_mod_index_entry(symtab, layout, object);
8004 }
8005 else
8006 // FIXME: TLS optimization not supported yet.
8007 gold_unreachable();
8008 break;
8009
8010 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
8011 break;
8012
8013 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
8014 layout->set_has_static_tls();
8015 if (optimized_type == tls::TLSOPT_NONE)
8016 {
4a54abbb
DK
8017 // Create a GOT entry for the tp-relative offset.
8018 Arm_output_data_got<big_endian>* got
8019 = target->got_section(symtab, layout);
8020 unsigned int r_sym =
8021 elfcpp::elf_r_sym<32>(reloc.get_r_info());
8022 if (!parameters->doing_static_link())
8023 got->add_local_with_rel(object, r_sym, GOT_TYPE_TLS_OFFSET,
8024 target->rel_dyn_section(layout),
8025 elfcpp::R_ARM_TLS_TPOFF32);
8026 else if (!object->local_has_got_offset(r_sym,
8027 GOT_TYPE_TLS_OFFSET))
8028 {
8029 got->add_local(object, r_sym, GOT_TYPE_TLS_OFFSET);
8030 unsigned int got_offset =
8031 object->local_got_offset(r_sym, GOT_TYPE_TLS_OFFSET);
8032 got->add_static_reloc(got_offset,
8033 elfcpp::R_ARM_TLS_TPOFF32, object,
8034 r_sym);
8035 }
f96accdf
DK
8036 }
8037 else
8038 // FIXME: TLS optimization not supported yet.
8039 gold_unreachable();
8040 break;
8041
8042 case elfcpp::R_ARM_TLS_LE32: // Local-exec
8043 layout->set_has_static_tls();
8044 if (output_is_shared)
8045 {
8046 // We need to create a dynamic relocation.
8047 gold_assert(lsym.get_st_type() != elfcpp::STT_SECTION);
8048 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
8049 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8050 rel_dyn->add_local(object, r_sym, elfcpp::R_ARM_TLS_TPOFF32,
8051 output_section, data_shndx,
8052 reloc.get_r_offset());
8053 }
8054 break;
8055
8056 default:
8057 gold_unreachable();
8058 }
8059 }
8060 break;
8061
3cef7179
ILT
8062 case elfcpp::R_ARM_PC24:
8063 case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
8064 case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
8065 case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
4a657b0d
DK
8066 default:
8067 unsupported_reloc_local(object, r_type);
8068 break;
8069 }
8070}
8071
8072// Report an unsupported relocation against a global symbol.
8073
8074template<bool big_endian>
8075void
8076Target_arm<big_endian>::Scan::unsupported_reloc_global(
8077 Sized_relobj<32, big_endian>* object,
8078 unsigned int r_type,
8079 Symbol* gsym)
8080{
8081 gold_error(_("%s: unsupported reloc %u against global symbol %s"),
8082 object->name().c_str(), r_type, gsym->demangled_name().c_str());
8083}
8084
8a75a161
DK
8085template<bool big_endian>
8086inline bool
8087Target_arm<big_endian>::Scan::possible_function_pointer_reloc(
8088 unsigned int r_type)
8089{
8090 switch (r_type)
8091 {
8092 case elfcpp::R_ARM_PC24:
8093 case elfcpp::R_ARM_THM_CALL:
8094 case elfcpp::R_ARM_PLT32:
8095 case elfcpp::R_ARM_CALL:
8096 case elfcpp::R_ARM_JUMP24:
8097 case elfcpp::R_ARM_THM_JUMP24:
8098 case elfcpp::R_ARM_SBREL31:
8099 case elfcpp::R_ARM_PREL31:
8100 case elfcpp::R_ARM_THM_JUMP19:
8101 case elfcpp::R_ARM_THM_JUMP6:
8102 case elfcpp::R_ARM_THM_JUMP11:
8103 case elfcpp::R_ARM_THM_JUMP8:
8104 // All the relocations above are branches except SBREL31 and PREL31.
8105 return false;
8106
8107 default:
8108 // Be conservative and assume this is a function pointer.
8109 return true;
8110 }
8111}
8112
8113template<bool big_endian>
8114inline bool
8115Target_arm<big_endian>::Scan::local_reloc_may_be_function_pointer(
8116 Symbol_table*,
8117 Layout*,
8118 Target_arm<big_endian>* target,
8119 Sized_relobj<32, big_endian>*,
8120 unsigned int,
8121 Output_section*,
8122 const elfcpp::Rel<32, big_endian>&,
8123 unsigned int r_type,
8124 const elfcpp::Sym<32, big_endian>&)
8125{
8126 r_type = target->get_real_reloc_type(r_type);
8127 return possible_function_pointer_reloc(r_type);
8128}
8129
8130template<bool big_endian>
8131inline bool
8132Target_arm<big_endian>::Scan::global_reloc_may_be_function_pointer(
8133 Symbol_table*,
8134 Layout*,
8135 Target_arm<big_endian>* target,
8136 Sized_relobj<32, big_endian>*,
8137 unsigned int,
8138 Output_section*,
8139 const elfcpp::Rel<32, big_endian>&,
8140 unsigned int r_type,
8141 Symbol* gsym)
8142{
8143 // GOT is not a function.
8144 if (strcmp(gsym->name(), "_GLOBAL_OFFSET_TABLE_") == 0)
8145 return false;
8146
8147 r_type = target->get_real_reloc_type(r_type);
8148 return possible_function_pointer_reloc(r_type);
8149}
8150
4a657b0d
DK
8151// Scan a relocation for a global symbol.
8152
8153template<bool big_endian>
8154inline void
ad0f2072 8155Target_arm<big_endian>::Scan::global(Symbol_table* symtab,
2ea97941 8156 Layout* layout,
bec53400 8157 Target_arm* target,
4a657b0d 8158 Sized_relobj<32, big_endian>* object,
bec53400
DK
8159 unsigned int data_shndx,
8160 Output_section* output_section,
8161 const elfcpp::Rel<32, big_endian>& reloc,
4a657b0d
DK
8162 unsigned int r_type,
8163 Symbol* gsym)
8164{
c8761b9a
DK
8165 // A reference to _GLOBAL_OFFSET_TABLE_ implies that we need a got
8166 // section. We check here to avoid creating a dynamic reloc against
8167 // _GLOBAL_OFFSET_TABLE_.
8168 if (!target->has_got_section()
8169 && strcmp(gsym->name(), "_GLOBAL_OFFSET_TABLE_") == 0)
8170 target->got_section(symtab, layout);
8171
a6d1ef57 8172 r_type = get_real_reloc_type(r_type);
4a657b0d
DK
8173 switch (r_type)
8174 {
8175 case elfcpp::R_ARM_NONE:
e4782e83
DK
8176 case elfcpp::R_ARM_V4BX:
8177 case elfcpp::R_ARM_GNU_VTENTRY:
8178 case elfcpp::R_ARM_GNU_VTINHERIT:
4a657b0d
DK
8179 break;
8180
bec53400 8181 case elfcpp::R_ARM_ABS32:
e4782e83
DK
8182 case elfcpp::R_ARM_ABS16:
8183 case elfcpp::R_ARM_ABS12:
8184 case elfcpp::R_ARM_THM_ABS5:
8185 case elfcpp::R_ARM_ABS8:
8186 case elfcpp::R_ARM_BASE_ABS:
8187 case elfcpp::R_ARM_MOVW_ABS_NC:
8188 case elfcpp::R_ARM_MOVT_ABS:
8189 case elfcpp::R_ARM_THM_MOVW_ABS_NC:
8190 case elfcpp::R_ARM_THM_MOVT_ABS:
be8fcb75 8191 case elfcpp::R_ARM_ABS32_NOI:
e4782e83 8192 // Absolute addressing relocations.
bec53400 8193 {
e4782e83
DK
8194 // Make a PLT entry if necessary.
8195 if (this->symbol_needs_plt_entry(gsym))
8196 {
8197 target->make_plt_entry(symtab, layout, gsym);
8198 // Since this is not a PC-relative relocation, we may be
8199 // taking the address of a function. In that case we need to
8200 // set the entry in the dynamic symbol table to the address of
8201 // the PLT entry.
8202 if (gsym->is_from_dynobj() && !parameters->options().shared())
8203 gsym->set_needs_dynsym_value();
8204 }
8205 // Make a dynamic relocation if necessary.
95a2c8d6 8206 if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type)))
e4782e83
DK
8207 {
8208 if (gsym->may_need_copy_reloc())
8209 {
8210 target->copy_reloc(symtab, layout, object,
8211 data_shndx, output_section, gsym, reloc);
8212 }
8213 else if ((r_type == elfcpp::R_ARM_ABS32
8214 || r_type == elfcpp::R_ARM_ABS32_NOI)
8215 && gsym->can_use_relative_reloc(false))
8216 {
8217 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8218 rel_dyn->add_global_relative(gsym, elfcpp::R_ARM_RELATIVE,
8219 output_section, object,
8220 data_shndx, reloc.get_r_offset());
8221 }
8222 else
8223 {
8224 check_non_pic(object, r_type);
8225 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8226 rel_dyn->add_global(gsym, r_type, output_section, object,
8227 data_shndx, reloc.get_r_offset());
8228 }
8229 }
bec53400
DK
8230 }
8231 break;
8232
e4782e83
DK
8233 case elfcpp::R_ARM_GOTOFF32:
8234 case elfcpp::R_ARM_GOTOFF12:
8235 // We need a GOT section.
8236 target->got_section(symtab, layout);
8237 break;
8238
8239 case elfcpp::R_ARM_REL32:
8240 case elfcpp::R_ARM_LDR_PC_G0:
8241 case elfcpp::R_ARM_SBREL32:
8242 case elfcpp::R_ARM_THM_PC8:
8243 case elfcpp::R_ARM_BASE_PREL:
c2a122b6
ILT
8244 case elfcpp::R_ARM_MOVW_PREL_NC:
8245 case elfcpp::R_ARM_MOVT_PREL:
8246 case elfcpp::R_ARM_THM_MOVW_PREL_NC:
8247 case elfcpp::R_ARM_THM_MOVT_PREL:
11b861d5 8248 case elfcpp::R_ARM_THM_ALU_PREL_11_0:
e4782e83
DK
8249 case elfcpp::R_ARM_THM_PC12:
8250 case elfcpp::R_ARM_REL32_NOI:
b10d2873
ILT
8251 case elfcpp::R_ARM_ALU_PC_G0_NC:
8252 case elfcpp::R_ARM_ALU_PC_G0:
8253 case elfcpp::R_ARM_ALU_PC_G1_NC:
8254 case elfcpp::R_ARM_ALU_PC_G1:
8255 case elfcpp::R_ARM_ALU_PC_G2:
e4782e83
DK
8256 case elfcpp::R_ARM_LDR_PC_G1:
8257 case elfcpp::R_ARM_LDR_PC_G2:
8258 case elfcpp::R_ARM_LDRS_PC_G0:
8259 case elfcpp::R_ARM_LDRS_PC_G1:
8260 case elfcpp::R_ARM_LDRS_PC_G2:
8261 case elfcpp::R_ARM_LDC_PC_G0:
8262 case elfcpp::R_ARM_LDC_PC_G1:
8263 case elfcpp::R_ARM_LDC_PC_G2:
b10d2873
ILT
8264 case elfcpp::R_ARM_ALU_SB_G0_NC:
8265 case elfcpp::R_ARM_ALU_SB_G0:
8266 case elfcpp::R_ARM_ALU_SB_G1_NC:
8267 case elfcpp::R_ARM_ALU_SB_G1:
8268 case elfcpp::R_ARM_ALU_SB_G2:
b10d2873
ILT
8269 case elfcpp::R_ARM_LDR_SB_G0:
8270 case elfcpp::R_ARM_LDR_SB_G1:
8271 case elfcpp::R_ARM_LDR_SB_G2:
b10d2873
ILT
8272 case elfcpp::R_ARM_LDRS_SB_G0:
8273 case elfcpp::R_ARM_LDRS_SB_G1:
8274 case elfcpp::R_ARM_LDRS_SB_G2:
b10d2873
ILT
8275 case elfcpp::R_ARM_LDC_SB_G0:
8276 case elfcpp::R_ARM_LDC_SB_G1:
8277 case elfcpp::R_ARM_LDC_SB_G2:
e4782e83
DK
8278 case elfcpp::R_ARM_MOVW_BREL_NC:
8279 case elfcpp::R_ARM_MOVT_BREL:
8280 case elfcpp::R_ARM_MOVW_BREL:
8281 case elfcpp::R_ARM_THM_MOVW_BREL_NC:
8282 case elfcpp::R_ARM_THM_MOVT_BREL:
8283 case elfcpp::R_ARM_THM_MOVW_BREL:
8284 // Relative addressing relocations.
bec53400
DK
8285 {
8286 // Make a dynamic relocation if necessary.
95a2c8d6 8287 if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type)))
bec53400
DK
8288 {
8289 if (target->may_need_copy_reloc(gsym))
8290 {
2ea97941 8291 target->copy_reloc(symtab, layout, object,
bec53400
DK
8292 data_shndx, output_section, gsym, reloc);
8293 }
8294 else
8295 {
8296 check_non_pic(object, r_type);
2ea97941 8297 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
bec53400
DK
8298 rel_dyn->add_global(gsym, r_type, output_section, object,
8299 data_shndx, reloc.get_r_offset());
8300 }
8301 }
8302 }
8303 break;
8304
f4e5969c 8305 case elfcpp::R_ARM_THM_CALL:
bec53400 8306 case elfcpp::R_ARM_PLT32:
e4782e83
DK
8307 case elfcpp::R_ARM_CALL:
8308 case elfcpp::R_ARM_JUMP24:
8309 case elfcpp::R_ARM_THM_JUMP24:
8310 case elfcpp::R_ARM_SBREL31:
c9a2c125 8311 case elfcpp::R_ARM_PREL31:
e4782e83
DK
8312 case elfcpp::R_ARM_THM_JUMP19:
8313 case elfcpp::R_ARM_THM_JUMP6:
8314 case elfcpp::R_ARM_THM_JUMP11:
8315 case elfcpp::R_ARM_THM_JUMP8:
8316 // All the relocation above are branches except for the PREL31 ones.
8317 // A PREL31 relocation can point to a personality function in a shared
8318 // library. In that case we want to use a PLT because we want to
9b547ce6 8319 // call the personality routine and the dynamic linkers we care about
e4782e83
DK
8320 // do not support dynamic PREL31 relocations. An REL31 relocation may
8321 // point to a function whose unwinding behaviour is being described but
8322 // we will not mistakenly generate a PLT for that because we should use
8323 // a local section symbol.
8324
bec53400
DK
8325 // If the symbol is fully resolved, this is just a relative
8326 // local reloc. Otherwise we need a PLT entry.
8327 if (gsym->final_value_is_known())
8328 break;
8329 // If building a shared library, we can also skip the PLT entry
8330 // if the symbol is defined in the output file and is protected
8331 // or hidden.
8332 if (gsym->is_defined()
8333 && !gsym->is_from_dynobj()
8334 && !gsym->is_preemptible())
8335 break;
2ea97941 8336 target->make_plt_entry(symtab, layout, gsym);
bec53400
DK
8337 break;
8338
bec53400 8339 case elfcpp::R_ARM_GOT_BREL:
e4782e83 8340 case elfcpp::R_ARM_GOT_ABS:
7f5309a5 8341 case elfcpp::R_ARM_GOT_PREL:
bec53400
DK
8342 {
8343 // The symbol requires a GOT entry.
4a54abbb 8344 Arm_output_data_got<big_endian>* got =
2ea97941 8345 target->got_section(symtab, layout);
bec53400
DK
8346 if (gsym->final_value_is_known())
8347 got->add_global(gsym, GOT_TYPE_STANDARD);
8348 else
8349 {
8350 // If this symbol is not fully resolved, we need to add a
8351 // GOT entry with a dynamic relocation.
2ea97941 8352 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
bec53400
DK
8353 if (gsym->is_from_dynobj()
8354 || gsym->is_undefined()
8355 || gsym->is_preemptible())
8356 got->add_global_with_rel(gsym, GOT_TYPE_STANDARD,
8357 rel_dyn, elfcpp::R_ARM_GLOB_DAT);
8358 else
8359 {
8360 if (got->add_global(gsym, GOT_TYPE_STANDARD))
8361 rel_dyn->add_global_relative(
8362 gsym, elfcpp::R_ARM_RELATIVE, got,
8363 gsym->got_offset(GOT_TYPE_STANDARD));
8364 }
8365 }
8366 }
8367 break;
8368
8369 case elfcpp::R_ARM_TARGET1:
e4782e83
DK
8370 case elfcpp::R_ARM_TARGET2:
8371 // These should have been mapped to other types already.
bec53400
DK
8372 // Fall through.
8373 case elfcpp::R_ARM_COPY:
8374 case elfcpp::R_ARM_GLOB_DAT:
8375 case elfcpp::R_ARM_JUMP_SLOT:
8376 case elfcpp::R_ARM_RELATIVE:
8377 // These are relocations which should only be seen by the
8378 // dynamic linker, and should never be seen here.
8379 gold_error(_("%s: unexpected reloc %u in object file"),
8380 object->name().c_str(), r_type);
8381 break;
8382
f96accdf
DK
8383 // These are initial tls relocs, which are expected when
8384 // linking.
8385 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
8386 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
8387 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
8388 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
8389 case elfcpp::R_ARM_TLS_LE32: // Local-exec
8390 {
8391 const bool is_final = gsym->final_value_is_known();
8392 const tls::Tls_optimization optimized_type
8393 = Target_arm<big_endian>::optimize_tls_reloc(is_final, r_type);
8394 switch (r_type)
8395 {
8396 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
8397 if (optimized_type == tls::TLSOPT_NONE)
8398 {
8399 // Create a pair of GOT entries for the module index and
8400 // dtv-relative offset.
4a54abbb 8401 Arm_output_data_got<big_endian>* got
f96accdf 8402 = target->got_section(symtab, layout);
4a54abbb
DK
8403 if (!parameters->doing_static_link())
8404 got->add_global_pair_with_rel(gsym, GOT_TYPE_TLS_PAIR,
8405 target->rel_dyn_section(layout),
8406 elfcpp::R_ARM_TLS_DTPMOD32,
8407 elfcpp::R_ARM_TLS_DTPOFF32);
8408 else
8409 got->add_tls_gd32_with_static_reloc(GOT_TYPE_TLS_PAIR, gsym);
f96accdf
DK
8410 }
8411 else
8412 // FIXME: TLS optimization not supported yet.
8413 gold_unreachable();
8414 break;
8415
8416 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
8417 if (optimized_type == tls::TLSOPT_NONE)
8418 {
8419 // Create a GOT entry for the module index.
8420 target->got_mod_index_entry(symtab, layout, object);
8421 }
8422 else
8423 // FIXME: TLS optimization not supported yet.
8424 gold_unreachable();
8425 break;
8426
8427 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
8428 break;
8429
8430 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
8431 layout->set_has_static_tls();
8432 if (optimized_type == tls::TLSOPT_NONE)
8433 {
4a54abbb
DK
8434 // Create a GOT entry for the tp-relative offset.
8435 Arm_output_data_got<big_endian>* got
8436 = target->got_section(symtab, layout);
8437 if (!parameters->doing_static_link())
8438 got->add_global_with_rel(gsym, GOT_TYPE_TLS_OFFSET,
8439 target->rel_dyn_section(layout),
8440 elfcpp::R_ARM_TLS_TPOFF32);
8441 else if (!gsym->has_got_offset(GOT_TYPE_TLS_OFFSET))
8442 {
8443 got->add_global(gsym, GOT_TYPE_TLS_OFFSET);
8444 unsigned int got_offset =
8445 gsym->got_offset(GOT_TYPE_TLS_OFFSET);
8446 got->add_static_reloc(got_offset,
8447 elfcpp::R_ARM_TLS_TPOFF32, gsym);
8448 }
f96accdf
DK
8449 }
8450 else
8451 // FIXME: TLS optimization not supported yet.
8452 gold_unreachable();
8453 break;
8454
8455 case elfcpp::R_ARM_TLS_LE32: // Local-exec
8456 layout->set_has_static_tls();
8457 if (parameters->options().shared())
8458 {
8459 // We need to create a dynamic relocation.
8460 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8461 rel_dyn->add_global(gsym, elfcpp::R_ARM_TLS_TPOFF32,
8462 output_section, object,
8463 data_shndx, reloc.get_r_offset());
8464 }
8465 break;
8466
8467 default:
8468 gold_unreachable();
8469 }
8470 }
8471 break;
8472
3cef7179
ILT
8473 case elfcpp::R_ARM_PC24:
8474 case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
8475 case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
8476 case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
4a657b0d
DK
8477 default:
8478 unsupported_reloc_global(object, r_type, gsym);
8479 break;
8480 }
8481}
8482
8483// Process relocations for gc.
8484
8485template<bool big_endian>
8486void
ad0f2072 8487Target_arm<big_endian>::gc_process_relocs(Symbol_table* symtab,
2ea97941 8488 Layout* layout,
4a657b0d
DK
8489 Sized_relobj<32, big_endian>* object,
8490 unsigned int data_shndx,
8491 unsigned int,
8492 const unsigned char* prelocs,
8493 size_t reloc_count,
8494 Output_section* output_section,
8495 bool needs_special_offset_handling,
8496 size_t local_symbol_count,
8497 const unsigned char* plocal_symbols)
8498{
8499 typedef Target_arm<big_endian> Arm;
2ea97941 8500 typedef typename Target_arm<big_endian>::Scan Scan;
4a657b0d 8501
41cbeecc 8502 gold::gc_process_relocs<32, big_endian, Arm, elfcpp::SHT_REL, Scan,
3ff2ccb0 8503 typename Target_arm::Relocatable_size_for_reloc>(
4a657b0d 8504 symtab,
2ea97941 8505 layout,
4a657b0d
DK
8506 this,
8507 object,
8508 data_shndx,
8509 prelocs,
8510 reloc_count,
8511 output_section,
8512 needs_special_offset_handling,
8513 local_symbol_count,
8514 plocal_symbols);
8515}
8516
8517// Scan relocations for a section.
8518
8519template<bool big_endian>
8520void
ad0f2072 8521Target_arm<big_endian>::scan_relocs(Symbol_table* symtab,
2ea97941 8522 Layout* layout,
4a657b0d
DK
8523 Sized_relobj<32, big_endian>* object,
8524 unsigned int data_shndx,
8525 unsigned int sh_type,
8526 const unsigned char* prelocs,
8527 size_t reloc_count,
8528 Output_section* output_section,
8529 bool needs_special_offset_handling,
8530 size_t local_symbol_count,
8531 const unsigned char* plocal_symbols)
8532{
2ea97941 8533 typedef typename Target_arm<big_endian>::Scan Scan;
4a657b0d
DK
8534 if (sh_type == elfcpp::SHT_RELA)
8535 {
8536 gold_error(_("%s: unsupported RELA reloc section"),
8537 object->name().c_str());
8538 return;
8539 }
8540
2ea97941 8541 gold::scan_relocs<32, big_endian, Target_arm, elfcpp::SHT_REL, Scan>(
4a657b0d 8542 symtab,
2ea97941 8543 layout,
4a657b0d
DK
8544 this,
8545 object,
8546 data_shndx,
8547 prelocs,
8548 reloc_count,
8549 output_section,
8550 needs_special_offset_handling,
8551 local_symbol_count,
8552 plocal_symbols);
8553}
8554
8555// Finalize the sections.
8556
8557template<bool big_endian>
8558void
d5b40221 8559Target_arm<big_endian>::do_finalize_sections(
2ea97941 8560 Layout* layout,
f59f41f3
DK
8561 const Input_objects* input_objects,
8562 Symbol_table* symtab)
4a657b0d 8563{
3e235302 8564 bool merged_any_attributes = false;
d5b40221
DK
8565 // Merge processor-specific flags.
8566 for (Input_objects::Relobj_iterator p = input_objects->relobj_begin();
8567 p != input_objects->relobj_end();
8568 ++p)
8569 {
8570 Arm_relobj<big_endian>* arm_relobj =
8571 Arm_relobj<big_endian>::as_arm_relobj(*p);
7296d933
DK
8572 if (arm_relobj->merge_flags_and_attributes())
8573 {
8574 this->merge_processor_specific_flags(
8575 arm_relobj->name(),
8576 arm_relobj->processor_specific_flags());
8577 this->merge_object_attributes(arm_relobj->name().c_str(),
8578 arm_relobj->attributes_section_data());
3e235302 8579 merged_any_attributes = true;
7296d933 8580 }
d5b40221
DK
8581 }
8582
8583 for (Input_objects::Dynobj_iterator p = input_objects->dynobj_begin();
8584 p != input_objects->dynobj_end();
8585 ++p)
8586 {
8587 Arm_dynobj<big_endian>* arm_dynobj =
8588 Arm_dynobj<big_endian>::as_arm_dynobj(*p);
8589 this->merge_processor_specific_flags(
8590 arm_dynobj->name(),
8591 arm_dynobj->processor_specific_flags());
a0351a69
DK
8592 this->merge_object_attributes(arm_dynobj->name().c_str(),
8593 arm_dynobj->attributes_section_data());
3e235302 8594 merged_any_attributes = true;
d5b40221
DK
8595 }
8596
da59ad79
DK
8597 // Create an empty uninitialized attribute section if we still don't have it
8598 // at this moment. This happens if there is no attributes sections in all
8599 // inputs.
8600 if (this->attributes_section_data_ == NULL)
8601 this->attributes_section_data_ = new Attributes_section_data(NULL, 0);
8602
a0351a69 8603 // Check BLX use.
41263c05 8604 const Object_attribute* cpu_arch_attr =
a0351a69 8605 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
41263c05 8606 if (cpu_arch_attr->int_value() > elfcpp::TAG_CPU_ARCH_V4)
a0351a69
DK
8607 this->set_may_use_blx(true);
8608
41263c05
DK
8609 // Check if we need to use Cortex-A8 workaround.
8610 if (parameters->options().user_set_fix_cortex_a8())
8611 this->fix_cortex_a8_ = parameters->options().fix_cortex_a8();
8612 else
8613 {
8614 // If neither --fix-cortex-a8 nor --no-fix-cortex-a8 is used, turn on
8615 // Cortex-A8 erratum workaround for ARMv7-A or ARMv7 with unknown
8616 // profile.
8617 const Object_attribute* cpu_arch_profile_attr =
8618 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch_profile);
8619 this->fix_cortex_a8_ =
8620 (cpu_arch_attr->int_value() == elfcpp::TAG_CPU_ARCH_V7
8621 && (cpu_arch_profile_attr->int_value() == 'A'
8622 || cpu_arch_profile_attr->int_value() == 0));
8623 }
8624
a2162063
ILT
8625 // Check if we can use V4BX interworking.
8626 // The V4BX interworking stub contains BX instruction,
8627 // which is not specified for some profiles.
9b2fd367
DK
8628 if (this->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING
8629 && !this->may_use_blx())
a2162063
ILT
8630 gold_error(_("unable to provide V4BX reloc interworking fix up; "
8631 "the target profile does not support BX instruction"));
8632
94cdfcff 8633 // Fill in some more dynamic tags.
ea715a34
ILT
8634 const Reloc_section* rel_plt = (this->plt_ == NULL
8635 ? NULL
8636 : this->plt_->rel_plt());
8637 layout->add_target_dynamic_tags(true, this->got_plt_, rel_plt,
612a8d3d 8638 this->rel_dyn_, true, false);
94cdfcff
DK
8639
8640 // Emit any relocs we saved in an attempt to avoid generating COPY
8641 // relocs.
8642 if (this->copy_relocs_.any_saved_relocs())
2ea97941 8643 this->copy_relocs_.emit(this->rel_dyn_section(layout));
11af873f 8644
f59f41f3 8645 // Handle the .ARM.exidx section.
2ea97941 8646 Output_section* exidx_section = layout->find_output_section(".ARM.exidx");
11af873f 8647
731ca54a
RÁE
8648 if (!parameters->options().relocatable())
8649 {
8650 if (exidx_section != NULL
8651 && exidx_section->type() == elfcpp::SHT_ARM_EXIDX)
8652 {
9b547ce6 8653 // Create __exidx_start and __exidx_end symbols.
731ca54a
RÁE
8654 symtab->define_in_output_data("__exidx_start", NULL,
8655 Symbol_table::PREDEFINED,
8656 exidx_section, 0, 0, elfcpp::STT_OBJECT,
8657 elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN,
8658 0, false, true);
8659 symtab->define_in_output_data("__exidx_end", NULL,
8660 Symbol_table::PREDEFINED,
8661 exidx_section, 0, 0, elfcpp::STT_OBJECT,
8662 elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN,
8663 0, true, true);
8664
8665 // For the ARM target, we need to add a PT_ARM_EXIDX segment for
8666 // the .ARM.exidx section.
8667 if (!layout->script_options()->saw_phdrs_clause())
8668 {
8669 gold_assert(layout->find_output_segment(elfcpp::PT_ARM_EXIDX, 0,
8670 0)
8671 == NULL);
8672 Output_segment* exidx_segment =
8673 layout->make_output_segment(elfcpp::PT_ARM_EXIDX, elfcpp::PF_R);
8674 exidx_segment->add_output_section_to_nonload(exidx_section,
8675 elfcpp::PF_R);
8676 }
8677 }
8678 else
8679 {
8680 symtab->define_as_constant("__exidx_start", NULL,
8681 Symbol_table::PREDEFINED,
8682 0, 0, elfcpp::STT_OBJECT,
8683 elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
8684 true, false);
8685 symtab->define_as_constant("__exidx_end", NULL,
8686 Symbol_table::PREDEFINED,
8687 0, 0, elfcpp::STT_OBJECT,
8688 elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
8689 true, false);
8690 }
11af873f 8691 }
a0351a69 8692
3e235302
DK
8693 // Create an .ARM.attributes section if we have merged any attributes
8694 // from inputs.
8695 if (merged_any_attributes)
7296d933
DK
8696 {
8697 Output_attributes_section_data* attributes_section =
8698 new Output_attributes_section_data(*this->attributes_section_data_);
8699 layout->add_output_section_data(".ARM.attributes",
8700 elfcpp::SHT_ARM_ATTRIBUTES, 0,
22f0da72 8701 attributes_section, ORDER_INVALID,
7296d933
DK
8702 false);
8703 }
131687b4
DK
8704
8705 // Fix up links in section EXIDX headers.
8706 for (Layout::Section_list::const_iterator p = layout->section_list().begin();
8707 p != layout->section_list().end();
8708 ++p)
8709 if ((*p)->type() == elfcpp::SHT_ARM_EXIDX)
8710 {
8711 Arm_output_section<big_endian>* os =
8712 Arm_output_section<big_endian>::as_arm_output_section(*p);
8713 os->set_exidx_section_link();
8714 }
4a657b0d
DK
8715}
8716
bec53400
DK
8717// Return whether a direct absolute static relocation needs to be applied.
8718// In cases where Scan::local() or Scan::global() has created
8719// a dynamic relocation other than R_ARM_RELATIVE, the addend
8720// of the relocation is carried in the data, and we must not
8721// apply the static relocation.
8722
8723template<bool big_endian>
8724inline bool
8725Target_arm<big_endian>::Relocate::should_apply_static_reloc(
8726 const Sized_symbol<32>* gsym,
95a2c8d6 8727 unsigned int r_type,
bec53400
DK
8728 bool is_32bit,
8729 Output_section* output_section)
8730{
8731 // If the output section is not allocated, then we didn't call
8732 // scan_relocs, we didn't create a dynamic reloc, and we must apply
8733 // the reloc here.
8734 if ((output_section->flags() & elfcpp::SHF_ALLOC) == 0)
8735 return true;
8736
95a2c8d6
RS
8737 int ref_flags = Scan::get_reference_flags(r_type);
8738
bec53400
DK
8739 // For local symbols, we will have created a non-RELATIVE dynamic
8740 // relocation only if (a) the output is position independent,
8741 // (b) the relocation is absolute (not pc- or segment-relative), and
8742 // (c) the relocation is not 32 bits wide.
8743 if (gsym == NULL)
8744 return !(parameters->options().output_is_position_independent()
8745 && (ref_flags & Symbol::ABSOLUTE_REF)
8746 && !is_32bit);
8747
8748 // For global symbols, we use the same helper routines used in the
8749 // scan pass. If we did not create a dynamic relocation, or if we
8750 // created a RELATIVE dynamic relocation, we should apply the static
8751 // relocation.
8752 bool has_dyn = gsym->needs_dynamic_reloc(ref_flags);
8753 bool is_rel = (ref_flags & Symbol::ABSOLUTE_REF)
8754 && gsym->can_use_relative_reloc(ref_flags
8755 & Symbol::FUNCTION_CALL);
8756 return !has_dyn || is_rel;
8757}
8758
4a657b0d
DK
8759// Perform a relocation.
8760
8761template<bool big_endian>
8762inline bool
8763Target_arm<big_endian>::Relocate::relocate(
c121c671
DK
8764 const Relocate_info<32, big_endian>* relinfo,
8765 Target_arm* target,
ca09d69a 8766 Output_section* output_section,
c121c671
DK
8767 size_t relnum,
8768 const elfcpp::Rel<32, big_endian>& rel,
4a657b0d 8769 unsigned int r_type,
c121c671
DK
8770 const Sized_symbol<32>* gsym,
8771 const Symbol_value<32>* psymval,
8772 unsigned char* view,
ebabffbd 8773 Arm_address address,
f96accdf 8774 section_size_type view_size)
4a657b0d 8775{
c121c671
DK
8776 typedef Arm_relocate_functions<big_endian> Arm_relocate_functions;
8777
a6d1ef57 8778 r_type = get_real_reloc_type(r_type);
5c57f1be
DK
8779 const Arm_reloc_property* reloc_property =
8780 arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
8781 if (reloc_property == NULL)
8782 {
8783 std::string reloc_name =
8784 arm_reloc_property_table->reloc_name_in_error_message(r_type);
8785 gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
8786 _("cannot relocate %s in object file"),
8787 reloc_name.c_str());
8788 return true;
8789 }
c121c671 8790
2daedcd6
DK
8791 const Arm_relobj<big_endian>* object =
8792 Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
c121c671 8793
2daedcd6
DK
8794 // If the final branch target of a relocation is THUMB instruction, this
8795 // is 1. Otherwise it is 0.
8796 Arm_address thumb_bit = 0;
c121c671 8797 Symbol_value<32> symval;
d204b6e9 8798 bool is_weakly_undefined_without_plt = false;
bca7fb63
DK
8799 bool have_got_offset = false;
8800 unsigned int got_offset = 0;
8801
8802 // If the relocation uses the GOT entry of a symbol instead of the symbol
8803 // itself, we don't care about whether the symbol is defined or what kind
8804 // of symbol it is.
8805 if (reloc_property->uses_got_entry())
8806 {
8807 // Get the GOT offset.
8808 // The GOT pointer points to the end of the GOT section.
8809 // We need to subtract the size of the GOT section to get
8810 // the actual offset to use in the relocation.
8811 // TODO: We should move GOT offset computing code in TLS relocations
8812 // to here.
8813 switch (r_type)
8814 {
8815 case elfcpp::R_ARM_GOT_BREL:
8816 case elfcpp::R_ARM_GOT_PREL:
8817 if (gsym != NULL)
8818 {
8819 gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD));
8820 got_offset = (gsym->got_offset(GOT_TYPE_STANDARD)
8821 - target->got_size());
8822 }
8823 else
8824 {
8825 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
8826 gold_assert(object->local_has_got_offset(r_sym,
8827 GOT_TYPE_STANDARD));
8828 got_offset = (object->local_got_offset(r_sym, GOT_TYPE_STANDARD)
8829 - target->got_size());
8830 }
8831 have_got_offset = true;
8832 break;
8833
8834 default:
8835 break;
8836 }
8837 }
8838 else if (relnum != Target_arm<big_endian>::fake_relnum_for_stubs)
c121c671 8839 {
2daedcd6
DK
8840 if (gsym != NULL)
8841 {
8842 // This is a global symbol. Determine if we use PLT and if the
8843 // final target is THUMB.
95a2c8d6 8844 if (gsym->use_plt_offset(Scan::get_reference_flags(r_type)))
2daedcd6
DK
8845 {
8846 // This uses a PLT, change the symbol value.
8847 symval.set_output_value(target->plt_section()->address()
8848 + gsym->plt_offset());
8849 psymval = &symval;
8850 }
d204b6e9
DK
8851 else if (gsym->is_weak_undefined())
8852 {
8853 // This is a weakly undefined symbol and we do not use PLT
8854 // for this relocation. A branch targeting this symbol will
8855 // be converted into an NOP.
8856 is_weakly_undefined_without_plt = true;
8857 }
b2286c10
DK
8858 else if (gsym->is_undefined() && reloc_property->uses_symbol())
8859 {
8860 // This relocation uses the symbol value but the symbol is
8861 // undefined. Exit early and have the caller reporting an
8862 // error.
8863 return true;
8864 }
2daedcd6
DK
8865 else
8866 {
8867 // Set thumb bit if symbol:
8868 // -Has type STT_ARM_TFUNC or
8869 // -Has type STT_FUNC, is defined and with LSB in value set.
8870 thumb_bit =
8871 (((gsym->type() == elfcpp::STT_ARM_TFUNC)
8872 || (gsym->type() == elfcpp::STT_FUNC
8873 && !gsym->is_undefined()
8874 && ((psymval->value(object, 0) & 1) != 0)))
8875 ? 1
8876 : 0);
8877 }
8878 }
8879 else
8880 {
8881 // This is a local symbol. Determine if the final target is THUMB.
8882 // We saved this information when all the local symbols were read.
8883 elfcpp::Elf_types<32>::Elf_WXword r_info = rel.get_r_info();
8884 unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
8885 thumb_bit = object->local_symbol_is_thumb_function(r_sym) ? 1 : 0;
8886 }
8887 }
8888 else
8889 {
8890 // This is a fake relocation synthesized for a stub. It does not have
8891 // a real symbol. We just look at the LSB of the symbol value to
8892 // determine if the target is THUMB or not.
8893 thumb_bit = ((psymval->value(object, 0) & 1) != 0);
c121c671
DK
8894 }
8895
2daedcd6
DK
8896 // Strip LSB if this points to a THUMB target.
8897 if (thumb_bit != 0
5c57f1be 8898 && reloc_property->uses_thumb_bit()
2daedcd6
DK
8899 && ((psymval->value(object, 0) & 1) != 0))
8900 {
8901 Arm_address stripped_value =
8902 psymval->value(object, 0) & ~static_cast<Arm_address>(1);
8903 symval.set_output_value(stripped_value);
8904 psymval = &symval;
8905 }
8906
d204b6e9
DK
8907 // To look up relocation stubs, we need to pass the symbol table index of
8908 // a local symbol.
8909 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
8910
b10d2873
ILT
8911 // Get the addressing origin of the output segment defining the
8912 // symbol gsym if needed (AAELF 4.6.1.2 Relocation types).
8913 Arm_address sym_origin = 0;
5c57f1be 8914 if (reloc_property->uses_symbol_base())
b10d2873
ILT
8915 {
8916 if (r_type == elfcpp::R_ARM_BASE_ABS && gsym == NULL)
8917 // R_ARM_BASE_ABS with the NULL symbol will give the
8918 // absolute address of the GOT origin (GOT_ORG) (see ARM IHI
8919 // 0044C (AAELF): 4.6.1.8 Proxy generating relocations).
8920 sym_origin = target->got_plt_section()->address();
8921 else if (gsym == NULL)
8922 sym_origin = 0;
8923 else if (gsym->source() == Symbol::IN_OUTPUT_SEGMENT)
8924 sym_origin = gsym->output_segment()->vaddr();
8925 else if (gsym->source() == Symbol::IN_OUTPUT_DATA)
8926 sym_origin = gsym->output_data()->address();
8927
8928 // TODO: Assumes the segment base to be zero for the global symbols
8929 // till the proper support for the segment-base-relative addressing
8930 // will be implemented. This is consistent with GNU ld.
8931 }
8932
5c57f1be
DK
8933 // For relative addressing relocation, find out the relative address base.
8934 Arm_address relative_address_base = 0;
8935 switch(reloc_property->relative_address_base())
8936 {
8937 case Arm_reloc_property::RAB_NONE:
f96accdf
DK
8938 // Relocations with relative address bases RAB_TLS and RAB_tp are
8939 // handled by relocate_tls. So we do not need to do anything here.
8940 case Arm_reloc_property::RAB_TLS:
8941 case Arm_reloc_property::RAB_tp:
5c57f1be
DK
8942 break;
8943 case Arm_reloc_property::RAB_B_S:
8944 relative_address_base = sym_origin;
8945 break;
8946 case Arm_reloc_property::RAB_GOT_ORG:
8947 relative_address_base = target->got_plt_section()->address();
8948 break;
8949 case Arm_reloc_property::RAB_P:
8950 relative_address_base = address;
8951 break;
8952 case Arm_reloc_property::RAB_Pa:
8953 relative_address_base = address & 0xfffffffcU;
8954 break;
8955 default:
8956 gold_unreachable();
8957 }
8958
c121c671
DK
8959 typename Arm_relocate_functions::Status reloc_status =
8960 Arm_relocate_functions::STATUS_OKAY;
5c57f1be 8961 bool check_overflow = reloc_property->checks_overflow();
4a657b0d
DK
8962 switch (r_type)
8963 {
8964 case elfcpp::R_ARM_NONE:
8965 break;
8966
5e445df6 8967 case elfcpp::R_ARM_ABS8:
95a2c8d6 8968 if (should_apply_static_reloc(gsym, r_type, false, output_section))
be8fcb75
ILT
8969 reloc_status = Arm_relocate_functions::abs8(view, object, psymval);
8970 break;
8971
8972 case elfcpp::R_ARM_ABS12:
95a2c8d6 8973 if (should_apply_static_reloc(gsym, r_type, false, output_section))
be8fcb75
ILT
8974 reloc_status = Arm_relocate_functions::abs12(view, object, psymval);
8975 break;
8976
8977 case elfcpp::R_ARM_ABS16:
95a2c8d6 8978 if (should_apply_static_reloc(gsym, r_type, false, output_section))
be8fcb75 8979 reloc_status = Arm_relocate_functions::abs16(view, object, psymval);
5e445df6
ILT
8980 break;
8981
c121c671 8982 case elfcpp::R_ARM_ABS32:
95a2c8d6 8983 if (should_apply_static_reloc(gsym, r_type, true, output_section))
c121c671 8984 reloc_status = Arm_relocate_functions::abs32(view, object, psymval,
2daedcd6 8985 thumb_bit);
c121c671
DK
8986 break;
8987
be8fcb75 8988 case elfcpp::R_ARM_ABS32_NOI:
95a2c8d6 8989 if (should_apply_static_reloc(gsym, r_type, true, output_section))
be8fcb75
ILT
8990 // No thumb bit for this relocation: (S + A)
8991 reloc_status = Arm_relocate_functions::abs32(view, object, psymval,
f4e5969c 8992 0);
be8fcb75
ILT
8993 break;
8994
fd3c5f0b 8995 case elfcpp::R_ARM_MOVW_ABS_NC:
95a2c8d6 8996 if (should_apply_static_reloc(gsym, r_type, false, output_section))
5c57f1be
DK
8997 reloc_status = Arm_relocate_functions::movw(view, object, psymval,
8998 0, thumb_bit,
8999 check_overflow);
fd3c5f0b
ILT
9000 break;
9001
9002 case elfcpp::R_ARM_MOVT_ABS:
95a2c8d6 9003 if (should_apply_static_reloc(gsym, r_type, false, output_section))
5c57f1be 9004 reloc_status = Arm_relocate_functions::movt(view, object, psymval, 0);
fd3c5f0b
ILT
9005 break;
9006
9007 case elfcpp::R_ARM_THM_MOVW_ABS_NC:
95a2c8d6 9008 if (should_apply_static_reloc(gsym, r_type, false, output_section))
5c57f1be
DK
9009 reloc_status = Arm_relocate_functions::thm_movw(view, object, psymval,
9010 0, thumb_bit, false);
fd3c5f0b
ILT
9011 break;
9012
9013 case elfcpp::R_ARM_THM_MOVT_ABS:
95a2c8d6 9014 if (should_apply_static_reloc(gsym, r_type, false, output_section))
5c57f1be
DK
9015 reloc_status = Arm_relocate_functions::thm_movt(view, object,
9016 psymval, 0);
fd3c5f0b
ILT
9017 break;
9018
c2a122b6 9019 case elfcpp::R_ARM_MOVW_PREL_NC:
02961d7e 9020 case elfcpp::R_ARM_MOVW_BREL_NC:
02961d7e 9021 case elfcpp::R_ARM_MOVW_BREL:
5c57f1be
DK
9022 reloc_status =
9023 Arm_relocate_functions::movw(view, object, psymval,
9024 relative_address_base, thumb_bit,
9025 check_overflow);
c2a122b6
ILT
9026 break;
9027
9028 case elfcpp::R_ARM_MOVT_PREL:
02961d7e 9029 case elfcpp::R_ARM_MOVT_BREL:
5c57f1be
DK
9030 reloc_status =
9031 Arm_relocate_functions::movt(view, object, psymval,
9032 relative_address_base);
c2a122b6
ILT
9033 break;
9034
9035 case elfcpp::R_ARM_THM_MOVW_PREL_NC:
02961d7e 9036 case elfcpp::R_ARM_THM_MOVW_BREL_NC:
02961d7e 9037 case elfcpp::R_ARM_THM_MOVW_BREL:
5c57f1be
DK
9038 reloc_status =
9039 Arm_relocate_functions::thm_movw(view, object, psymval,
9040 relative_address_base,
9041 thumb_bit, check_overflow);
c2a122b6
ILT
9042 break;
9043
9044 case elfcpp::R_ARM_THM_MOVT_PREL:
02961d7e 9045 case elfcpp::R_ARM_THM_MOVT_BREL:
5c57f1be
DK
9046 reloc_status =
9047 Arm_relocate_functions::thm_movt(view, object, psymval,
9048 relative_address_base);
02961d7e 9049 break;
5c57f1be 9050
c121c671
DK
9051 case elfcpp::R_ARM_REL32:
9052 reloc_status = Arm_relocate_functions::rel32(view, object, psymval,
2daedcd6 9053 address, thumb_bit);
c121c671
DK
9054 break;
9055
be8fcb75 9056 case elfcpp::R_ARM_THM_ABS5:
95a2c8d6 9057 if (should_apply_static_reloc(gsym, r_type, false, output_section))
be8fcb75
ILT
9058 reloc_status = Arm_relocate_functions::thm_abs5(view, object, psymval);
9059 break;
9060
1521477a 9061 // Thumb long branches.
c121c671 9062 case elfcpp::R_ARM_THM_CALL:
51938283 9063 case elfcpp::R_ARM_THM_XPC22:
1521477a 9064 case elfcpp::R_ARM_THM_JUMP24:
51938283 9065 reloc_status =
1521477a
DK
9066 Arm_relocate_functions::thumb_branch_common(
9067 r_type, relinfo, view, gsym, object, r_sym, psymval, address,
9068 thumb_bit, is_weakly_undefined_without_plt);
51938283
DK
9069 break;
9070
c121c671
DK
9071 case elfcpp::R_ARM_GOTOFF32:
9072 {
ebabffbd 9073 Arm_address got_origin;
c121c671
DK
9074 got_origin = target->got_plt_section()->address();
9075 reloc_status = Arm_relocate_functions::rel32(view, object, psymval,
2daedcd6 9076 got_origin, thumb_bit);
c121c671
DK
9077 }
9078 break;
9079
9080 case elfcpp::R_ARM_BASE_PREL:
b10d2873
ILT
9081 gold_assert(gsym != NULL);
9082 reloc_status =
9083 Arm_relocate_functions::base_prel(view, sym_origin, address);
c121c671
DK
9084 break;
9085
be8fcb75 9086 case elfcpp::R_ARM_BASE_ABS:
95a2c8d6 9087 if (should_apply_static_reloc(gsym, r_type, false, output_section))
b10d2873 9088 reloc_status = Arm_relocate_functions::base_abs(view, sym_origin);
be8fcb75
ILT
9089 break;
9090
c121c671
DK
9091 case elfcpp::R_ARM_GOT_BREL:
9092 gold_assert(have_got_offset);
9093 reloc_status = Arm_relocate_functions::got_brel(view, got_offset);
9094 break;
9095
7f5309a5
ILT
9096 case elfcpp::R_ARM_GOT_PREL:
9097 gold_assert(have_got_offset);
9098 // Get the address origin for GOT PLT, which is allocated right
9099 // after the GOT section, to calculate an absolute address of
9100 // the symbol GOT entry (got_origin + got_offset).
ebabffbd 9101 Arm_address got_origin;
7f5309a5
ILT
9102 got_origin = target->got_plt_section()->address();
9103 reloc_status = Arm_relocate_functions::got_prel(view,
9104 got_origin + got_offset,
9105 address);
9106 break;
9107
c121c671 9108 case elfcpp::R_ARM_PLT32:
1521477a
DK
9109 case elfcpp::R_ARM_CALL:
9110 case elfcpp::R_ARM_JUMP24:
9111 case elfcpp::R_ARM_XPC25:
c121c671
DK
9112 gold_assert(gsym == NULL
9113 || gsym->has_plt_offset()
9114 || gsym->final_value_is_known()
9115 || (gsym->is_defined()
9116 && !gsym->is_from_dynobj()
9117 && !gsym->is_preemptible()));
d204b6e9 9118 reloc_status =
1521477a
DK
9119 Arm_relocate_functions::arm_branch_common(
9120 r_type, relinfo, view, gsym, object, r_sym, psymval, address,
9121 thumb_bit, is_weakly_undefined_without_plt);
51938283
DK
9122 break;
9123
41263c05
DK
9124 case elfcpp::R_ARM_THM_JUMP19:
9125 reloc_status =
9126 Arm_relocate_functions::thm_jump19(view, object, psymval, address,
9127 thumb_bit);
9128 break;
9129
800d0f56
ILT
9130 case elfcpp::R_ARM_THM_JUMP6:
9131 reloc_status =
9132 Arm_relocate_functions::thm_jump6(view, object, psymval, address);
9133 break;
9134
9135 case elfcpp::R_ARM_THM_JUMP8:
9136 reloc_status =
9137 Arm_relocate_functions::thm_jump8(view, object, psymval, address);
9138 break;
9139
9140 case elfcpp::R_ARM_THM_JUMP11:
9141 reloc_status =
9142 Arm_relocate_functions::thm_jump11(view, object, psymval, address);
9143 break;
9144
c121c671
DK
9145 case elfcpp::R_ARM_PREL31:
9146 reloc_status = Arm_relocate_functions::prel31(view, object, psymval,
2daedcd6 9147 address, thumb_bit);
c121c671
DK
9148 break;
9149
a2162063 9150 case elfcpp::R_ARM_V4BX:
9b2fd367
DK
9151 if (target->fix_v4bx() > General_options::FIX_V4BX_NONE)
9152 {
9153 const bool is_v4bx_interworking =
9154 (target->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING);
9155 reloc_status =
9156 Arm_relocate_functions::v4bx(relinfo, view, object, address,
9157 is_v4bx_interworking);
9158 }
a2162063
ILT
9159 break;
9160
11b861d5
DK
9161 case elfcpp::R_ARM_THM_PC8:
9162 reloc_status =
9163 Arm_relocate_functions::thm_pc8(view, object, psymval, address);
9164 break;
9165
9166 case elfcpp::R_ARM_THM_PC12:
9167 reloc_status =
9168 Arm_relocate_functions::thm_pc12(view, object, psymval, address);
9169 break;
9170
9171 case elfcpp::R_ARM_THM_ALU_PREL_11_0:
9172 reloc_status =
9173 Arm_relocate_functions::thm_alu11(view, object, psymval, address,
9174 thumb_bit);
9175 break;
9176
b10d2873 9177 case elfcpp::R_ARM_ALU_PC_G0_NC:
b10d2873 9178 case elfcpp::R_ARM_ALU_PC_G0:
b10d2873 9179 case elfcpp::R_ARM_ALU_PC_G1_NC:
b10d2873 9180 case elfcpp::R_ARM_ALU_PC_G1:
b10d2873 9181 case elfcpp::R_ARM_ALU_PC_G2:
b10d2873 9182 case elfcpp::R_ARM_ALU_SB_G0_NC:
b10d2873 9183 case elfcpp::R_ARM_ALU_SB_G0:
b10d2873 9184 case elfcpp::R_ARM_ALU_SB_G1_NC:
b10d2873 9185 case elfcpp::R_ARM_ALU_SB_G1:
b10d2873
ILT
9186 case elfcpp::R_ARM_ALU_SB_G2:
9187 reloc_status =
5c57f1be
DK
9188 Arm_relocate_functions::arm_grp_alu(view, object, psymval,
9189 reloc_property->group_index(),
9190 relative_address_base,
9191 thumb_bit, check_overflow);
b10d2873
ILT
9192 break;
9193
9194 case elfcpp::R_ARM_LDR_PC_G0:
b10d2873 9195 case elfcpp::R_ARM_LDR_PC_G1:
b10d2873 9196 case elfcpp::R_ARM_LDR_PC_G2:
b10d2873 9197 case elfcpp::R_ARM_LDR_SB_G0:
b10d2873 9198 case elfcpp::R_ARM_LDR_SB_G1:
b10d2873
ILT
9199 case elfcpp::R_ARM_LDR_SB_G2:
9200 reloc_status =
5c57f1be
DK
9201 Arm_relocate_functions::arm_grp_ldr(view, object, psymval,
9202 reloc_property->group_index(),
9203 relative_address_base);
b10d2873
ILT
9204 break;
9205
9206 case elfcpp::R_ARM_LDRS_PC_G0:
b10d2873 9207 case elfcpp::R_ARM_LDRS_PC_G1:
b10d2873 9208 case elfcpp::R_ARM_LDRS_PC_G2:
b10d2873 9209 case elfcpp::R_ARM_LDRS_SB_G0:
b10d2873 9210 case elfcpp::R_ARM_LDRS_SB_G1:
b10d2873
ILT
9211 case elfcpp::R_ARM_LDRS_SB_G2:
9212 reloc_status =
5c57f1be
DK
9213 Arm_relocate_functions::arm_grp_ldrs(view, object, psymval,
9214 reloc_property->group_index(),
9215 relative_address_base);
b10d2873
ILT
9216 break;
9217
9218 case elfcpp::R_ARM_LDC_PC_G0:
b10d2873 9219 case elfcpp::R_ARM_LDC_PC_G1:
b10d2873 9220 case elfcpp::R_ARM_LDC_PC_G2:
b10d2873 9221 case elfcpp::R_ARM_LDC_SB_G0:
b10d2873 9222 case elfcpp::R_ARM_LDC_SB_G1:
b10d2873
ILT
9223 case elfcpp::R_ARM_LDC_SB_G2:
9224 reloc_status =
5c57f1be
DK
9225 Arm_relocate_functions::arm_grp_ldc(view, object, psymval,
9226 reloc_property->group_index(),
9227 relative_address_base);
c121c671
DK
9228 break;
9229
f96accdf
DK
9230 // These are initial tls relocs, which are expected when
9231 // linking.
9232 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
9233 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
9234 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
9235 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
9236 case elfcpp::R_ARM_TLS_LE32: // Local-exec
9237 reloc_status =
9238 this->relocate_tls(relinfo, target, relnum, rel, r_type, gsym, psymval,
9239 view, address, view_size);
9240 break;
9241
3cef7179
ILT
9242 // The known and unknown unsupported and/or deprecated relocations.
9243 case elfcpp::R_ARM_PC24:
9244 case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
9245 case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
9246 case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
c121c671 9247 default:
3cef7179
ILT
9248 // Just silently leave the method. We should get an appropriate error
9249 // message in the scan methods.
9250 break;
c121c671
DK
9251 }
9252
9253 // Report any errors.
9254 switch (reloc_status)
9255 {
9256 case Arm_relocate_functions::STATUS_OKAY:
9257 break;
9258 case Arm_relocate_functions::STATUS_OVERFLOW:
9259 gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
a2c7281b
DK
9260 _("relocation overflow in %s"),
9261 reloc_property->name().c_str());
c121c671
DK
9262 break;
9263 case Arm_relocate_functions::STATUS_BAD_RELOC:
9264 gold_error_at_location(
9265 relinfo,
9266 relnum,
9267 rel.get_r_offset(),
a2c7281b
DK
9268 _("unexpected opcode while processing relocation %s"),
9269 reloc_property->name().c_str());
c121c671 9270 break;
4a657b0d
DK
9271 default:
9272 gold_unreachable();
9273 }
9274
9275 return true;
9276}
9277
f96accdf
DK
9278// Perform a TLS relocation.
9279
9280template<bool big_endian>
9281inline typename Arm_relocate_functions<big_endian>::Status
9282Target_arm<big_endian>::Relocate::relocate_tls(
9283 const Relocate_info<32, big_endian>* relinfo,
9284 Target_arm<big_endian>* target,
9285 size_t relnum,
9286 const elfcpp::Rel<32, big_endian>& rel,
9287 unsigned int r_type,
9288 const Sized_symbol<32>* gsym,
9289 const Symbol_value<32>* psymval,
9290 unsigned char* view,
4a54abbb 9291 elfcpp::Elf_types<32>::Elf_Addr address,
f96accdf
DK
9292 section_size_type /*view_size*/ )
9293{
9294 typedef Arm_relocate_functions<big_endian> ArmRelocFuncs;
4a54abbb 9295 typedef Relocate_functions<32, big_endian> RelocFuncs;
f96accdf
DK
9296 Output_segment* tls_segment = relinfo->layout->tls_segment();
9297
9298 const Sized_relobj<32, big_endian>* object = relinfo->object;
9299
9300 elfcpp::Elf_types<32>::Elf_Addr value = psymval->value(object, 0);
9301
9302 const bool is_final = (gsym == NULL
9303 ? !parameters->options().shared()
9304 : gsym->final_value_is_known());
9305 const tls::Tls_optimization optimized_type
9306 = Target_arm<big_endian>::optimize_tls_reloc(is_final, r_type);
9307 switch (r_type)
9308 {
9309 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
9310 {
9311 unsigned int got_type = GOT_TYPE_TLS_PAIR;
9312 unsigned int got_offset;
9313 if (gsym != NULL)
9314 {
9315 gold_assert(gsym->has_got_offset(got_type));
9316 got_offset = gsym->got_offset(got_type) - target->got_size();
9317 }
9318 else
9319 {
9320 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
9321 gold_assert(object->local_has_got_offset(r_sym, got_type));
9322 got_offset = (object->local_got_offset(r_sym, got_type)
9323 - target->got_size());
9324 }
9325 if (optimized_type == tls::TLSOPT_NONE)
9326 {
4a54abbb
DK
9327 Arm_address got_entry =
9328 target->got_plt_section()->address() + got_offset;
9329
9330 // Relocate the field with the PC relative offset of the pair of
9331 // GOT entries.
9332 RelocFuncs::pcrel32(view, got_entry, address);
f96accdf
DK
9333 return ArmRelocFuncs::STATUS_OKAY;
9334 }
9335 }
9336 break;
9337
9338 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
9339 if (optimized_type == tls::TLSOPT_NONE)
9340 {
9341 // Relocate the field with the offset of the GOT entry for
9342 // the module index.
9343 unsigned int got_offset;
9344 got_offset = (target->got_mod_index_entry(NULL, NULL, NULL)
9345 - target->got_size());
4a54abbb
DK
9346 Arm_address got_entry =
9347 target->got_plt_section()->address() + got_offset;
9348
9349 // Relocate the field with the PC relative offset of the pair of
9350 // GOT entries.
9351 RelocFuncs::pcrel32(view, got_entry, address);
f96accdf
DK
9352 return ArmRelocFuncs::STATUS_OKAY;
9353 }
9354 break;
9355
9356 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
4a54abbb 9357 RelocFuncs::rel32(view, value);
f96accdf
DK
9358 return ArmRelocFuncs::STATUS_OKAY;
9359
9360 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
9361 if (optimized_type == tls::TLSOPT_NONE)
9362 {
9363 // Relocate the field with the offset of the GOT entry for
9364 // the tp-relative offset of the symbol.
9365 unsigned int got_type = GOT_TYPE_TLS_OFFSET;
9366 unsigned int got_offset;
9367 if (gsym != NULL)
9368 {
9369 gold_assert(gsym->has_got_offset(got_type));
9370 got_offset = gsym->got_offset(got_type);
9371 }
9372 else
9373 {
9374 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
9375 gold_assert(object->local_has_got_offset(r_sym, got_type));
9376 got_offset = object->local_got_offset(r_sym, got_type);
9377 }
4a54abbb 9378
f96accdf
DK
9379 // All GOT offsets are relative to the end of the GOT.
9380 got_offset -= target->got_size();
4a54abbb
DK
9381
9382 Arm_address got_entry =
9383 target->got_plt_section()->address() + got_offset;
9384
9385 // Relocate the field with the PC relative offset of the GOT entry.
9386 RelocFuncs::pcrel32(view, got_entry, address);
f96accdf
DK
9387 return ArmRelocFuncs::STATUS_OKAY;
9388 }
9389 break;
9390
9391 case elfcpp::R_ARM_TLS_LE32: // Local-exec
9392 // If we're creating a shared library, a dynamic relocation will
9393 // have been created for this location, so do not apply it now.
9394 if (!parameters->options().shared())
9395 {
9396 gold_assert(tls_segment != NULL);
4a54abbb
DK
9397
9398 // $tp points to the TCB, which is followed by the TLS, so we
9399 // need to add TCB size to the offset.
9400 Arm_address aligned_tcb_size =
9401 align_address(ARM_TCB_SIZE, tls_segment->maximum_alignment());
9402 RelocFuncs::rel32(view, value + aligned_tcb_size);
9403
f96accdf
DK
9404 }
9405 return ArmRelocFuncs::STATUS_OKAY;
9406
9407 default:
9408 gold_unreachable();
9409 }
9410
9411 gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
9412 _("unsupported reloc %u"),
9413 r_type);
9414 return ArmRelocFuncs::STATUS_BAD_RELOC;
9415}
9416
4a657b0d
DK
9417// Relocate section data.
9418
9419template<bool big_endian>
9420void
9421Target_arm<big_endian>::relocate_section(
9422 const Relocate_info<32, big_endian>* relinfo,
9423 unsigned int sh_type,
9424 const unsigned char* prelocs,
9425 size_t reloc_count,
9426 Output_section* output_section,
9427 bool needs_special_offset_handling,
9428 unsigned char* view,
ebabffbd 9429 Arm_address address,
364c7fa5
ILT
9430 section_size_type view_size,
9431 const Reloc_symbol_changes* reloc_symbol_changes)
4a657b0d
DK
9432{
9433 typedef typename Target_arm<big_endian>::Relocate Arm_relocate;
9434 gold_assert(sh_type == elfcpp::SHT_REL);
9435
218c5831
DK
9436 // See if we are relocating a relaxed input section. If so, the view
9437 // covers the whole output section and we need to adjust accordingly.
9438 if (needs_special_offset_handling)
43d12afe 9439 {
218c5831
DK
9440 const Output_relaxed_input_section* poris =
9441 output_section->find_relaxed_input_section(relinfo->object,
9442 relinfo->data_shndx);
9443 if (poris != NULL)
9444 {
9445 Arm_address section_address = poris->address();
9446 section_size_type section_size = poris->data_size();
9447
9448 gold_assert((section_address >= address)
9449 && ((section_address + section_size)
9450 <= (address + view_size)));
9451
9452 off_t offset = section_address - address;
9453 view += offset;
9454 address += offset;
9455 view_size = section_size;
9456 }
43d12afe
DK
9457 }
9458
4a657b0d
DK
9459 gold::relocate_section<32, big_endian, Target_arm, elfcpp::SHT_REL,
9460 Arm_relocate>(
9461 relinfo,
9462 this,
9463 prelocs,
9464 reloc_count,
9465 output_section,
9466 needs_special_offset_handling,
9467 view,
9468 address,
364c7fa5
ILT
9469 view_size,
9470 reloc_symbol_changes);
4a657b0d
DK
9471}
9472
9473// Return the size of a relocation while scanning during a relocatable
9474// link.
9475
9476template<bool big_endian>
9477unsigned int
9478Target_arm<big_endian>::Relocatable_size_for_reloc::get_size_for_reloc(
9479 unsigned int r_type,
9480 Relobj* object)
9481{
a6d1ef57 9482 r_type = get_real_reloc_type(r_type);
5c57f1be
DK
9483 const Arm_reloc_property* arp =
9484 arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
9485 if (arp != NULL)
9486 return arp->size();
9487 else
4a657b0d 9488 {
5c57f1be
DK
9489 std::string reloc_name =
9490 arm_reloc_property_table->reloc_name_in_error_message(r_type);
9491 gold_error(_("%s: unexpected %s in object file"),
9492 object->name().c_str(), reloc_name.c_str());
4a657b0d
DK
9493 return 0;
9494 }
9495}
9496
9497// Scan the relocs during a relocatable link.
9498
9499template<bool big_endian>
9500void
9501Target_arm<big_endian>::scan_relocatable_relocs(
4a657b0d 9502 Symbol_table* symtab,
2ea97941 9503 Layout* layout,
4a657b0d
DK
9504 Sized_relobj<32, big_endian>* object,
9505 unsigned int data_shndx,
9506 unsigned int sh_type,
9507 const unsigned char* prelocs,
9508 size_t reloc_count,
9509 Output_section* output_section,
9510 bool needs_special_offset_handling,
9511 size_t local_symbol_count,
9512 const unsigned char* plocal_symbols,
9513 Relocatable_relocs* rr)
9514{
9515 gold_assert(sh_type == elfcpp::SHT_REL);
9516
5c388529 9517 typedef Arm_scan_relocatable_relocs<big_endian, elfcpp::SHT_REL,
4a657b0d
DK
9518 Relocatable_size_for_reloc> Scan_relocatable_relocs;
9519
9520 gold::scan_relocatable_relocs<32, big_endian, elfcpp::SHT_REL,
9521 Scan_relocatable_relocs>(
4a657b0d 9522 symtab,
2ea97941 9523 layout,
4a657b0d
DK
9524 object,
9525 data_shndx,
9526 prelocs,
9527 reloc_count,
9528 output_section,
9529 needs_special_offset_handling,
9530 local_symbol_count,
9531 plocal_symbols,
9532 rr);
9533}
9534
9535// Relocate a section during a relocatable link.
9536
9537template<bool big_endian>
9538void
9539Target_arm<big_endian>::relocate_for_relocatable(
9540 const Relocate_info<32, big_endian>* relinfo,
9541 unsigned int sh_type,
9542 const unsigned char* prelocs,
9543 size_t reloc_count,
9544 Output_section* output_section,
9545 off_t offset_in_output_section,
9546 const Relocatable_relocs* rr,
9547 unsigned char* view,
ebabffbd 9548 Arm_address view_address,
4a657b0d
DK
9549 section_size_type view_size,
9550 unsigned char* reloc_view,
9551 section_size_type reloc_view_size)
9552{
9553 gold_assert(sh_type == elfcpp::SHT_REL);
9554
9555 gold::relocate_for_relocatable<32, big_endian, elfcpp::SHT_REL>(
9556 relinfo,
9557 prelocs,
9558 reloc_count,
9559 output_section,
9560 offset_in_output_section,
9561 rr,
9562 view,
9563 view_address,
9564 view_size,
9565 reloc_view,
9566 reloc_view_size);
9567}
9568
5c388529
DK
9569// Perform target-specific processing in a relocatable link. This is
9570// only used if we use the relocation strategy RELOC_SPECIAL.
9571
9572template<bool big_endian>
9573void
9574Target_arm<big_endian>::relocate_special_relocatable(
9575 const Relocate_info<32, big_endian>* relinfo,
9576 unsigned int sh_type,
9577 const unsigned char* preloc_in,
9578 size_t relnum,
9579 Output_section* output_section,
9580 off_t offset_in_output_section,
9581 unsigned char* view,
9582 elfcpp::Elf_types<32>::Elf_Addr view_address,
9583 section_size_type,
9584 unsigned char* preloc_out)
9585{
9586 // We can only handle REL type relocation sections.
9587 gold_assert(sh_type == elfcpp::SHT_REL);
9588
9589 typedef typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc Reltype;
9590 typedef typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc_write
9591 Reltype_write;
9592 const Arm_address invalid_address = static_cast<Arm_address>(0) - 1;
9593
9594 const Arm_relobj<big_endian>* object =
9595 Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
9596 const unsigned int local_count = object->local_symbol_count();
9597
9598 Reltype reloc(preloc_in);
9599 Reltype_write reloc_write(preloc_out);
9600
9601 elfcpp::Elf_types<32>::Elf_WXword r_info = reloc.get_r_info();
9602 const unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
9603 const unsigned int r_type = elfcpp::elf_r_type<32>(r_info);
9604
9605 const Arm_reloc_property* arp =
9606 arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
9607 gold_assert(arp != NULL);
9608
9609 // Get the new symbol index.
9610 // We only use RELOC_SPECIAL strategy in local relocations.
9611 gold_assert(r_sym < local_count);
9612
9613 // We are adjusting a section symbol. We need to find
9614 // the symbol table index of the section symbol for
9615 // the output section corresponding to input section
9616 // in which this symbol is defined.
9617 bool is_ordinary;
9618 unsigned int shndx = object->local_symbol_input_shndx(r_sym, &is_ordinary);
9619 gold_assert(is_ordinary);
9620 Output_section* os = object->output_section(shndx);
9621 gold_assert(os != NULL);
9622 gold_assert(os->needs_symtab_index());
9623 unsigned int new_symndx = os->symtab_index();
9624
9625 // Get the new offset--the location in the output section where
9626 // this relocation should be applied.
9627
9628 Arm_address offset = reloc.get_r_offset();
9629 Arm_address new_offset;
9630 if (offset_in_output_section != invalid_address)
9631 new_offset = offset + offset_in_output_section;
9632 else
9633 {
9634 section_offset_type sot_offset =
9635 convert_types<section_offset_type, Arm_address>(offset);
9636 section_offset_type new_sot_offset =
9637 output_section->output_offset(object, relinfo->data_shndx,
9638 sot_offset);
9639 gold_assert(new_sot_offset != -1);
9640 new_offset = new_sot_offset;
9641 }
9642
9643 // In an object file, r_offset is an offset within the section.
9644 // In an executable or dynamic object, generated by
9645 // --emit-relocs, r_offset is an absolute address.
9646 if (!parameters->options().relocatable())
9647 {
9648 new_offset += view_address;
9649 if (offset_in_output_section != invalid_address)
9650 new_offset -= offset_in_output_section;
9651 }
9652
9653 reloc_write.put_r_offset(new_offset);
9654 reloc_write.put_r_info(elfcpp::elf_r_info<32>(new_symndx, r_type));
9655
9656 // Handle the reloc addend.
9657 // The relocation uses a section symbol in the input file.
9658 // We are adjusting it to use a section symbol in the output
9659 // file. The input section symbol refers to some address in
9660 // the input section. We need the relocation in the output
9661 // file to refer to that same address. This adjustment to
9662 // the addend is the same calculation we use for a simple
9663 // absolute relocation for the input section symbol.
9664
9665 const Symbol_value<32>* psymval = object->local_symbol(r_sym);
9666
9667 // Handle THUMB bit.
9668 Symbol_value<32> symval;
9669 Arm_address thumb_bit =
9670 object->local_symbol_is_thumb_function(r_sym) ? 1 : 0;
9671 if (thumb_bit != 0
9672 && arp->uses_thumb_bit()
9673 && ((psymval->value(object, 0) & 1) != 0))
9674 {
9675 Arm_address stripped_value =
9676 psymval->value(object, 0) & ~static_cast<Arm_address>(1);
9677 symval.set_output_value(stripped_value);
9678 psymval = &symval;
9679 }
9680
9681 unsigned char* paddend = view + offset;
9682 typename Arm_relocate_functions<big_endian>::Status reloc_status =
9683 Arm_relocate_functions<big_endian>::STATUS_OKAY;
9684 switch (r_type)
9685 {
9686 case elfcpp::R_ARM_ABS8:
9687 reloc_status = Arm_relocate_functions<big_endian>::abs8(paddend, object,
9688 psymval);
9689 break;
9690
9691 case elfcpp::R_ARM_ABS12:
9692 reloc_status = Arm_relocate_functions<big_endian>::abs12(paddend, object,
9693 psymval);
9694 break;
9695
9696 case elfcpp::R_ARM_ABS16:
9697 reloc_status = Arm_relocate_functions<big_endian>::abs16(paddend, object,
9698 psymval);
9699 break;
9700
9701 case elfcpp::R_ARM_THM_ABS5:
9702 reloc_status = Arm_relocate_functions<big_endian>::thm_abs5(paddend,
9703 object,
9704 psymval);
9705 break;
9706
9707 case elfcpp::R_ARM_MOVW_ABS_NC:
9708 case elfcpp::R_ARM_MOVW_PREL_NC:
9709 case elfcpp::R_ARM_MOVW_BREL_NC:
9710 case elfcpp::R_ARM_MOVW_BREL:
9711 reloc_status = Arm_relocate_functions<big_endian>::movw(
9712 paddend, object, psymval, 0, thumb_bit, arp->checks_overflow());
9713 break;
9714
9715 case elfcpp::R_ARM_THM_MOVW_ABS_NC:
9716 case elfcpp::R_ARM_THM_MOVW_PREL_NC:
9717 case elfcpp::R_ARM_THM_MOVW_BREL_NC:
9718 case elfcpp::R_ARM_THM_MOVW_BREL:
9719 reloc_status = Arm_relocate_functions<big_endian>::thm_movw(
9720 paddend, object, psymval, 0, thumb_bit, arp->checks_overflow());
9721 break;
9722
9723 case elfcpp::R_ARM_THM_CALL:
9724 case elfcpp::R_ARM_THM_XPC22:
9725 case elfcpp::R_ARM_THM_JUMP24:
9726 reloc_status =
9727 Arm_relocate_functions<big_endian>::thumb_branch_common(
9728 r_type, relinfo, paddend, NULL, object, 0, psymval, 0, thumb_bit,
9729 false);
9730 break;
9731
9732 case elfcpp::R_ARM_PLT32:
9733 case elfcpp::R_ARM_CALL:
9734 case elfcpp::R_ARM_JUMP24:
9735 case elfcpp::R_ARM_XPC25:
9736 reloc_status =
9737 Arm_relocate_functions<big_endian>::arm_branch_common(
9738 r_type, relinfo, paddend, NULL, object, 0, psymval, 0, thumb_bit,
9739 false);
9740 break;
9741
9742 case elfcpp::R_ARM_THM_JUMP19:
9743 reloc_status =
9744 Arm_relocate_functions<big_endian>::thm_jump19(paddend, object,
9745 psymval, 0, thumb_bit);
9746 break;
9747
9748 case elfcpp::R_ARM_THM_JUMP6:
9749 reloc_status =
9750 Arm_relocate_functions<big_endian>::thm_jump6(paddend, object, psymval,
9751 0);
9752 break;
9753
9754 case elfcpp::R_ARM_THM_JUMP8:
9755 reloc_status =
9756 Arm_relocate_functions<big_endian>::thm_jump8(paddend, object, psymval,
9757 0);
9758 break;
9759
9760 case elfcpp::R_ARM_THM_JUMP11:
9761 reloc_status =
9762 Arm_relocate_functions<big_endian>::thm_jump11(paddend, object, psymval,
9763 0);
9764 break;
9765
9766 case elfcpp::R_ARM_PREL31:
9767 reloc_status =
9768 Arm_relocate_functions<big_endian>::prel31(paddend, object, psymval, 0,
9769 thumb_bit);
9770 break;
9771
9772 case elfcpp::R_ARM_THM_PC8:
9773 reloc_status =
9774 Arm_relocate_functions<big_endian>::thm_pc8(paddend, object, psymval,
9775 0);
9776 break;
9777
9778 case elfcpp::R_ARM_THM_PC12:
9779 reloc_status =
9780 Arm_relocate_functions<big_endian>::thm_pc12(paddend, object, psymval,
9781 0);
9782 break;
9783
9784 case elfcpp::R_ARM_THM_ALU_PREL_11_0:
9785 reloc_status =
9786 Arm_relocate_functions<big_endian>::thm_alu11(paddend, object, psymval,
9787 0, thumb_bit);
9788 break;
9789
9790 // These relocation truncate relocation results so we cannot handle them
9791 // in a relocatable link.
9792 case elfcpp::R_ARM_MOVT_ABS:
9793 case elfcpp::R_ARM_THM_MOVT_ABS:
9794 case elfcpp::R_ARM_MOVT_PREL:
9795 case elfcpp::R_ARM_MOVT_BREL:
9796 case elfcpp::R_ARM_THM_MOVT_PREL:
9797 case elfcpp::R_ARM_THM_MOVT_BREL:
9798 case elfcpp::R_ARM_ALU_PC_G0_NC:
9799 case elfcpp::R_ARM_ALU_PC_G0:
9800 case elfcpp::R_ARM_ALU_PC_G1_NC:
9801 case elfcpp::R_ARM_ALU_PC_G1:
9802 case elfcpp::R_ARM_ALU_PC_G2:
9803 case elfcpp::R_ARM_ALU_SB_G0_NC:
9804 case elfcpp::R_ARM_ALU_SB_G0:
9805 case elfcpp::R_ARM_ALU_SB_G1_NC:
9806 case elfcpp::R_ARM_ALU_SB_G1:
9807 case elfcpp::R_ARM_ALU_SB_G2:
9808 case elfcpp::R_ARM_LDR_PC_G0:
9809 case elfcpp::R_ARM_LDR_PC_G1:
9810 case elfcpp::R_ARM_LDR_PC_G2:
9811 case elfcpp::R_ARM_LDR_SB_G0:
9812 case elfcpp::R_ARM_LDR_SB_G1:
9813 case elfcpp::R_ARM_LDR_SB_G2:
9814 case elfcpp::R_ARM_LDRS_PC_G0:
9815 case elfcpp::R_ARM_LDRS_PC_G1:
9816 case elfcpp::R_ARM_LDRS_PC_G2:
9817 case elfcpp::R_ARM_LDRS_SB_G0:
9818 case elfcpp::R_ARM_LDRS_SB_G1:
9819 case elfcpp::R_ARM_LDRS_SB_G2:
9820 case elfcpp::R_ARM_LDC_PC_G0:
9821 case elfcpp::R_ARM_LDC_PC_G1:
9822 case elfcpp::R_ARM_LDC_PC_G2:
9823 case elfcpp::R_ARM_LDC_SB_G0:
9824 case elfcpp::R_ARM_LDC_SB_G1:
9825 case elfcpp::R_ARM_LDC_SB_G2:
9826 gold_error(_("cannot handle %s in a relocatable link"),
9827 arp->name().c_str());
9828 break;
9829
9830 default:
9831 gold_unreachable();
9832 }
9833
9834 // Report any errors.
9835 switch (reloc_status)
9836 {
9837 case Arm_relocate_functions<big_endian>::STATUS_OKAY:
9838 break;
9839 case Arm_relocate_functions<big_endian>::STATUS_OVERFLOW:
9840 gold_error_at_location(relinfo, relnum, reloc.get_r_offset(),
9841 _("relocation overflow in %s"),
9842 arp->name().c_str());
9843 break;
9844 case Arm_relocate_functions<big_endian>::STATUS_BAD_RELOC:
9845 gold_error_at_location(relinfo, relnum, reloc.get_r_offset(),
9846 _("unexpected opcode while processing relocation %s"),
9847 arp->name().c_str());
9848 break;
9849 default:
9850 gold_unreachable();
9851 }
9852}
9853
94cdfcff
DK
9854// Return the value to use for a dynamic symbol which requires special
9855// treatment. This is how we support equality comparisons of function
9856// pointers across shared library boundaries, as described in the
9857// processor specific ABI supplement.
9858
4a657b0d
DK
9859template<bool big_endian>
9860uint64_t
94cdfcff 9861Target_arm<big_endian>::do_dynsym_value(const Symbol* gsym) const
4a657b0d 9862{
94cdfcff
DK
9863 gold_assert(gsym->is_from_dynobj() && gsym->has_plt_offset());
9864 return this->plt_section()->address() + gsym->plt_offset();
4a657b0d
DK
9865}
9866
9867// Map platform-specific relocs to real relocs
9868//
9869template<bool big_endian>
9870unsigned int
ca09d69a 9871Target_arm<big_endian>::get_real_reloc_type(unsigned int r_type)
4a657b0d
DK
9872{
9873 switch (r_type)
9874 {
9875 case elfcpp::R_ARM_TARGET1:
a6d1ef57
DK
9876 // This is either R_ARM_ABS32 or R_ARM_REL32;
9877 return elfcpp::R_ARM_ABS32;
4a657b0d
DK
9878
9879 case elfcpp::R_ARM_TARGET2:
9b547ce6 9880 // This can be any reloc type but usually is R_ARM_GOT_PREL
a6d1ef57 9881 return elfcpp::R_ARM_GOT_PREL;
4a657b0d
DK
9882
9883 default:
9884 return r_type;
9885 }
9886}
9887
d5b40221
DK
9888// Whether if two EABI versions V1 and V2 are compatible.
9889
9890template<bool big_endian>
9891bool
9892Target_arm<big_endian>::are_eabi_versions_compatible(
9893 elfcpp::Elf_Word v1,
9894 elfcpp::Elf_Word v2)
9895{
9896 // v4 and v5 are the same spec before and after it was released,
9897 // so allow mixing them.
106e8a6c
DK
9898 if ((v1 == elfcpp::EF_ARM_EABI_UNKNOWN || v2 == elfcpp::EF_ARM_EABI_UNKNOWN)
9899 || (v1 == elfcpp::EF_ARM_EABI_VER4 && v2 == elfcpp::EF_ARM_EABI_VER5)
d5b40221
DK
9900 || (v1 == elfcpp::EF_ARM_EABI_VER5 && v2 == elfcpp::EF_ARM_EABI_VER4))
9901 return true;
9902
9903 return v1 == v2;
9904}
9905
9906// Combine FLAGS from an input object called NAME and the processor-specific
9907// flags in the ELF header of the output. Much of this is adapted from the
9908// processor-specific flags merging code in elf32_arm_merge_private_bfd_data
9909// in bfd/elf32-arm.c.
9910
9911template<bool big_endian>
9912void
9913Target_arm<big_endian>::merge_processor_specific_flags(
9914 const std::string& name,
9915 elfcpp::Elf_Word flags)
9916{
9917 if (this->are_processor_specific_flags_set())
9918 {
9919 elfcpp::Elf_Word out_flags = this->processor_specific_flags();
9920
9921 // Nothing to merge if flags equal to those in output.
9922 if (flags == out_flags)
9923 return;
9924
9925 // Complain about various flag mismatches.
9926 elfcpp::Elf_Word version1 = elfcpp::arm_eabi_version(flags);
9927 elfcpp::Elf_Word version2 = elfcpp::arm_eabi_version(out_flags);
7296d933
DK
9928 if (!this->are_eabi_versions_compatible(version1, version2)
9929 && parameters->options().warn_mismatch())
d5b40221
DK
9930 gold_error(_("Source object %s has EABI version %d but output has "
9931 "EABI version %d."),
9932 name.c_str(),
9933 (flags & elfcpp::EF_ARM_EABIMASK) >> 24,
9934 (out_flags & elfcpp::EF_ARM_EABIMASK) >> 24);
9935 }
9936 else
9937 {
9938 // If the input is the default architecture and had the default
9939 // flags then do not bother setting the flags for the output
9940 // architecture, instead allow future merges to do this. If no
9941 // future merges ever set these flags then they will retain their
9942 // uninitialised values, which surprise surprise, correspond
9943 // to the default values.
9944 if (flags == 0)
9945 return;
9946
9947 // This is the first time, just copy the flags.
9948 // We only copy the EABI version for now.
9949 this->set_processor_specific_flags(flags & elfcpp::EF_ARM_EABIMASK);
9950 }
9951}
9952
9953// Adjust ELF file header.
9954template<bool big_endian>
9955void
9956Target_arm<big_endian>::do_adjust_elf_header(
9957 unsigned char* view,
9958 int len) const
9959{
9960 gold_assert(len == elfcpp::Elf_sizes<32>::ehdr_size);
9961
9962 elfcpp::Ehdr<32, big_endian> ehdr(view);
9963 unsigned char e_ident[elfcpp::EI_NIDENT];
9964 memcpy(e_ident, ehdr.get_e_ident(), elfcpp::EI_NIDENT);
9965
9966 if (elfcpp::arm_eabi_version(this->processor_specific_flags())
9967 == elfcpp::EF_ARM_EABI_UNKNOWN)
9968 e_ident[elfcpp::EI_OSABI] = elfcpp::ELFOSABI_ARM;
9969 else
9970 e_ident[elfcpp::EI_OSABI] = 0;
9971 e_ident[elfcpp::EI_ABIVERSION] = 0;
9972
9973 // FIXME: Do EF_ARM_BE8 adjustment.
9974
9975 elfcpp::Ehdr_write<32, big_endian> oehdr(view);
9976 oehdr.put_e_ident(e_ident);
9977}
9978
9979// do_make_elf_object to override the same function in the base class.
9980// We need to use a target-specific sub-class of Sized_relobj<32, big_endian>
9981// to store ARM specific information. Hence we need to have our own
9982// ELF object creation.
9983
9984template<bool big_endian>
9985Object*
9986Target_arm<big_endian>::do_make_elf_object(
9987 const std::string& name,
9988 Input_file* input_file,
2ea97941 9989 off_t offset, const elfcpp::Ehdr<32, big_endian>& ehdr)
d5b40221
DK
9990{
9991 int et = ehdr.get_e_type();
9992 if (et == elfcpp::ET_REL)
9993 {
9994 Arm_relobj<big_endian>* obj =
2ea97941 9995 new Arm_relobj<big_endian>(name, input_file, offset, ehdr);
d5b40221
DK
9996 obj->setup();
9997 return obj;
9998 }
9999 else if (et == elfcpp::ET_DYN)
10000 {
10001 Sized_dynobj<32, big_endian>* obj =
2ea97941 10002 new Arm_dynobj<big_endian>(name, input_file, offset, ehdr);
d5b40221
DK
10003 obj->setup();
10004 return obj;
10005 }
10006 else
10007 {
10008 gold_error(_("%s: unsupported ELF file type %d"),
10009 name.c_str(), et);
10010 return NULL;
10011 }
10012}
10013
a0351a69
DK
10014// Read the architecture from the Tag_also_compatible_with attribute, if any.
10015// Returns -1 if no architecture could be read.
10016// This is adapted from get_secondary_compatible_arch() in bfd/elf32-arm.c.
10017
10018template<bool big_endian>
10019int
10020Target_arm<big_endian>::get_secondary_compatible_arch(
10021 const Attributes_section_data* pasd)
10022{
ca09d69a 10023 const Object_attribute* known_attributes =
a0351a69
DK
10024 pasd->known_attributes(Object_attribute::OBJ_ATTR_PROC);
10025
10026 // Note: the tag and its argument below are uleb128 values, though
10027 // currently-defined values fit in one byte for each.
10028 const std::string& sv =
10029 known_attributes[elfcpp::Tag_also_compatible_with].string_value();
10030 if (sv.size() == 2
10031 && sv.data()[0] == elfcpp::Tag_CPU_arch
10032 && (sv.data()[1] & 128) != 128)
10033 return sv.data()[1];
10034
10035 // This tag is "safely ignorable", so don't complain if it looks funny.
10036 return -1;
10037}
10038
10039// Set, or unset, the architecture of the Tag_also_compatible_with attribute.
10040// The tag is removed if ARCH is -1.
10041// This is adapted from set_secondary_compatible_arch() in bfd/elf32-arm.c.
10042
10043template<bool big_endian>
10044void
10045Target_arm<big_endian>::set_secondary_compatible_arch(
10046 Attributes_section_data* pasd,
10047 int arch)
10048{
ca09d69a 10049 Object_attribute* known_attributes =
a0351a69
DK
10050 pasd->known_attributes(Object_attribute::OBJ_ATTR_PROC);
10051
10052 if (arch == -1)
10053 {
10054 known_attributes[elfcpp::Tag_also_compatible_with].set_string_value("");
10055 return;
10056 }
10057
10058 // Note: the tag and its argument below are uleb128 values, though
10059 // currently-defined values fit in one byte for each.
10060 char sv[3];
10061 sv[0] = elfcpp::Tag_CPU_arch;
10062 gold_assert(arch != 0);
10063 sv[1] = arch;
10064 sv[2] = '\0';
10065
10066 known_attributes[elfcpp::Tag_also_compatible_with].set_string_value(sv);
10067}
10068
10069// Combine two values for Tag_CPU_arch, taking secondary compatibility tags
10070// into account.
10071// This is adapted from tag_cpu_arch_combine() in bfd/elf32-arm.c.
10072
10073template<bool big_endian>
10074int
10075Target_arm<big_endian>::tag_cpu_arch_combine(
10076 const char* name,
10077 int oldtag,
10078 int* secondary_compat_out,
10079 int newtag,
10080 int secondary_compat)
10081{
10082#define T(X) elfcpp::TAG_CPU_ARCH_##X
10083 static const int v6t2[] =
10084 {
10085 T(V6T2), // PRE_V4.
10086 T(V6T2), // V4.
10087 T(V6T2), // V4T.
10088 T(V6T2), // V5T.
10089 T(V6T2), // V5TE.
10090 T(V6T2), // V5TEJ.
10091 T(V6T2), // V6.
10092 T(V7), // V6KZ.
10093 T(V6T2) // V6T2.
10094 };
10095 static const int v6k[] =
10096 {
10097 T(V6K), // PRE_V4.
10098 T(V6K), // V4.
10099 T(V6K), // V4T.
10100 T(V6K), // V5T.
10101 T(V6K), // V5TE.
10102 T(V6K), // V5TEJ.
10103 T(V6K), // V6.
10104 T(V6KZ), // V6KZ.
10105 T(V7), // V6T2.
10106 T(V6K) // V6K.
10107 };
10108 static const int v7[] =
10109 {
10110 T(V7), // PRE_V4.
10111 T(V7), // V4.
10112 T(V7), // V4T.
10113 T(V7), // V5T.
10114 T(V7), // V5TE.
10115 T(V7), // V5TEJ.
10116 T(V7), // V6.
10117 T(V7), // V6KZ.
10118 T(V7), // V6T2.
10119 T(V7), // V6K.
10120 T(V7) // V7.
10121 };
10122 static const int v6_m[] =
10123 {
10124 -1, // PRE_V4.
10125 -1, // V4.
10126 T(V6K), // V4T.
10127 T(V6K), // V5T.
10128 T(V6K), // V5TE.
10129 T(V6K), // V5TEJ.
10130 T(V6K), // V6.
10131 T(V6KZ), // V6KZ.
10132 T(V7), // V6T2.
10133 T(V6K), // V6K.
10134 T(V7), // V7.
10135 T(V6_M) // V6_M.
10136 };
10137 static const int v6s_m[] =
10138 {
10139 -1, // PRE_V4.
10140 -1, // V4.
10141 T(V6K), // V4T.
10142 T(V6K), // V5T.
10143 T(V6K), // V5TE.
10144 T(V6K), // V5TEJ.
10145 T(V6K), // V6.
10146 T(V6KZ), // V6KZ.
10147 T(V7), // V6T2.
10148 T(V6K), // V6K.
10149 T(V7), // V7.
10150 T(V6S_M), // V6_M.
10151 T(V6S_M) // V6S_M.
10152 };
10153 static const int v7e_m[] =
10154 {
10155 -1, // PRE_V4.
10156 -1, // V4.
10157 T(V7E_M), // V4T.
10158 T(V7E_M), // V5T.
10159 T(V7E_M), // V5TE.
10160 T(V7E_M), // V5TEJ.
10161 T(V7E_M), // V6.
10162 T(V7E_M), // V6KZ.
10163 T(V7E_M), // V6T2.
10164 T(V7E_M), // V6K.
10165 T(V7E_M), // V7.
10166 T(V7E_M), // V6_M.
10167 T(V7E_M), // V6S_M.
10168 T(V7E_M) // V7E_M.
10169 };
10170 static const int v4t_plus_v6_m[] =
10171 {
10172 -1, // PRE_V4.
10173 -1, // V4.
10174 T(V4T), // V4T.
10175 T(V5T), // V5T.
10176 T(V5TE), // V5TE.
10177 T(V5TEJ), // V5TEJ.
10178 T(V6), // V6.
10179 T(V6KZ), // V6KZ.
10180 T(V6T2), // V6T2.
10181 T(V6K), // V6K.
10182 T(V7), // V7.
10183 T(V6_M), // V6_M.
10184 T(V6S_M), // V6S_M.
10185 T(V7E_M), // V7E_M.
10186 T(V4T_PLUS_V6_M) // V4T plus V6_M.
10187 };
ca09d69a 10188 static const int* comb[] =
a0351a69
DK
10189 {
10190 v6t2,
10191 v6k,
10192 v7,
10193 v6_m,
10194 v6s_m,
10195 v7e_m,
10196 // Pseudo-architecture.
10197 v4t_plus_v6_m
10198 };
10199
10200 // Check we've not got a higher architecture than we know about.
10201
10202 if (oldtag >= elfcpp::MAX_TAG_CPU_ARCH || newtag >= elfcpp::MAX_TAG_CPU_ARCH)
10203 {
10204 gold_error(_("%s: unknown CPU architecture"), name);
10205 return -1;
10206 }
10207
10208 // Override old tag if we have a Tag_also_compatible_with on the output.
10209
10210 if ((oldtag == T(V6_M) && *secondary_compat_out == T(V4T))
10211 || (oldtag == T(V4T) && *secondary_compat_out == T(V6_M)))
10212 oldtag = T(V4T_PLUS_V6_M);
10213
10214 // And override the new tag if we have a Tag_also_compatible_with on the
10215 // input.
10216
10217 if ((newtag == T(V6_M) && secondary_compat == T(V4T))
10218 || (newtag == T(V4T) && secondary_compat == T(V6_M)))
10219 newtag = T(V4T_PLUS_V6_M);
10220
10221 // Architectures before V6KZ add features monotonically.
10222 int tagh = std::max(oldtag, newtag);
10223 if (tagh <= elfcpp::TAG_CPU_ARCH_V6KZ)
10224 return tagh;
10225
10226 int tagl = std::min(oldtag, newtag);
10227 int result = comb[tagh - T(V6T2)][tagl];
10228
10229 // Use Tag_CPU_arch == V4T and Tag_also_compatible_with (Tag_CPU_arch V6_M)
10230 // as the canonical version.
10231 if (result == T(V4T_PLUS_V6_M))
10232 {
10233 result = T(V4T);
10234 *secondary_compat_out = T(V6_M);
10235 }
10236 else
10237 *secondary_compat_out = -1;
10238
10239 if (result == -1)
10240 {
10241 gold_error(_("%s: conflicting CPU architectures %d/%d"),
10242 name, oldtag, newtag);
10243 return -1;
10244 }
10245
10246 return result;
10247#undef T
10248}
10249
10250// Helper to print AEABI enum tag value.
10251
10252template<bool big_endian>
10253std::string
10254Target_arm<big_endian>::aeabi_enum_name(unsigned int value)
10255{
ca09d69a 10256 static const char* aeabi_enum_names[] =
a0351a69
DK
10257 { "", "variable-size", "32-bit", "" };
10258 const size_t aeabi_enum_names_size =
10259 sizeof(aeabi_enum_names) / sizeof(aeabi_enum_names[0]);
10260
10261 if (value < aeabi_enum_names_size)
10262 return std::string(aeabi_enum_names[value]);
10263 else
10264 {
10265 char buffer[100];
10266 sprintf(buffer, "<unknown value %u>", value);
10267 return std::string(buffer);
10268 }
10269}
10270
10271// Return the string value to store in TAG_CPU_name.
10272
10273template<bool big_endian>
10274std::string
10275Target_arm<big_endian>::tag_cpu_name_value(unsigned int value)
10276{
ca09d69a 10277 static const char* name_table[] = {
a0351a69
DK
10278 // These aren't real CPU names, but we can't guess
10279 // that from the architecture version alone.
10280 "Pre v4",
10281 "ARM v4",
10282 "ARM v4T",
10283 "ARM v5T",
10284 "ARM v5TE",
10285 "ARM v5TEJ",
10286 "ARM v6",
10287 "ARM v6KZ",
10288 "ARM v6T2",
10289 "ARM v6K",
10290 "ARM v7",
10291 "ARM v6-M",
10292 "ARM v6S-M",
10293 "ARM v7E-M"
10294 };
10295 const size_t name_table_size = sizeof(name_table) / sizeof(name_table[0]);
10296
10297 if (value < name_table_size)
10298 return std::string(name_table[value]);
10299 else
10300 {
10301 char buffer[100];
10302 sprintf(buffer, "<unknown CPU value %u>", value);
10303 return std::string(buffer);
10304 }
10305}
10306
10307// Merge object attributes from input file called NAME with those of the
10308// output. The input object attributes are in the object pointed by PASD.
10309
10310template<bool big_endian>
10311void
10312Target_arm<big_endian>::merge_object_attributes(
10313 const char* name,
10314 const Attributes_section_data* pasd)
10315{
10316 // Return if there is no attributes section data.
10317 if (pasd == NULL)
10318 return;
10319
10320 // If output has no object attributes, just copy.
da59ad79 10321 const int vendor = Object_attribute::OBJ_ATTR_PROC;
a0351a69
DK
10322 if (this->attributes_section_data_ == NULL)
10323 {
10324 this->attributes_section_data_ = new Attributes_section_data(*pasd);
da59ad79
DK
10325 Object_attribute* out_attr =
10326 this->attributes_section_data_->known_attributes(vendor);
10327
10328 // We do not output objects with Tag_MPextension_use_legacy - we move
10329 // the attribute's value to Tag_MPextension_use. */
10330 if (out_attr[elfcpp::Tag_MPextension_use_legacy].int_value() != 0)
10331 {
10332 if (out_attr[elfcpp::Tag_MPextension_use].int_value() != 0
10333 && out_attr[elfcpp::Tag_MPextension_use_legacy].int_value()
10334 != out_attr[elfcpp::Tag_MPextension_use].int_value())
10335 {
10336 gold_error(_("%s has both the current and legacy "
10337 "Tag_MPextension_use attributes"),
10338 name);
10339 }
10340
10341 out_attr[elfcpp::Tag_MPextension_use] =
10342 out_attr[elfcpp::Tag_MPextension_use_legacy];
10343 out_attr[elfcpp::Tag_MPextension_use_legacy].set_type(0);
10344 out_attr[elfcpp::Tag_MPextension_use_legacy].set_int_value(0);
10345 }
10346
a0351a69
DK
10347 return;
10348 }
10349
a0351a69
DK
10350 const Object_attribute* in_attr = pasd->known_attributes(vendor);
10351 Object_attribute* out_attr =
10352 this->attributes_section_data_->known_attributes(vendor);
10353
10354 // This needs to happen before Tag_ABI_FP_number_model is merged. */
10355 if (in_attr[elfcpp::Tag_ABI_VFP_args].int_value()
10356 != out_attr[elfcpp::Tag_ABI_VFP_args].int_value())
10357 {
10358 // Ignore mismatches if the object doesn't use floating point. */
10359 if (out_attr[elfcpp::Tag_ABI_FP_number_model].int_value() == 0)
10360 out_attr[elfcpp::Tag_ABI_VFP_args].set_int_value(
10361 in_attr[elfcpp::Tag_ABI_VFP_args].int_value());
7296d933
DK
10362 else if (in_attr[elfcpp::Tag_ABI_FP_number_model].int_value() != 0
10363 && parameters->options().warn_mismatch())
a0351a69
DK
10364 gold_error(_("%s uses VFP register arguments, output does not"),
10365 name);
10366 }
10367
10368 for (int i = 4; i < Vendor_object_attributes::NUM_KNOWN_ATTRIBUTES; ++i)
10369 {
10370 // Merge this attribute with existing attributes.
10371 switch (i)
10372 {
10373 case elfcpp::Tag_CPU_raw_name:
10374 case elfcpp::Tag_CPU_name:
10375 // These are merged after Tag_CPU_arch.
10376 break;
10377
10378 case elfcpp::Tag_ABI_optimization_goals:
10379 case elfcpp::Tag_ABI_FP_optimization_goals:
10380 // Use the first value seen.
10381 break;
10382
10383 case elfcpp::Tag_CPU_arch:
10384 {
10385 unsigned int saved_out_attr = out_attr->int_value();
10386 // Merge Tag_CPU_arch and Tag_also_compatible_with.
10387 int secondary_compat =
10388 this->get_secondary_compatible_arch(pasd);
10389 int secondary_compat_out =
10390 this->get_secondary_compatible_arch(
10391 this->attributes_section_data_);
10392 out_attr[i].set_int_value(
10393 tag_cpu_arch_combine(name, out_attr[i].int_value(),
10394 &secondary_compat_out,
10395 in_attr[i].int_value(),
10396 secondary_compat));
10397 this->set_secondary_compatible_arch(this->attributes_section_data_,
10398 secondary_compat_out);
10399
10400 // Merge Tag_CPU_name and Tag_CPU_raw_name.
10401 if (out_attr[i].int_value() == saved_out_attr)
10402 ; // Leave the names alone.
10403 else if (out_attr[i].int_value() == in_attr[i].int_value())
10404 {
10405 // The output architecture has been changed to match the
10406 // input architecture. Use the input names.
10407 out_attr[elfcpp::Tag_CPU_name].set_string_value(
10408 in_attr[elfcpp::Tag_CPU_name].string_value());
10409 out_attr[elfcpp::Tag_CPU_raw_name].set_string_value(
10410 in_attr[elfcpp::Tag_CPU_raw_name].string_value());
10411 }
10412 else
10413 {
10414 out_attr[elfcpp::Tag_CPU_name].set_string_value("");
10415 out_attr[elfcpp::Tag_CPU_raw_name].set_string_value("");
10416 }
10417
10418 // If we still don't have a value for Tag_CPU_name,
10419 // make one up now. Tag_CPU_raw_name remains blank.
10420 if (out_attr[elfcpp::Tag_CPU_name].string_value() == "")
10421 {
10422 const std::string cpu_name =
10423 this->tag_cpu_name_value(out_attr[i].int_value());
10424 // FIXME: If we see an unknown CPU, this will be set
10425 // to "<unknown CPU n>", where n is the attribute value.
10426 // This is different from BFD, which leaves the name alone.
10427 out_attr[elfcpp::Tag_CPU_name].set_string_value(cpu_name);
10428 }
10429 }
10430 break;
10431
10432 case elfcpp::Tag_ARM_ISA_use:
10433 case elfcpp::Tag_THUMB_ISA_use:
10434 case elfcpp::Tag_WMMX_arch:
10435 case elfcpp::Tag_Advanced_SIMD_arch:
10436 // ??? Do Advanced_SIMD (NEON) and WMMX conflict?
10437 case elfcpp::Tag_ABI_FP_rounding:
10438 case elfcpp::Tag_ABI_FP_exceptions:
10439 case elfcpp::Tag_ABI_FP_user_exceptions:
10440 case elfcpp::Tag_ABI_FP_number_model:
10441 case elfcpp::Tag_VFP_HP_extension:
10442 case elfcpp::Tag_CPU_unaligned_access:
10443 case elfcpp::Tag_T2EE_use:
10444 case elfcpp::Tag_Virtualization_use:
10445 case elfcpp::Tag_MPextension_use:
10446 // Use the largest value specified.
10447 if (in_attr[i].int_value() > out_attr[i].int_value())
10448 out_attr[i].set_int_value(in_attr[i].int_value());
10449 break;
10450
10451 case elfcpp::Tag_ABI_align8_preserved:
10452 case elfcpp::Tag_ABI_PCS_RO_data:
10453 // Use the smallest value specified.
10454 if (in_attr[i].int_value() < out_attr[i].int_value())
10455 out_attr[i].set_int_value(in_attr[i].int_value());
10456 break;
10457
10458 case elfcpp::Tag_ABI_align8_needed:
10459 if ((in_attr[i].int_value() > 0 || out_attr[i].int_value() > 0)
10460 && (in_attr[elfcpp::Tag_ABI_align8_preserved].int_value() == 0
10461 || (out_attr[elfcpp::Tag_ABI_align8_preserved].int_value()
10462 == 0)))
10463 {
9b547ce6 10464 // This error message should be enabled once all non-conforming
a0351a69
DK
10465 // binaries in the toolchain have had the attributes set
10466 // properly.
10467 // gold_error(_("output 8-byte data alignment conflicts with %s"),
10468 // name);
10469 }
10470 // Fall through.
10471 case elfcpp::Tag_ABI_FP_denormal:
10472 case elfcpp::Tag_ABI_PCS_GOT_use:
10473 {
10474 // These tags have 0 = don't care, 1 = strong requirement,
10475 // 2 = weak requirement.
10476 static const int order_021[3] = {0, 2, 1};
10477
10478 // Use the "greatest" from the sequence 0, 2, 1, or the largest
10479 // value if greater than 2 (for future-proofing).
10480 if ((in_attr[i].int_value() > 2
10481 && in_attr[i].int_value() > out_attr[i].int_value())
10482 || (in_attr[i].int_value() <= 2
10483 && out_attr[i].int_value() <= 2
10484 && (order_021[in_attr[i].int_value()]
10485 > order_021[out_attr[i].int_value()])))
10486 out_attr[i].set_int_value(in_attr[i].int_value());
10487 }
10488 break;
10489
10490 case elfcpp::Tag_CPU_arch_profile:
10491 if (out_attr[i].int_value() != in_attr[i].int_value())
10492 {
10493 // 0 will merge with anything.
10494 // 'A' and 'S' merge to 'A'.
10495 // 'R' and 'S' merge to 'R'.
10496 // 'M' and 'A|R|S' is an error.
10497 if (out_attr[i].int_value() == 0
10498 || (out_attr[i].int_value() == 'S'
10499 && (in_attr[i].int_value() == 'A'
10500 || in_attr[i].int_value() == 'R')))
10501 out_attr[i].set_int_value(in_attr[i].int_value());
10502 else if (in_attr[i].int_value() == 0
10503 || (in_attr[i].int_value() == 'S'
10504 && (out_attr[i].int_value() == 'A'
10505 || out_attr[i].int_value() == 'R')))
10506 ; // Do nothing.
7296d933 10507 else if (parameters->options().warn_mismatch())
a0351a69
DK
10508 {
10509 gold_error
10510 (_("conflicting architecture profiles %c/%c"),
10511 in_attr[i].int_value() ? in_attr[i].int_value() : '0',
10512 out_attr[i].int_value() ? out_attr[i].int_value() : '0');
10513 }
10514 }
10515 break;
10516 case elfcpp::Tag_VFP_arch:
10517 {
10518 static const struct
10519 {
10520 int ver;
10521 int regs;
10522 } vfp_versions[7] =
10523 {
10524 {0, 0},
10525 {1, 16},
10526 {2, 16},
10527 {3, 32},
10528 {3, 16},
10529 {4, 32},
10530 {4, 16}
10531 };
10532
10533 // Values greater than 6 aren't defined, so just pick the
10534 // biggest.
10535 if (in_attr[i].int_value() > 6
10536 && in_attr[i].int_value() > out_attr[i].int_value())
10537 {
10538 *out_attr = *in_attr;
10539 break;
10540 }
10541 // The output uses the superset of input features
10542 // (ISA version) and registers.
10543 int ver = std::max(vfp_versions[in_attr[i].int_value()].ver,
10544 vfp_versions[out_attr[i].int_value()].ver);
10545 int regs = std::max(vfp_versions[in_attr[i].int_value()].regs,
10546 vfp_versions[out_attr[i].int_value()].regs);
10547 // This assumes all possible supersets are also a valid
10548 // options.
10549 int newval;
10550 for (newval = 6; newval > 0; newval--)
10551 {
10552 if (regs == vfp_versions[newval].regs
10553 && ver == vfp_versions[newval].ver)
10554 break;
10555 }
10556 out_attr[i].set_int_value(newval);
10557 }
10558 break;
10559 case elfcpp::Tag_PCS_config:
10560 if (out_attr[i].int_value() == 0)
10561 out_attr[i].set_int_value(in_attr[i].int_value());
7296d933
DK
10562 else if (in_attr[i].int_value() != 0
10563 && out_attr[i].int_value() != 0
10564 && parameters->options().warn_mismatch())
a0351a69
DK
10565 {
10566 // It's sometimes ok to mix different configs, so this is only
10567 // a warning.
10568 gold_warning(_("%s: conflicting platform configuration"), name);
10569 }
10570 break;
10571 case elfcpp::Tag_ABI_PCS_R9_use:
10572 if (in_attr[i].int_value() != out_attr[i].int_value()
10573 && out_attr[i].int_value() != elfcpp::AEABI_R9_unused
7296d933
DK
10574 && in_attr[i].int_value() != elfcpp::AEABI_R9_unused
10575 && parameters->options().warn_mismatch())
a0351a69
DK
10576 {
10577 gold_error(_("%s: conflicting use of R9"), name);
10578 }
10579 if (out_attr[i].int_value() == elfcpp::AEABI_R9_unused)
10580 out_attr[i].set_int_value(in_attr[i].int_value());
10581 break;
10582 case elfcpp::Tag_ABI_PCS_RW_data:
10583 if (in_attr[i].int_value() == elfcpp::AEABI_PCS_RW_data_SBrel
10584 && (in_attr[elfcpp::Tag_ABI_PCS_R9_use].int_value()
10585 != elfcpp::AEABI_R9_SB)
10586 && (out_attr[elfcpp::Tag_ABI_PCS_R9_use].int_value()
7296d933
DK
10587 != elfcpp::AEABI_R9_unused)
10588 && parameters->options().warn_mismatch())
a0351a69
DK
10589 {
10590 gold_error(_("%s: SB relative addressing conflicts with use "
10591 "of R9"),
7296d933 10592 name);
a0351a69
DK
10593 }
10594 // Use the smallest value specified.
10595 if (in_attr[i].int_value() < out_attr[i].int_value())
10596 out_attr[i].set_int_value(in_attr[i].int_value());
10597 break;
10598 case elfcpp::Tag_ABI_PCS_wchar_t:
a0351a69
DK
10599 if (out_attr[i].int_value()
10600 && in_attr[i].int_value()
7296d933 10601 && out_attr[i].int_value() != in_attr[i].int_value()
ce0d1972
DK
10602 && parameters->options().warn_mismatch()
10603 && parameters->options().wchar_size_warning())
a0351a69
DK
10604 {
10605 gold_warning(_("%s uses %u-byte wchar_t yet the output is to "
10606 "use %u-byte wchar_t; use of wchar_t values "
10607 "across objects may fail"),
10608 name, in_attr[i].int_value(),
10609 out_attr[i].int_value());
10610 }
10611 else if (in_attr[i].int_value() && !out_attr[i].int_value())
10612 out_attr[i].set_int_value(in_attr[i].int_value());
10613 break;
10614 case elfcpp::Tag_ABI_enum_size:
10615 if (in_attr[i].int_value() != elfcpp::AEABI_enum_unused)
10616 {
10617 if (out_attr[i].int_value() == elfcpp::AEABI_enum_unused
10618 || out_attr[i].int_value() == elfcpp::AEABI_enum_forced_wide)
10619 {
10620 // The existing object is compatible with anything.
10621 // Use whatever requirements the new object has.
10622 out_attr[i].set_int_value(in_attr[i].int_value());
10623 }
a0351a69 10624 else if (in_attr[i].int_value() != elfcpp::AEABI_enum_forced_wide
7296d933 10625 && out_attr[i].int_value() != in_attr[i].int_value()
ce0d1972
DK
10626 && parameters->options().warn_mismatch()
10627 && parameters->options().enum_size_warning())
a0351a69
DK
10628 {
10629 unsigned int in_value = in_attr[i].int_value();
10630 unsigned int out_value = out_attr[i].int_value();
10631 gold_warning(_("%s uses %s enums yet the output is to use "
10632 "%s enums; use of enum values across objects "
10633 "may fail"),
10634 name,
10635 this->aeabi_enum_name(in_value).c_str(),
10636 this->aeabi_enum_name(out_value).c_str());
10637 }
10638 }
10639 break;
10640 case elfcpp::Tag_ABI_VFP_args:
9b547ce6 10641 // Already done.
a0351a69
DK
10642 break;
10643 case elfcpp::Tag_ABI_WMMX_args:
7296d933
DK
10644 if (in_attr[i].int_value() != out_attr[i].int_value()
10645 && parameters->options().warn_mismatch())
a0351a69
DK
10646 {
10647 gold_error(_("%s uses iWMMXt register arguments, output does "
10648 "not"),
10649 name);
10650 }
10651 break;
10652 case Object_attribute::Tag_compatibility:
10653 // Merged in target-independent code.
10654 break;
10655 case elfcpp::Tag_ABI_HardFP_use:
10656 // 1 (SP) and 2 (DP) conflict, so combine to 3 (SP & DP).
10657 if ((in_attr[i].int_value() == 1 && out_attr[i].int_value() == 2)
10658 || (in_attr[i].int_value() == 2 && out_attr[i].int_value() == 1))
10659 out_attr[i].set_int_value(3);
10660 else if (in_attr[i].int_value() > out_attr[i].int_value())
10661 out_attr[i].set_int_value(in_attr[i].int_value());
10662 break;
10663 case elfcpp::Tag_ABI_FP_16bit_format:
10664 if (in_attr[i].int_value() != 0 && out_attr[i].int_value() != 0)
10665 {
7296d933
DK
10666 if (in_attr[i].int_value() != out_attr[i].int_value()
10667 && parameters->options().warn_mismatch())
a0351a69
DK
10668 gold_error(_("fp16 format mismatch between %s and output"),
10669 name);
10670 }
10671 if (in_attr[i].int_value() != 0)
10672 out_attr[i].set_int_value(in_attr[i].int_value());
10673 break;
10674
da59ad79
DK
10675 case elfcpp::Tag_DIV_use:
10676 // This tag is set to zero if we can use UDIV and SDIV in Thumb
10677 // mode on a v7-M or v7-R CPU; to one if we can not use UDIV or
10678 // SDIV at all; and to two if we can use UDIV or SDIV on a v7-A
10679 // CPU. We will merge as follows: If the input attribute's value
10680 // is one then the output attribute's value remains unchanged. If
10681 // the input attribute's value is zero or two then if the output
10682 // attribute's value is one the output value is set to the input
10683 // value, otherwise the output value must be the same as the
10684 // inputs. */
10685 if (in_attr[i].int_value() != 1 && out_attr[i].int_value() != 1)
10686 {
10687 if (in_attr[i].int_value() != out_attr[i].int_value())
10688 {
10689 gold_error(_("DIV usage mismatch between %s and output"),
10690 name);
10691 }
10692 }
10693
10694 if (in_attr[i].int_value() != 1)
10695 out_attr[i].set_int_value(in_attr[i].int_value());
10696
10697 break;
10698
10699 case elfcpp::Tag_MPextension_use_legacy:
10700 // We don't output objects with Tag_MPextension_use_legacy - we
10701 // move the value to Tag_MPextension_use.
10702 if (in_attr[i].int_value() != 0
10703 && in_attr[elfcpp::Tag_MPextension_use].int_value() != 0)
10704 {
10705 if (in_attr[elfcpp::Tag_MPextension_use].int_value()
10706 != in_attr[i].int_value())
10707 {
10708 gold_error(_("%s has has both the current and legacy "
10709 "Tag_MPextension_use attributes"),
10710 name);
10711 }
10712 }
10713
10714 if (in_attr[i].int_value()
10715 > out_attr[elfcpp::Tag_MPextension_use].int_value())
10716 out_attr[elfcpp::Tag_MPextension_use] = in_attr[i];
10717
10718 break;
10719
a0351a69
DK
10720 case elfcpp::Tag_nodefaults:
10721 // This tag is set if it exists, but the value is unused (and is
10722 // typically zero). We don't actually need to do anything here -
10723 // the merge happens automatically when the type flags are merged
10724 // below.
10725 break;
10726 case elfcpp::Tag_also_compatible_with:
10727 // Already done in Tag_CPU_arch.
10728 break;
10729 case elfcpp::Tag_conformance:
10730 // Keep the attribute if it matches. Throw it away otherwise.
10731 // No attribute means no claim to conform.
10732 if (in_attr[i].string_value() != out_attr[i].string_value())
10733 out_attr[i].set_string_value("");
10734 break;
10735
10736 default:
10737 {
10738 const char* err_object = NULL;
10739
10740 // The "known_obj_attributes" table does contain some undefined
10741 // attributes. Ensure that there are unused.
10742 if (out_attr[i].int_value() != 0
10743 || out_attr[i].string_value() != "")
10744 err_object = "output";
10745 else if (in_attr[i].int_value() != 0
10746 || in_attr[i].string_value() != "")
10747 err_object = name;
10748
7296d933
DK
10749 if (err_object != NULL
10750 && parameters->options().warn_mismatch())
a0351a69
DK
10751 {
10752 // Attribute numbers >=64 (mod 128) can be safely ignored.
10753 if ((i & 127) < 64)
10754 gold_error(_("%s: unknown mandatory EABI object attribute "
10755 "%d"),
10756 err_object, i);
10757 else
10758 gold_warning(_("%s: unknown EABI object attribute %d"),
10759 err_object, i);
10760 }
10761
10762 // Only pass on attributes that match in both inputs.
10763 if (!in_attr[i].matches(out_attr[i]))
10764 {
10765 out_attr[i].set_int_value(0);
10766 out_attr[i].set_string_value("");
10767 }
10768 }
10769 }
10770
10771 // If out_attr was copied from in_attr then it won't have a type yet.
10772 if (in_attr[i].type() && !out_attr[i].type())
10773 out_attr[i].set_type(in_attr[i].type());
10774 }
10775
10776 // Merge Tag_compatibility attributes and any common GNU ones.
10777 this->attributes_section_data_->merge(name, pasd);
10778
10779 // Check for any attributes not known on ARM.
10780 typedef Vendor_object_attributes::Other_attributes Other_attributes;
10781 const Other_attributes* in_other_attributes = pasd->other_attributes(vendor);
10782 Other_attributes::const_iterator in_iter = in_other_attributes->begin();
10783 Other_attributes* out_other_attributes =
10784 this->attributes_section_data_->other_attributes(vendor);
10785 Other_attributes::iterator out_iter = out_other_attributes->begin();
10786
10787 while (in_iter != in_other_attributes->end()
10788 || out_iter != out_other_attributes->end())
10789 {
10790 const char* err_object = NULL;
10791 int err_tag = 0;
10792
10793 // The tags for each list are in numerical order.
10794 // If the tags are equal, then merge.
10795 if (out_iter != out_other_attributes->end()
10796 && (in_iter == in_other_attributes->end()
10797 || in_iter->first > out_iter->first))
10798 {
10799 // This attribute only exists in output. We can't merge, and we
10800 // don't know what the tag means, so delete it.
10801 err_object = "output";
10802 err_tag = out_iter->first;
10803 int saved_tag = out_iter->first;
10804 delete out_iter->second;
10805 out_other_attributes->erase(out_iter);
10806 out_iter = out_other_attributes->upper_bound(saved_tag);
10807 }
10808 else if (in_iter != in_other_attributes->end()
10809 && (out_iter != out_other_attributes->end()
10810 || in_iter->first < out_iter->first))
10811 {
10812 // This attribute only exists in input. We can't merge, and we
10813 // don't know what the tag means, so ignore it.
10814 err_object = name;
10815 err_tag = in_iter->first;
10816 ++in_iter;
10817 }
10818 else // The tags are equal.
10819 {
10820 // As present, all attributes in the list are unknown, and
10821 // therefore can't be merged meaningfully.
10822 err_object = "output";
10823 err_tag = out_iter->first;
10824
10825 // Only pass on attributes that match in both inputs.
10826 if (!in_iter->second->matches(*(out_iter->second)))
10827 {
10828 // No match. Delete the attribute.
10829 int saved_tag = out_iter->first;
10830 delete out_iter->second;
10831 out_other_attributes->erase(out_iter);
10832 out_iter = out_other_attributes->upper_bound(saved_tag);
10833 }
10834 else
10835 {
10836 // Matched. Keep the attribute and move to the next.
10837 ++out_iter;
10838 ++in_iter;
10839 }
10840 }
10841
7296d933 10842 if (err_object && parameters->options().warn_mismatch())
a0351a69
DK
10843 {
10844 // Attribute numbers >=64 (mod 128) can be safely ignored. */
10845 if ((err_tag & 127) < 64)
10846 {
10847 gold_error(_("%s: unknown mandatory EABI object attribute %d"),
10848 err_object, err_tag);
10849 }
10850 else
10851 {
10852 gold_warning(_("%s: unknown EABI object attribute %d"),
10853 err_object, err_tag);
10854 }
10855 }
10856 }
10857}
10858
55da9579
DK
10859// Stub-generation methods for Target_arm.
10860
10861// Make a new Arm_input_section object.
10862
10863template<bool big_endian>
10864Arm_input_section<big_endian>*
10865Target_arm<big_endian>::new_arm_input_section(
2ea97941
ILT
10866 Relobj* relobj,
10867 unsigned int shndx)
55da9579 10868{
5ac169d4 10869 Section_id sid(relobj, shndx);
55da9579
DK
10870
10871 Arm_input_section<big_endian>* arm_input_section =
2ea97941 10872 new Arm_input_section<big_endian>(relobj, shndx);
55da9579
DK
10873 arm_input_section->init();
10874
10875 // Register new Arm_input_section in map for look-up.
10876 std::pair<typename Arm_input_section_map::iterator, bool> ins =
5ac169d4 10877 this->arm_input_section_map_.insert(std::make_pair(sid, arm_input_section));
55da9579
DK
10878
10879 // Make sure that it we have not created another Arm_input_section
10880 // for this input section already.
10881 gold_assert(ins.second);
10882
10883 return arm_input_section;
10884}
10885
10886// Find the Arm_input_section object corresponding to the SHNDX-th input
10887// section of RELOBJ.
10888
10889template<bool big_endian>
10890Arm_input_section<big_endian>*
10891Target_arm<big_endian>::find_arm_input_section(
2ea97941
ILT
10892 Relobj* relobj,
10893 unsigned int shndx) const
55da9579 10894{
5ac169d4 10895 Section_id sid(relobj, shndx);
55da9579 10896 typename Arm_input_section_map::const_iterator p =
5ac169d4 10897 this->arm_input_section_map_.find(sid);
55da9579
DK
10898 return (p != this->arm_input_section_map_.end()) ? p->second : NULL;
10899}
10900
10901// Make a new stub table.
10902
10903template<bool big_endian>
10904Stub_table<big_endian>*
10905Target_arm<big_endian>::new_stub_table(Arm_input_section<big_endian>* owner)
10906{
2ea97941 10907 Stub_table<big_endian>* stub_table =
55da9579 10908 new Stub_table<big_endian>(owner);
2ea97941 10909 this->stub_tables_.push_back(stub_table);
55da9579 10910
2ea97941
ILT
10911 stub_table->set_address(owner->address() + owner->data_size());
10912 stub_table->set_file_offset(owner->offset() + owner->data_size());
10913 stub_table->finalize_data_size();
55da9579 10914
2ea97941 10915 return stub_table;
55da9579
DK
10916}
10917
eb44217c
DK
10918// Scan a relocation for stub generation.
10919
10920template<bool big_endian>
10921void
10922Target_arm<big_endian>::scan_reloc_for_stub(
10923 const Relocate_info<32, big_endian>* relinfo,
10924 unsigned int r_type,
10925 const Sized_symbol<32>* gsym,
10926 unsigned int r_sym,
10927 const Symbol_value<32>* psymval,
10928 elfcpp::Elf_types<32>::Elf_Swxword addend,
10929 Arm_address address)
10930{
2ea97941 10931 typedef typename Target_arm<big_endian>::Relocate Relocate;
eb44217c
DK
10932
10933 const Arm_relobj<big_endian>* arm_relobj =
10934 Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
10935
10936 bool target_is_thumb;
10937 Symbol_value<32> symval;
10938 if (gsym != NULL)
10939 {
10940 // This is a global symbol. Determine if we use PLT and if the
10941 // final target is THUMB.
95a2c8d6 10942 if (gsym->use_plt_offset(Scan::get_reference_flags(r_type)))
eb44217c
DK
10943 {
10944 // This uses a PLT, change the symbol value.
10945 symval.set_output_value(this->plt_section()->address()
10946 + gsym->plt_offset());
10947 psymval = &symval;
10948 target_is_thumb = false;
10949 }
10950 else if (gsym->is_undefined())
10951 // There is no need to generate a stub symbol is undefined.
10952 return;
10953 else
10954 {
10955 target_is_thumb =
10956 ((gsym->type() == elfcpp::STT_ARM_TFUNC)
10957 || (gsym->type() == elfcpp::STT_FUNC
10958 && !gsym->is_undefined()
10959 && ((psymval->value(arm_relobj, 0) & 1) != 0)));
10960 }
10961 }
10962 else
10963 {
10964 // This is a local symbol. Determine if the final target is THUMB.
10965 target_is_thumb = arm_relobj->local_symbol_is_thumb_function(r_sym);
10966 }
10967
10968 // Strip LSB if this points to a THUMB target.
5c57f1be
DK
10969 const Arm_reloc_property* reloc_property =
10970 arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
10971 gold_assert(reloc_property != NULL);
eb44217c 10972 if (target_is_thumb
5c57f1be 10973 && reloc_property->uses_thumb_bit()
eb44217c
DK
10974 && ((psymval->value(arm_relobj, 0) & 1) != 0))
10975 {
10976 Arm_address stripped_value =
10977 psymval->value(arm_relobj, 0) & ~static_cast<Arm_address>(1);
10978 symval.set_output_value(stripped_value);
10979 psymval = &symval;
10980 }
10981
10982 // Get the symbol value.
10983 Symbol_value<32>::Value value = psymval->value(arm_relobj, 0);
10984
10985 // Owing to pipelining, the PC relative branches below actually skip
10986 // two instructions when the branch offset is 0.
10987 Arm_address destination;
10988 switch (r_type)
10989 {
10990 case elfcpp::R_ARM_CALL:
10991 case elfcpp::R_ARM_JUMP24:
10992 case elfcpp::R_ARM_PLT32:
10993 // ARM branches.
10994 destination = value + addend + 8;
10995 break;
10996 case elfcpp::R_ARM_THM_CALL:
10997 case elfcpp::R_ARM_THM_XPC22:
10998 case elfcpp::R_ARM_THM_JUMP24:
10999 case elfcpp::R_ARM_THM_JUMP19:
11000 // THUMB branches.
11001 destination = value + addend + 4;
11002 break;
11003 default:
11004 gold_unreachable();
11005 }
11006
a120bc7f 11007 Reloc_stub* stub = NULL;
eb44217c
DK
11008 Stub_type stub_type =
11009 Reloc_stub::stub_type_for_reloc(r_type, address, destination,
11010 target_is_thumb);
a120bc7f
DK
11011 if (stub_type != arm_stub_none)
11012 {
11013 // Try looking up an existing stub from a stub table.
11014 Stub_table<big_endian>* stub_table =
11015 arm_relobj->stub_table(relinfo->data_shndx);
11016 gold_assert(stub_table != NULL);
eb44217c 11017
a120bc7f
DK
11018 // Locate stub by destination.
11019 Reloc_stub::Key stub_key(stub_type, gsym, arm_relobj, r_sym, addend);
eb44217c 11020
a120bc7f
DK
11021 // Create a stub if there is not one already
11022 stub = stub_table->find_reloc_stub(stub_key);
11023 if (stub == NULL)
11024 {
11025 // create a new stub and add it to stub table.
11026 stub = this->stub_factory().make_reloc_stub(stub_type);
11027 stub_table->add_reloc_stub(stub, stub_key);
11028 }
11029
11030 // Record the destination address.
11031 stub->set_destination_address(destination
11032 | (target_is_thumb ? 1 : 0));
eb44217c
DK
11033 }
11034
a120bc7f
DK
11035 // For Cortex-A8, we need to record a relocation at 4K page boundary.
11036 if (this->fix_cortex_a8_
11037 && (r_type == elfcpp::R_ARM_THM_JUMP24
11038 || r_type == elfcpp::R_ARM_THM_JUMP19
11039 || r_type == elfcpp::R_ARM_THM_CALL
11040 || r_type == elfcpp::R_ARM_THM_XPC22)
11041 && (address & 0xfffU) == 0xffeU)
11042 {
11043 // Found a candidate. Note we haven't checked the destination is
11044 // within 4K here: if we do so (and don't create a record) we can't
11045 // tell that a branch should have been relocated when scanning later.
11046 this->cortex_a8_relocs_info_[address] =
11047 new Cortex_a8_reloc(stub, r_type,
11048 destination | (target_is_thumb ? 1 : 0));
11049 }
eb44217c
DK
11050}
11051
11052// This function scans a relocation sections for stub generation.
11053// The template parameter Relocate must be a class type which provides
11054// a single function, relocate(), which implements the machine
11055// specific part of a relocation.
11056
11057// BIG_ENDIAN is the endianness of the data. SH_TYPE is the section type:
11058// SHT_REL or SHT_RELA.
11059
11060// PRELOCS points to the relocation data. RELOC_COUNT is the number
11061// of relocs. OUTPUT_SECTION is the output section.
11062// NEEDS_SPECIAL_OFFSET_HANDLING is true if input offsets need to be
11063// mapped to output offsets.
11064
11065// VIEW is the section data, VIEW_ADDRESS is its memory address, and
11066// VIEW_SIZE is the size. These refer to the input section, unless
11067// NEEDS_SPECIAL_OFFSET_HANDLING is true, in which case they refer to
11068// the output section.
11069
11070template<bool big_endian>
11071template<int sh_type>
11072void inline
11073Target_arm<big_endian>::scan_reloc_section_for_stubs(
11074 const Relocate_info<32, big_endian>* relinfo,
11075 const unsigned char* prelocs,
11076 size_t reloc_count,
11077 Output_section* output_section,
11078 bool needs_special_offset_handling,
11079 const unsigned char* view,
11080 elfcpp::Elf_types<32>::Elf_Addr view_address,
11081 section_size_type)
11082{
11083 typedef typename Reloc_types<sh_type, 32, big_endian>::Reloc Reltype;
11084 const int reloc_size =
11085 Reloc_types<sh_type, 32, big_endian>::reloc_size;
11086
11087 Arm_relobj<big_endian>* arm_object =
11088 Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
11089 unsigned int local_count = arm_object->local_symbol_count();
11090
11091 Comdat_behavior comdat_behavior = CB_UNDETERMINED;
11092
11093 for (size_t i = 0; i < reloc_count; ++i, prelocs += reloc_size)
11094 {
11095 Reltype reloc(prelocs);
11096
11097 typename elfcpp::Elf_types<32>::Elf_WXword r_info = reloc.get_r_info();
11098 unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
11099 unsigned int r_type = elfcpp::elf_r_type<32>(r_info);
11100
11101 r_type = this->get_real_reloc_type(r_type);
11102
11103 // Only a few relocation types need stubs.
11104 if ((r_type != elfcpp::R_ARM_CALL)
11105 && (r_type != elfcpp::R_ARM_JUMP24)
11106 && (r_type != elfcpp::R_ARM_PLT32)
11107 && (r_type != elfcpp::R_ARM_THM_CALL)
11108 && (r_type != elfcpp::R_ARM_THM_XPC22)
11109 && (r_type != elfcpp::R_ARM_THM_JUMP24)
a2162063
ILT
11110 && (r_type != elfcpp::R_ARM_THM_JUMP19)
11111 && (r_type != elfcpp::R_ARM_V4BX))
eb44217c
DK
11112 continue;
11113
2ea97941 11114 section_offset_type offset =
eb44217c
DK
11115 convert_to_section_size_type(reloc.get_r_offset());
11116
11117 if (needs_special_offset_handling)
11118 {
2ea97941
ILT
11119 offset = output_section->output_offset(relinfo->object,
11120 relinfo->data_shndx,
11121 offset);
11122 if (offset == -1)
eb44217c
DK
11123 continue;
11124 }
11125
2fd9ae7a 11126 // Create a v4bx stub if --fix-v4bx-interworking is used.
a2162063
ILT
11127 if (r_type == elfcpp::R_ARM_V4BX)
11128 {
2fd9ae7a
DK
11129 if (this->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING)
11130 {
11131 // Get the BX instruction.
11132 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
11133 const Valtype* wv =
11134 reinterpret_cast<const Valtype*>(view + offset);
11135 elfcpp::Elf_types<32>::Elf_Swxword insn =
11136 elfcpp::Swap<32, big_endian>::readval(wv);
11137 const uint32_t reg = (insn & 0xf);
11138
11139 if (reg < 0xf)
11140 {
11141 // Try looking up an existing stub from a stub table.
11142 Stub_table<big_endian>* stub_table =
11143 arm_object->stub_table(relinfo->data_shndx);
11144 gold_assert(stub_table != NULL);
11145
11146 if (stub_table->find_arm_v4bx_stub(reg) == NULL)
11147 {
11148 // create a new stub and add it to stub table.
11149 Arm_v4bx_stub* stub =
11150 this->stub_factory().make_arm_v4bx_stub(reg);
11151 gold_assert(stub != NULL);
11152 stub_table->add_arm_v4bx_stub(stub);
11153 }
11154 }
11155 }
a2162063
ILT
11156 continue;
11157 }
11158
eb44217c
DK
11159 // Get the addend.
11160 Stub_addend_reader<sh_type, big_endian> stub_addend_reader;
11161 elfcpp::Elf_types<32>::Elf_Swxword addend =
2ea97941 11162 stub_addend_reader(r_type, view + offset, reloc);
eb44217c
DK
11163
11164 const Sized_symbol<32>* sym;
11165
11166 Symbol_value<32> symval;
11167 const Symbol_value<32> *psymval;
aa98ff75
DK
11168 bool is_defined_in_discarded_section;
11169 unsigned int shndx;
eb44217c
DK
11170 if (r_sym < local_count)
11171 {
11172 sym = NULL;
11173 psymval = arm_object->local_symbol(r_sym);
11174
11175 // If the local symbol belongs to a section we are discarding,
11176 // and that section is a debug section, try to find the
11177 // corresponding kept section and map this symbol to its
11178 // counterpart in the kept section. The symbol must not
11179 // correspond to a section we are folding.
11180 bool is_ordinary;
aa98ff75
DK
11181 shndx = psymval->input_shndx(&is_ordinary);
11182 is_defined_in_discarded_section =
11183 (is_ordinary
11184 && shndx != elfcpp::SHN_UNDEF
11185 && !arm_object->is_section_included(shndx)
11186 && !relinfo->symtab->is_section_folded(arm_object, shndx));
11187
11188 // We need to compute the would-be final value of this local
11189 // symbol.
11190 if (!is_defined_in_discarded_section)
eb44217c 11191 {
aa98ff75
DK
11192 typedef Sized_relobj<32, big_endian> ObjType;
11193 typename ObjType::Compute_final_local_value_status status =
11194 arm_object->compute_final_local_value(r_sym, psymval, &symval,
11195 relinfo->symtab);
11196 if (status == ObjType::CFLV_OK)
11197 {
11198 // Currently we cannot handle a branch to a target in
11199 // a merged section. If this is the case, issue an error
11200 // and also free the merge symbol value.
11201 if (!symval.has_output_value())
11202 {
11203 const std::string& section_name =
11204 arm_object->section_name(shndx);
11205 arm_object->error(_("cannot handle branch to local %u "
11206 "in a merged section %s"),
11207 r_sym, section_name.c_str());
11208 }
11209 psymval = &symval;
11210 }
eb44217c 11211 else
aa98ff75
DK
11212 {
11213 // We cannot determine the final value.
11214 continue;
11215 }
eb44217c
DK
11216 }
11217 }
11218 else
11219 {
aa98ff75
DK
11220 const Symbol* gsym;
11221 gsym = arm_object->global_symbol(r_sym);
eb44217c
DK
11222 gold_assert(gsym != NULL);
11223 if (gsym->is_forwarder())
11224 gsym = relinfo->symtab->resolve_forwards(gsym);
11225
11226 sym = static_cast<const Sized_symbol<32>*>(gsym);
aa98ff75 11227 if (sym->has_symtab_index() && sym->symtab_index() != -1U)
eb44217c
DK
11228 symval.set_output_symtab_index(sym->symtab_index());
11229 else
11230 symval.set_no_output_symtab_entry();
11231
11232 // We need to compute the would-be final value of this global
11233 // symbol.
11234 const Symbol_table* symtab = relinfo->symtab;
11235 const Sized_symbol<32>* sized_symbol =
11236 symtab->get_sized_symbol<32>(gsym);
11237 Symbol_table::Compute_final_value_status status;
11238 Arm_address value =
11239 symtab->compute_final_value<32>(sized_symbol, &status);
11240
11241 // Skip this if the symbol has not output section.
11242 if (status == Symbol_table::CFVS_NO_OUTPUT_SECTION)
11243 continue;
eb44217c 11244 symval.set_output_value(value);
aa98ff75
DK
11245
11246 if (gsym->type() == elfcpp::STT_TLS)
11247 symval.set_is_tls_symbol();
11248 else if (gsym->type() == elfcpp::STT_GNU_IFUNC)
11249 symval.set_is_ifunc_symbol();
eb44217c 11250 psymval = &symval;
aa98ff75
DK
11251
11252 is_defined_in_discarded_section =
11253 (gsym->is_defined_in_discarded_section()
11254 && gsym->is_undefined());
11255 shndx = 0;
11256 }
11257
11258 Symbol_value<32> symval2;
11259 if (is_defined_in_discarded_section)
11260 {
11261 if (comdat_behavior == CB_UNDETERMINED)
11262 {
11263 std::string name = arm_object->section_name(relinfo->data_shndx);
11264 comdat_behavior = get_comdat_behavior(name.c_str());
11265 }
11266 if (comdat_behavior == CB_PRETEND)
11267 {
11268 // FIXME: This case does not work for global symbols.
11269 // We have no place to store the original section index.
11270 // Fortunately this does not matter for comdat sections,
11271 // only for sections explicitly discarded by a linker
11272 // script.
11273 bool found;
11274 typename elfcpp::Elf_types<32>::Elf_Addr value =
11275 arm_object->map_to_kept_section(shndx, &found);
11276 if (found)
11277 symval2.set_output_value(value + psymval->input_value());
11278 else
11279 symval2.set_output_value(0);
11280 }
11281 else
11282 {
11283 if (comdat_behavior == CB_WARNING)
11284 gold_warning_at_location(relinfo, i, offset,
11285 _("relocation refers to discarded "
11286 "section"));
11287 symval2.set_output_value(0);
11288 }
11289 symval2.set_no_output_symtab_entry();
11290 psymval = &symval2;
eb44217c
DK
11291 }
11292
11293 // If symbol is a section symbol, we don't know the actual type of
11294 // destination. Give up.
11295 if (psymval->is_section_symbol())
11296 continue;
11297
11298 this->scan_reloc_for_stub(relinfo, r_type, sym, r_sym, psymval,
2ea97941 11299 addend, view_address + offset);
eb44217c
DK
11300 }
11301}
11302
11303// Scan an input section for stub generation.
11304
11305template<bool big_endian>
11306void
11307Target_arm<big_endian>::scan_section_for_stubs(
11308 const Relocate_info<32, big_endian>* relinfo,
11309 unsigned int sh_type,
11310 const unsigned char* prelocs,
11311 size_t reloc_count,
11312 Output_section* output_section,
11313 bool needs_special_offset_handling,
11314 const unsigned char* view,
11315 Arm_address view_address,
11316 section_size_type view_size)
11317{
11318 if (sh_type == elfcpp::SHT_REL)
11319 this->scan_reloc_section_for_stubs<elfcpp::SHT_REL>(
11320 relinfo,
11321 prelocs,
11322 reloc_count,
11323 output_section,
11324 needs_special_offset_handling,
11325 view,
11326 view_address,
11327 view_size);
11328 else if (sh_type == elfcpp::SHT_RELA)
11329 // We do not support RELA type relocations yet. This is provided for
11330 // completeness.
11331 this->scan_reloc_section_for_stubs<elfcpp::SHT_RELA>(
11332 relinfo,
11333 prelocs,
11334 reloc_count,
11335 output_section,
11336 needs_special_offset_handling,
11337 view,
11338 view_address,
11339 view_size);
11340 else
11341 gold_unreachable();
11342}
11343
11344// Group input sections for stub generation.
11345//
9b547ce6 11346// We group input sections in an output section so that the total size,
eb44217c
DK
11347// including any padding space due to alignment is smaller than GROUP_SIZE
11348// unless the only input section in group is bigger than GROUP_SIZE already.
11349// Then an ARM stub table is created to follow the last input section
11350// in group. For each group an ARM stub table is created an is placed
9b547ce6 11351// after the last group. If STUB_ALWAYS_AFTER_BRANCH is false, we further
eb44217c
DK
11352// extend the group after the stub table.
11353
11354template<bool big_endian>
11355void
11356Target_arm<big_endian>::group_sections(
2ea97941 11357 Layout* layout,
eb44217c 11358 section_size_type group_size,
f625ae50
DK
11359 bool stubs_always_after_branch,
11360 const Task* task)
eb44217c
DK
11361{
11362 // Group input sections and insert stub table
11363 Layout::Section_list section_list;
2ea97941 11364 layout->get_allocated_sections(&section_list);
eb44217c
DK
11365 for (Layout::Section_list::const_iterator p = section_list.begin();
11366 p != section_list.end();
11367 ++p)
11368 {
11369 Arm_output_section<big_endian>* output_section =
11370 Arm_output_section<big_endian>::as_arm_output_section(*p);
11371 output_section->group_sections(group_size, stubs_always_after_branch,
f625ae50 11372 this, task);
eb44217c
DK
11373 }
11374}
11375
11376// Relaxation hook. This is where we do stub generation.
11377
11378template<bool big_endian>
11379bool
11380Target_arm<big_endian>::do_relax(
11381 int pass,
11382 const Input_objects* input_objects,
11383 Symbol_table* symtab,
f625ae50
DK
11384 Layout* layout,
11385 const Task* task)
eb44217c
DK
11386{
11387 // No need to generate stubs if this is a relocatable link.
11388 gold_assert(!parameters->options().relocatable());
11389
11390 // If this is the first pass, we need to group input sections into
11391 // stub groups.
2b328d4e 11392 bool done_exidx_fixup = false;
6625d24e 11393 typedef typename Stub_table_list::iterator Stub_table_iterator;
eb44217c
DK
11394 if (pass == 1)
11395 {
11396 // Determine the stub group size. The group size is the absolute
11397 // value of the parameter --stub-group-size. If --stub-group-size
9b547ce6 11398 // is passed a negative value, we restrict stubs to be always after
eb44217c
DK
11399 // the stubbed branches.
11400 int32_t stub_group_size_param =
11401 parameters->options().stub_group_size();
11402 bool stubs_always_after_branch = stub_group_size_param < 0;
11403 section_size_type stub_group_size = abs(stub_group_size_param);
11404
11405 if (stub_group_size == 1)
11406 {
11407 // Default value.
11408 // Thumb branch range is +-4MB has to be used as the default
11409 // maximum size (a given section can contain both ARM and Thumb
a2c7281b
DK
11410 // code, so the worst case has to be taken into account). If we are
11411 // fixing cortex-a8 errata, the branch range has to be even smaller,
11412 // since wide conditional branch has a range of +-1MB only.
eb44217c 11413 //
25bbe950 11414 // This value is 48K less than that, which allows for 4096
eb44217c
DK
11415 // 12-byte stubs. If we exceed that, then we will fail to link.
11416 // The user will have to relink with an explicit group size
11417 // option.
25bbe950
DK
11418 stub_group_size = 4145152;
11419 }
11420
11421 // The Cortex-A8 erratum fix depends on stubs not being in the same 4K
11422 // page as the first half of a 32-bit branch straddling two 4K pages.
11423 // This is a crude way of enforcing that. In addition, long conditional
11424 // branches of THUMB-2 have a range of +-1M. If we are fixing cortex-A8
11425 // erratum, limit the group size to (1M - 12k) to avoid unreachable
11426 // cortex-A8 stubs from long conditional branches.
11427 if (this->fix_cortex_a8_)
11428 {
11429 stubs_always_after_branch = true;
11430 const section_size_type cortex_a8_group_size = 1024 * (1024 - 12);
11431 stub_group_size = std::max(stub_group_size, cortex_a8_group_size);
eb44217c
DK
11432 }
11433
f625ae50 11434 group_sections(layout, stub_group_size, stubs_always_after_branch, task);
2b328d4e
DK
11435
11436 // Also fix .ARM.exidx section coverage.
131687b4
DK
11437 Arm_output_section<big_endian>* exidx_output_section = NULL;
11438 for (Layout::Section_list::const_iterator p =
11439 layout->section_list().begin();
11440 p != layout->section_list().end();
11441 ++p)
11442 if ((*p)->type() == elfcpp::SHT_ARM_EXIDX)
11443 {
11444 if (exidx_output_section == NULL)
11445 exidx_output_section =
11446 Arm_output_section<big_endian>::as_arm_output_section(*p);
11447 else
11448 // We cannot handle this now.
11449 gold_error(_("multiple SHT_ARM_EXIDX sections %s and %s in a "
11450 "non-relocatable link"),
11451 exidx_output_section->name(),
11452 (*p)->name());
11453 }
11454
11455 if (exidx_output_section != NULL)
2b328d4e 11456 {
131687b4 11457 this->fix_exidx_coverage(layout, input_objects, exidx_output_section,
f625ae50 11458 symtab, task);
2b328d4e
DK
11459 done_exidx_fixup = true;
11460 }
eb44217c 11461 }
6625d24e
DK
11462 else
11463 {
11464 // If this is not the first pass, addresses and file offsets have
11465 // been reset at this point, set them here.
11466 for (Stub_table_iterator sp = this->stub_tables_.begin();
11467 sp != this->stub_tables_.end();
11468 ++sp)
11469 {
11470 Arm_input_section<big_endian>* owner = (*sp)->owner();
11471 off_t off = align_address(owner->original_size(),
11472 (*sp)->addralign());
11473 (*sp)->set_address_and_file_offset(owner->address() + off,
11474 owner->offset() + off);
11475 }
11476 }
eb44217c 11477
44272192
DK
11478 // The Cortex-A8 stubs are sensitive to layout of code sections. At the
11479 // beginning of each relaxation pass, just blow away all the stubs.
11480 // Alternatively, we could selectively remove only the stubs and reloc
11481 // information for code sections that have moved since the last pass.
11482 // That would require more book-keeping.
a120bc7f
DK
11483 if (this->fix_cortex_a8_)
11484 {
11485 // Clear all Cortex-A8 reloc information.
11486 for (typename Cortex_a8_relocs_info::const_iterator p =
11487 this->cortex_a8_relocs_info_.begin();
11488 p != this->cortex_a8_relocs_info_.end();
11489 ++p)
11490 delete p->second;
11491 this->cortex_a8_relocs_info_.clear();
44272192
DK
11492
11493 // Remove all Cortex-A8 stubs.
11494 for (Stub_table_iterator sp = this->stub_tables_.begin();
11495 sp != this->stub_tables_.end();
11496 ++sp)
11497 (*sp)->remove_all_cortex_a8_stubs();
a120bc7f
DK
11498 }
11499
44272192 11500 // Scan relocs for relocation stubs
eb44217c
DK
11501 for (Input_objects::Relobj_iterator op = input_objects->relobj_begin();
11502 op != input_objects->relobj_end();
11503 ++op)
11504 {
11505 Arm_relobj<big_endian>* arm_relobj =
11506 Arm_relobj<big_endian>::as_arm_relobj(*op);
f625ae50
DK
11507 // Lock the object so we can read from it. This is only called
11508 // single-threaded from Layout::finalize, so it is OK to lock.
11509 Task_lock_obj<Object> tl(task, arm_relobj);
2ea97941 11510 arm_relobj->scan_sections_for_stubs(this, symtab, layout);
eb44217c
DK
11511 }
11512
2fb7225c
DK
11513 // Check all stub tables to see if any of them have their data sizes
11514 // or addresses alignments changed. These are the only things that
11515 // matter.
eb44217c 11516 bool any_stub_table_changed = false;
8923b24c 11517 Unordered_set<const Output_section*> sections_needing_adjustment;
eb44217c
DK
11518 for (Stub_table_iterator sp = this->stub_tables_.begin();
11519 (sp != this->stub_tables_.end()) && !any_stub_table_changed;
11520 ++sp)
11521 {
2fb7225c 11522 if ((*sp)->update_data_size_and_addralign())
8923b24c
DK
11523 {
11524 // Update data size of stub table owner.
11525 Arm_input_section<big_endian>* owner = (*sp)->owner();
11526 uint64_t address = owner->address();
11527 off_t offset = owner->offset();
11528 owner->reset_address_and_file_offset();
11529 owner->set_address_and_file_offset(address, offset);
11530
11531 sections_needing_adjustment.insert(owner->output_section());
11532 any_stub_table_changed = true;
11533 }
11534 }
11535
11536 // Output_section_data::output_section() returns a const pointer but we
11537 // need to update output sections, so we record all output sections needing
11538 // update above and scan the sections here to find out what sections need
11539 // to be updated.
f625ae50 11540 for (Layout::Section_list::const_iterator p = layout->section_list().begin();
8923b24c
DK
11541 p != layout->section_list().end();
11542 ++p)
11543 {
11544 if (sections_needing_adjustment.find(*p)
11545 != sections_needing_adjustment.end())
11546 (*p)->set_section_offsets_need_adjustment();
eb44217c
DK
11547 }
11548
2b328d4e
DK
11549 // Stop relaxation if no EXIDX fix-up and no stub table change.
11550 bool continue_relaxation = done_exidx_fixup || any_stub_table_changed;
11551
2fb7225c 11552 // Finalize the stubs in the last relaxation pass.
2b328d4e 11553 if (!continue_relaxation)
e7eca48c
DK
11554 {
11555 for (Stub_table_iterator sp = this->stub_tables_.begin();
11556 (sp != this->stub_tables_.end()) && !any_stub_table_changed;
11557 ++sp)
11558 (*sp)->finalize_stubs();
11559
11560 // Update output local symbol counts of objects if necessary.
11561 for (Input_objects::Relobj_iterator op = input_objects->relobj_begin();
11562 op != input_objects->relobj_end();
11563 ++op)
11564 {
11565 Arm_relobj<big_endian>* arm_relobj =
11566 Arm_relobj<big_endian>::as_arm_relobj(*op);
11567
11568 // Update output local symbol counts. We need to discard local
11569 // symbols defined in parts of input sections that are discarded by
11570 // relaxation.
11571 if (arm_relobj->output_local_symbol_count_needs_update())
f625ae50
DK
11572 {
11573 // We need to lock the object's file to update it.
11574 Task_lock_obj<Object> tl(task, arm_relobj);
11575 arm_relobj->update_output_local_symbol_count();
11576 }
e7eca48c
DK
11577 }
11578 }
2fb7225c 11579
2b328d4e 11580 return continue_relaxation;
eb44217c
DK
11581}
11582
43d12afe
DK
11583// Relocate a stub.
11584
11585template<bool big_endian>
11586void
11587Target_arm<big_endian>::relocate_stub(
2fb7225c 11588 Stub* stub,
43d12afe
DK
11589 const Relocate_info<32, big_endian>* relinfo,
11590 Output_section* output_section,
11591 unsigned char* view,
11592 Arm_address address,
11593 section_size_type view_size)
11594{
11595 Relocate relocate;
2ea97941
ILT
11596 const Stub_template* stub_template = stub->stub_template();
11597 for (size_t i = 0; i < stub_template->reloc_count(); i++)
43d12afe 11598 {
2ea97941
ILT
11599 size_t reloc_insn_index = stub_template->reloc_insn_index(i);
11600 const Insn_template* insn = &stub_template->insns()[reloc_insn_index];
43d12afe
DK
11601
11602 unsigned int r_type = insn->r_type();
2ea97941 11603 section_size_type reloc_offset = stub_template->reloc_offset(i);
43d12afe
DK
11604 section_size_type reloc_size = insn->size();
11605 gold_assert(reloc_offset + reloc_size <= view_size);
11606
11607 // This is the address of the stub destination.
41263c05 11608 Arm_address target = stub->reloc_target(i) + insn->reloc_addend();
43d12afe
DK
11609 Symbol_value<32> symval;
11610 symval.set_output_value(target);
11611
11612 // Synthesize a fake reloc just in case. We don't have a symbol so
11613 // we use 0.
11614 unsigned char reloc_buffer[elfcpp::Elf_sizes<32>::rel_size];
11615 memset(reloc_buffer, 0, sizeof(reloc_buffer));
11616 elfcpp::Rel_write<32, big_endian> reloc_write(reloc_buffer);
11617 reloc_write.put_r_offset(reloc_offset);
11618 reloc_write.put_r_info(elfcpp::elf_r_info<32>(0, r_type));
11619 elfcpp::Rel<32, big_endian> rel(reloc_buffer);
11620
11621 relocate.relocate(relinfo, this, output_section,
11622 this->fake_relnum_for_stubs, rel, r_type,
11623 NULL, &symval, view + reloc_offset,
11624 address + reloc_offset, reloc_size);
11625 }
11626}
11627
a0351a69
DK
11628// Determine whether an object attribute tag takes an integer, a
11629// string or both.
11630
11631template<bool big_endian>
11632int
11633Target_arm<big_endian>::do_attribute_arg_type(int tag) const
11634{
11635 if (tag == Object_attribute::Tag_compatibility)
11636 return (Object_attribute::ATTR_TYPE_FLAG_INT_VAL
11637 | Object_attribute::ATTR_TYPE_FLAG_STR_VAL);
11638 else if (tag == elfcpp::Tag_nodefaults)
11639 return (Object_attribute::ATTR_TYPE_FLAG_INT_VAL
11640 | Object_attribute::ATTR_TYPE_FLAG_NO_DEFAULT);
11641 else if (tag == elfcpp::Tag_CPU_raw_name || tag == elfcpp::Tag_CPU_name)
11642 return Object_attribute::ATTR_TYPE_FLAG_STR_VAL;
11643 else if (tag < 32)
11644 return Object_attribute::ATTR_TYPE_FLAG_INT_VAL;
11645 else
11646 return ((tag & 1) != 0
11647 ? Object_attribute::ATTR_TYPE_FLAG_STR_VAL
11648 : Object_attribute::ATTR_TYPE_FLAG_INT_VAL);
11649}
11650
11651// Reorder attributes.
11652//
11653// The ABI defines that Tag_conformance should be emitted first, and that
11654// Tag_nodefaults should be second (if either is defined). This sets those
11655// two positions, and bumps up the position of all the remaining tags to
11656// compensate.
11657
11658template<bool big_endian>
11659int
11660Target_arm<big_endian>::do_attributes_order(int num) const
11661{
11662 // Reorder the known object attributes in output. We want to move
11663 // Tag_conformance to position 4 and Tag_conformance to position 5
9b547ce6 11664 // and shift everything between 4 .. Tag_conformance - 1 to make room.
a0351a69
DK
11665 if (num == 4)
11666 return elfcpp::Tag_conformance;
11667 if (num == 5)
11668 return elfcpp::Tag_nodefaults;
11669 if ((num - 2) < elfcpp::Tag_nodefaults)
11670 return num - 2;
11671 if ((num - 1) < elfcpp::Tag_conformance)
11672 return num - 1;
11673 return num;
11674}
4a657b0d 11675
44272192
DK
11676// Scan a span of THUMB code for Cortex-A8 erratum.
11677
11678template<bool big_endian>
11679void
11680Target_arm<big_endian>::scan_span_for_cortex_a8_erratum(
11681 Arm_relobj<big_endian>* arm_relobj,
11682 unsigned int shndx,
11683 section_size_type span_start,
11684 section_size_type span_end,
11685 const unsigned char* view,
11686 Arm_address address)
11687{
11688 // Scan for 32-bit Thumb-2 branches which span two 4K regions, where:
11689 //
11690 // The opcode is BLX.W, BL.W, B.W, Bcc.W
11691 // The branch target is in the same 4KB region as the
11692 // first half of the branch.
11693 // The instruction before the branch is a 32-bit
11694 // length non-branch instruction.
11695 section_size_type i = span_start;
11696 bool last_was_32bit = false;
11697 bool last_was_branch = false;
11698 while (i < span_end)
11699 {
11700 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
11701 const Valtype* wv = reinterpret_cast<const Valtype*>(view + i);
11702 uint32_t insn = elfcpp::Swap<16, big_endian>::readval(wv);
11703 bool is_blx = false, is_b = false;
11704 bool is_bl = false, is_bcc = false;
11705
11706 bool insn_32bit = (insn & 0xe000) == 0xe000 && (insn & 0x1800) != 0x0000;
11707 if (insn_32bit)
11708 {
11709 // Load the rest of the insn (in manual-friendly order).
11710 insn = (insn << 16) | elfcpp::Swap<16, big_endian>::readval(wv + 1);
11711
11712 // Encoding T4: B<c>.W.
11713 is_b = (insn & 0xf800d000U) == 0xf0009000U;
11714 // Encoding T1: BL<c>.W.
11715 is_bl = (insn & 0xf800d000U) == 0xf000d000U;
11716 // Encoding T2: BLX<c>.W.
11717 is_blx = (insn & 0xf800d000U) == 0xf000c000U;
11718 // Encoding T3: B<c>.W (not permitted in IT block).
11719 is_bcc = ((insn & 0xf800d000U) == 0xf0008000U
11720 && (insn & 0x07f00000U) != 0x03800000U);
11721 }
11722
11723 bool is_32bit_branch = is_b || is_bl || is_blx || is_bcc;
11724
11725 // If this instruction is a 32-bit THUMB branch that crosses a 4K
11726 // page boundary and it follows 32-bit non-branch instruction,
11727 // we need to work around.
11728 if (is_32bit_branch
11729 && ((address + i) & 0xfffU) == 0xffeU
11730 && last_was_32bit
11731 && !last_was_branch)
11732 {
11733 // Check to see if there is a relocation stub for this branch.
11734 bool force_target_arm = false;
11735 bool force_target_thumb = false;
11736 const Cortex_a8_reloc* cortex_a8_reloc = NULL;
11737 Cortex_a8_relocs_info::const_iterator p =
11738 this->cortex_a8_relocs_info_.find(address + i);
11739
11740 if (p != this->cortex_a8_relocs_info_.end())
11741 {
11742 cortex_a8_reloc = p->second;
11743 bool target_is_thumb = (cortex_a8_reloc->destination() & 1) != 0;
11744
11745 if (cortex_a8_reloc->r_type() == elfcpp::R_ARM_THM_CALL
11746 && !target_is_thumb)
11747 force_target_arm = true;
11748 else if (cortex_a8_reloc->r_type() == elfcpp::R_ARM_THM_CALL
11749 && target_is_thumb)
11750 force_target_thumb = true;
11751 }
11752
11753 off_t offset;
11754 Stub_type stub_type = arm_stub_none;
11755
11756 // Check if we have an offending branch instruction.
11757 uint16_t upper_insn = (insn >> 16) & 0xffffU;
11758 uint16_t lower_insn = insn & 0xffffU;
11759 typedef struct Arm_relocate_functions<big_endian> RelocFuncs;
11760
11761 if (cortex_a8_reloc != NULL
11762 && cortex_a8_reloc->reloc_stub() != NULL)
11763 // We've already made a stub for this instruction, e.g.
11764 // it's a long branch or a Thumb->ARM stub. Assume that
11765 // stub will suffice to work around the A8 erratum (see
11766 // setting of always_after_branch above).
11767 ;
11768 else if (is_bcc)
11769 {
11770 offset = RelocFuncs::thumb32_cond_branch_offset(upper_insn,
11771 lower_insn);
11772 stub_type = arm_stub_a8_veneer_b_cond;
11773 }
11774 else if (is_b || is_bl || is_blx)
11775 {
11776 offset = RelocFuncs::thumb32_branch_offset(upper_insn,
11777 lower_insn);
11778 if (is_blx)
11779 offset &= ~3;
11780
11781 stub_type = (is_blx
11782 ? arm_stub_a8_veneer_blx
11783 : (is_bl
11784 ? arm_stub_a8_veneer_bl
11785 : arm_stub_a8_veneer_b));
11786 }
11787
11788 if (stub_type != arm_stub_none)
11789 {
11790 Arm_address pc_for_insn = address + i + 4;
11791
11792 // The original instruction is a BL, but the target is
11793 // an ARM instruction. If we were not making a stub,
11794 // the BL would have been converted to a BLX. Use the
11795 // BLX stub instead in that case.
11796 if (this->may_use_blx() && force_target_arm
11797 && stub_type == arm_stub_a8_veneer_bl)
11798 {
11799 stub_type = arm_stub_a8_veneer_blx;
11800 is_blx = true;
11801 is_bl = false;
11802 }
11803 // Conversely, if the original instruction was
11804 // BLX but the target is Thumb mode, use the BL stub.
11805 else if (force_target_thumb
11806 && stub_type == arm_stub_a8_veneer_blx)
11807 {
11808 stub_type = arm_stub_a8_veneer_bl;
11809 is_blx = false;
11810 is_bl = true;
11811 }
11812
11813 if (is_blx)
11814 pc_for_insn &= ~3;
11815
11816 // If we found a relocation, use the proper destination,
11817 // not the offset in the (unrelocated) instruction.
11818 // Note this is always done if we switched the stub type above.
11819 if (cortex_a8_reloc != NULL)
11820 offset = (off_t) (cortex_a8_reloc->destination() - pc_for_insn);
11821
11822 Arm_address target = (pc_for_insn + offset) | (is_blx ? 0 : 1);
11823
11824 // Add a new stub if destination address in in the same page.
11825 if (((address + i) & ~0xfffU) == (target & ~0xfffU))
11826 {
11827 Cortex_a8_stub* stub =
11828 this->stub_factory_.make_cortex_a8_stub(stub_type,
11829 arm_relobj, shndx,
11830 address + i,
11831 target, insn);
11832 Stub_table<big_endian>* stub_table =
11833 arm_relobj->stub_table(shndx);
11834 gold_assert(stub_table != NULL);
11835 stub_table->add_cortex_a8_stub(address + i, stub);
11836 }
11837 }
11838 }
11839
11840 i += insn_32bit ? 4 : 2;
11841 last_was_32bit = insn_32bit;
11842 last_was_branch = is_32bit_branch;
11843 }
11844}
11845
41263c05
DK
11846// Apply the Cortex-A8 workaround.
11847
11848template<bool big_endian>
11849void
11850Target_arm<big_endian>::apply_cortex_a8_workaround(
11851 const Cortex_a8_stub* stub,
11852 Arm_address stub_address,
11853 unsigned char* insn_view,
11854 Arm_address insn_address)
11855{
11856 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
11857 Valtype* wv = reinterpret_cast<Valtype*>(insn_view);
11858 Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
11859 Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
11860 off_t branch_offset = stub_address - (insn_address + 4);
11861
11862 typedef struct Arm_relocate_functions<big_endian> RelocFuncs;
11863 switch (stub->stub_template()->type())
11864 {
11865 case arm_stub_a8_veneer_b_cond:
9b547ce6 11866 // For a conditional branch, we re-write it to be an unconditional
0439c796
DK
11867 // branch to the stub. We use the THUMB-2 encoding here.
11868 upper_insn = 0xf000U;
11869 lower_insn = 0xb800U;
11870 // Fall through
41263c05
DK
11871 case arm_stub_a8_veneer_b:
11872 case arm_stub_a8_veneer_bl:
11873 case arm_stub_a8_veneer_blx:
11874 if ((lower_insn & 0x5000U) == 0x4000U)
11875 // For a BLX instruction, make sure that the relocation is
11876 // rounded up to a word boundary. This follows the semantics of
11877 // the instruction which specifies that bit 1 of the target
11878 // address will come from bit 1 of the base address.
11879 branch_offset = (branch_offset + 2) & ~3;
11880
11881 // Put BRANCH_OFFSET back into the insn.
11882 gold_assert(!utils::has_overflow<25>(branch_offset));
11883 upper_insn = RelocFuncs::thumb32_branch_upper(upper_insn, branch_offset);
11884 lower_insn = RelocFuncs::thumb32_branch_lower(lower_insn, branch_offset);
11885 break;
11886
11887 default:
11888 gold_unreachable();
11889 }
11890
11891 // Put the relocated value back in the object file:
11892 elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
11893 elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
11894}
11895
4a657b0d
DK
11896template<bool big_endian>
11897class Target_selector_arm : public Target_selector
11898{
11899 public:
11900 Target_selector_arm()
11901 : Target_selector(elfcpp::EM_ARM, 32, big_endian,
11902 (big_endian ? "elf32-bigarm" : "elf32-littlearm"))
11903 { }
11904
11905 Target*
11906 do_instantiate_target()
11907 { return new Target_arm<big_endian>(); }
11908};
11909
2b328d4e
DK
11910// Fix .ARM.exidx section coverage.
11911
11912template<bool big_endian>
11913void
11914Target_arm<big_endian>::fix_exidx_coverage(
11915 Layout* layout,
131687b4 11916 const Input_objects* input_objects,
2b328d4e 11917 Arm_output_section<big_endian>* exidx_section,
f625ae50
DK
11918 Symbol_table* symtab,
11919 const Task* task)
2b328d4e
DK
11920{
11921 // We need to look at all the input sections in output in ascending
11922 // order of of output address. We do that by building a sorted list
11923 // of output sections by addresses. Then we looks at the output sections
11924 // in order. The input sections in an output section are already sorted
11925 // by addresses within the output section.
11926
11927 typedef std::set<Output_section*, output_section_address_less_than>
11928 Sorted_output_section_list;
11929 Sorted_output_section_list sorted_output_sections;
131687b4
DK
11930
11931 // Find out all the output sections of input sections pointed by
11932 // EXIDX input sections.
11933 for (Input_objects::Relobj_iterator p = input_objects->relobj_begin();
11934 p != input_objects->relobj_end();
2b328d4e
DK
11935 ++p)
11936 {
131687b4
DK
11937 Arm_relobj<big_endian>* arm_relobj =
11938 Arm_relobj<big_endian>::as_arm_relobj(*p);
11939 std::vector<unsigned int> shndx_list;
11940 arm_relobj->get_exidx_shndx_list(&shndx_list);
11941 for (size_t i = 0; i < shndx_list.size(); ++i)
11942 {
11943 const Arm_exidx_input_section* exidx_input_section =
11944 arm_relobj->exidx_input_section_by_shndx(shndx_list[i]);
11945 gold_assert(exidx_input_section != NULL);
11946 if (!exidx_input_section->has_errors())
11947 {
11948 unsigned int text_shndx = exidx_input_section->link();
ca09d69a 11949 Output_section* os = arm_relobj->output_section(text_shndx);
131687b4
DK
11950 if (os != NULL && (os->flags() & elfcpp::SHF_ALLOC) != 0)
11951 sorted_output_sections.insert(os);
11952 }
11953 }
2b328d4e
DK
11954 }
11955
11956 // Go over the output sections in ascending order of output addresses.
11957 typedef typename Arm_output_section<big_endian>::Text_section_list
11958 Text_section_list;
11959 Text_section_list sorted_text_sections;
f625ae50 11960 for (typename Sorted_output_section_list::iterator p =
2b328d4e
DK
11961 sorted_output_sections.begin();
11962 p != sorted_output_sections.end();
11963 ++p)
11964 {
11965 Arm_output_section<big_endian>* arm_output_section =
11966 Arm_output_section<big_endian>::as_arm_output_section(*p);
11967 arm_output_section->append_text_sections_to_list(&sorted_text_sections);
11968 }
11969
85fdf906 11970 exidx_section->fix_exidx_coverage(layout, sorted_text_sections, symtab,
f625ae50 11971 merge_exidx_entries(), task);
2b328d4e
DK
11972}
11973
4a657b0d
DK
11974Target_selector_arm<false> target_selector_arm;
11975Target_selector_arm<true> target_selector_armbe;
11976
11977} // End anonymous namespace.
This page took 0.793966 seconds and 4 git commands to generate.