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