Make bfd.link_next field a union
[deliverable/binutils-gdb.git] / bfd / elf32-avr.c
1 /* AVR-specific support for 32-bit ELF
2 Copyright (C) 1999-2014 Free Software Foundation, Inc.
3 Contributed by Denis Chertykov <denisc@overta.ru>
4
5 This file is part of BFD, the Binary File Descriptor library.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor,
20 Boston, MA 02110-1301, USA. */
21
22 #include "sysdep.h"
23 #include "bfd.h"
24 #include "libbfd.h"
25 #include "elf-bfd.h"
26 #include "elf/avr.h"
27 #include "elf32-avr.h"
28
29 /* Enable debugging printout at stdout with this variable. */
30 static bfd_boolean debug_relax = FALSE;
31
32 /* Enable debugging printout at stdout with this variable. */
33 static bfd_boolean debug_stubs = FALSE;
34
35 static bfd_reloc_status_type
36 bfd_elf_avr_diff_reloc (bfd *abfd,
37 arelent *reloc_entry,
38 asymbol *symbol,
39 void *data,
40 asection *input_section,
41 bfd *output_bfd,
42 char **error_message);
43
44 /* Hash table initialization and handling. Code is taken from the hppa port
45 and adapted to the needs of AVR. */
46
47 /* We use two hash tables to hold information for linking avr objects.
48
49 The first is the elf32_avr_link_hash_table which is derived from the
50 stanard ELF linker hash table. We use this as a place to attach the other
51 hash table and some static information.
52
53 The second is the stub hash table which is derived from the base BFD
54 hash table. The stub hash table holds the information on the linker
55 stubs. */
56
57 struct elf32_avr_stub_hash_entry
58 {
59 /* Base hash table entry structure. */
60 struct bfd_hash_entry bh_root;
61
62 /* Offset within stub_sec of the beginning of this stub. */
63 bfd_vma stub_offset;
64
65 /* Given the symbol's value and its section we can determine its final
66 value when building the stubs (so the stub knows where to jump). */
67 bfd_vma target_value;
68
69 /* This way we could mark stubs to be no longer necessary. */
70 bfd_boolean is_actually_needed;
71 };
72
73 struct elf32_avr_link_hash_table
74 {
75 /* The main hash table. */
76 struct elf_link_hash_table etab;
77
78 /* The stub hash table. */
79 struct bfd_hash_table bstab;
80
81 bfd_boolean no_stubs;
82
83 /* Linker stub bfd. */
84 bfd *stub_bfd;
85
86 /* The stub section. */
87 asection *stub_sec;
88
89 /* Usually 0, unless we are generating code for a bootloader. Will
90 be initialized by elf32_avr_size_stubs to the vma offset of the
91 output section associated with the stub section. */
92 bfd_vma vector_base;
93
94 /* Assorted information used by elf32_avr_size_stubs. */
95 unsigned int bfd_count;
96 int top_index;
97 asection ** input_list;
98 Elf_Internal_Sym ** all_local_syms;
99
100 /* Tables for mapping vma beyond the 128k boundary to the address of the
101 corresponding stub. (AMT)
102 "amt_max_entry_cnt" reflects the number of entries that memory is allocated
103 for in the "amt_stub_offsets" and "amt_destination_addr" arrays.
104 "amt_entry_cnt" informs how many of these entries actually contain
105 useful data. */
106 unsigned int amt_entry_cnt;
107 unsigned int amt_max_entry_cnt;
108 bfd_vma * amt_stub_offsets;
109 bfd_vma * amt_destination_addr;
110 };
111
112 /* Various hash macros and functions. */
113 #define avr_link_hash_table(p) \
114 /* PR 3874: Check that we have an AVR style hash table before using it. */\
115 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
116 == AVR_ELF_DATA ? ((struct elf32_avr_link_hash_table *) ((p)->hash)) : NULL)
117
118 #define avr_stub_hash_entry(ent) \
119 ((struct elf32_avr_stub_hash_entry *)(ent))
120
121 #define avr_stub_hash_lookup(table, string, create, copy) \
122 ((struct elf32_avr_stub_hash_entry *) \
123 bfd_hash_lookup ((table), (string), (create), (copy)))
124
125 static reloc_howto_type elf_avr_howto_table[] =
126 {
127 HOWTO (R_AVR_NONE, /* type */
128 0, /* rightshift */
129 2, /* size (0 = byte, 1 = short, 2 = long) */
130 32, /* bitsize */
131 FALSE, /* pc_relative */
132 0, /* bitpos */
133 complain_overflow_bitfield, /* complain_on_overflow */
134 bfd_elf_generic_reloc, /* special_function */
135 "R_AVR_NONE", /* name */
136 FALSE, /* partial_inplace */
137 0, /* src_mask */
138 0, /* dst_mask */
139 FALSE), /* pcrel_offset */
140
141 HOWTO (R_AVR_32, /* type */
142 0, /* rightshift */
143 2, /* size (0 = byte, 1 = short, 2 = long) */
144 32, /* bitsize */
145 FALSE, /* pc_relative */
146 0, /* bitpos */
147 complain_overflow_bitfield, /* complain_on_overflow */
148 bfd_elf_generic_reloc, /* special_function */
149 "R_AVR_32", /* name */
150 FALSE, /* partial_inplace */
151 0xffffffff, /* src_mask */
152 0xffffffff, /* dst_mask */
153 FALSE), /* pcrel_offset */
154
155 /* A 7 bit PC relative relocation. */
156 HOWTO (R_AVR_7_PCREL, /* type */
157 1, /* rightshift */
158 1, /* size (0 = byte, 1 = short, 2 = long) */
159 7, /* bitsize */
160 TRUE, /* pc_relative */
161 3, /* bitpos */
162 complain_overflow_bitfield, /* complain_on_overflow */
163 bfd_elf_generic_reloc, /* special_function */
164 "R_AVR_7_PCREL", /* name */
165 FALSE, /* partial_inplace */
166 0xffff, /* src_mask */
167 0xffff, /* dst_mask */
168 TRUE), /* pcrel_offset */
169
170 /* A 13 bit PC relative relocation. */
171 HOWTO (R_AVR_13_PCREL, /* type */
172 1, /* rightshift */
173 1, /* size (0 = byte, 1 = short, 2 = long) */
174 13, /* bitsize */
175 TRUE, /* pc_relative */
176 0, /* bitpos */
177 complain_overflow_bitfield, /* complain_on_overflow */
178 bfd_elf_generic_reloc, /* special_function */
179 "R_AVR_13_PCREL", /* name */
180 FALSE, /* partial_inplace */
181 0xfff, /* src_mask */
182 0xfff, /* dst_mask */
183 TRUE), /* pcrel_offset */
184
185 /* A 16 bit absolute relocation. */
186 HOWTO (R_AVR_16, /* type */
187 0, /* rightshift */
188 1, /* size (0 = byte, 1 = short, 2 = long) */
189 16, /* bitsize */
190 FALSE, /* pc_relative */
191 0, /* bitpos */
192 complain_overflow_dont, /* complain_on_overflow */
193 bfd_elf_generic_reloc, /* special_function */
194 "R_AVR_16", /* name */
195 FALSE, /* partial_inplace */
196 0xffff, /* src_mask */
197 0xffff, /* dst_mask */
198 FALSE), /* pcrel_offset */
199
200 /* A 16 bit absolute relocation for command address
201 Will be changed when linker stubs are needed. */
202 HOWTO (R_AVR_16_PM, /* type */
203 1, /* rightshift */
204 1, /* size (0 = byte, 1 = short, 2 = long) */
205 16, /* bitsize */
206 FALSE, /* pc_relative */
207 0, /* bitpos */
208 complain_overflow_bitfield, /* complain_on_overflow */
209 bfd_elf_generic_reloc, /* special_function */
210 "R_AVR_16_PM", /* name */
211 FALSE, /* partial_inplace */
212 0xffff, /* src_mask */
213 0xffff, /* dst_mask */
214 FALSE), /* pcrel_offset */
215 /* A low 8 bit absolute relocation of 16 bit address.
216 For LDI command. */
217 HOWTO (R_AVR_LO8_LDI, /* type */
218 0, /* rightshift */
219 1, /* size (0 = byte, 1 = short, 2 = long) */
220 8, /* bitsize */
221 FALSE, /* pc_relative */
222 0, /* bitpos */
223 complain_overflow_dont, /* complain_on_overflow */
224 bfd_elf_generic_reloc, /* special_function */
225 "R_AVR_LO8_LDI", /* name */
226 FALSE, /* partial_inplace */
227 0xffff, /* src_mask */
228 0xffff, /* dst_mask */
229 FALSE), /* pcrel_offset */
230 /* A high 8 bit absolute relocation of 16 bit address.
231 For LDI command. */
232 HOWTO (R_AVR_HI8_LDI, /* type */
233 8, /* rightshift */
234 1, /* size (0 = byte, 1 = short, 2 = long) */
235 8, /* bitsize */
236 FALSE, /* pc_relative */
237 0, /* bitpos */
238 complain_overflow_dont, /* complain_on_overflow */
239 bfd_elf_generic_reloc, /* special_function */
240 "R_AVR_HI8_LDI", /* name */
241 FALSE, /* partial_inplace */
242 0xffff, /* src_mask */
243 0xffff, /* dst_mask */
244 FALSE), /* pcrel_offset */
245 /* A high 6 bit absolute relocation of 22 bit address.
246 For LDI command. As well second most significant 8 bit value of
247 a 32 bit link-time constant. */
248 HOWTO (R_AVR_HH8_LDI, /* type */
249 16, /* rightshift */
250 1, /* size (0 = byte, 1 = short, 2 = long) */
251 8, /* bitsize */
252 FALSE, /* pc_relative */
253 0, /* bitpos */
254 complain_overflow_dont, /* complain_on_overflow */
255 bfd_elf_generic_reloc, /* special_function */
256 "R_AVR_HH8_LDI", /* name */
257 FALSE, /* partial_inplace */
258 0xffff, /* src_mask */
259 0xffff, /* dst_mask */
260 FALSE), /* pcrel_offset */
261 /* A negative low 8 bit absolute relocation of 16 bit address.
262 For LDI command. */
263 HOWTO (R_AVR_LO8_LDI_NEG, /* type */
264 0, /* rightshift */
265 1, /* size (0 = byte, 1 = short, 2 = long) */
266 8, /* bitsize */
267 FALSE, /* pc_relative */
268 0, /* bitpos */
269 complain_overflow_dont, /* complain_on_overflow */
270 bfd_elf_generic_reloc, /* special_function */
271 "R_AVR_LO8_LDI_NEG", /* name */
272 FALSE, /* partial_inplace */
273 0xffff, /* src_mask */
274 0xffff, /* dst_mask */
275 FALSE), /* pcrel_offset */
276 /* A negative high 8 bit absolute relocation of 16 bit address.
277 For LDI command. */
278 HOWTO (R_AVR_HI8_LDI_NEG, /* type */
279 8, /* rightshift */
280 1, /* size (0 = byte, 1 = short, 2 = long) */
281 8, /* bitsize */
282 FALSE, /* pc_relative */
283 0, /* bitpos */
284 complain_overflow_dont, /* complain_on_overflow */
285 bfd_elf_generic_reloc, /* special_function */
286 "R_AVR_HI8_LDI_NEG", /* name */
287 FALSE, /* partial_inplace */
288 0xffff, /* src_mask */
289 0xffff, /* dst_mask */
290 FALSE), /* pcrel_offset */
291 /* A negative high 6 bit absolute relocation of 22 bit address.
292 For LDI command. */
293 HOWTO (R_AVR_HH8_LDI_NEG, /* type */
294 16, /* rightshift */
295 1, /* size (0 = byte, 1 = short, 2 = long) */
296 8, /* bitsize */
297 FALSE, /* pc_relative */
298 0, /* bitpos */
299 complain_overflow_dont, /* complain_on_overflow */
300 bfd_elf_generic_reloc, /* special_function */
301 "R_AVR_HH8_LDI_NEG", /* name */
302 FALSE, /* partial_inplace */
303 0xffff, /* src_mask */
304 0xffff, /* dst_mask */
305 FALSE), /* pcrel_offset */
306 /* A low 8 bit absolute relocation of 24 bit program memory address.
307 For LDI command. Will not be changed when linker stubs are needed. */
308 HOWTO (R_AVR_LO8_LDI_PM, /* type */
309 1, /* rightshift */
310 1, /* size (0 = byte, 1 = short, 2 = long) */
311 8, /* bitsize */
312 FALSE, /* pc_relative */
313 0, /* bitpos */
314 complain_overflow_dont, /* complain_on_overflow */
315 bfd_elf_generic_reloc, /* special_function */
316 "R_AVR_LO8_LDI_PM", /* name */
317 FALSE, /* partial_inplace */
318 0xffff, /* src_mask */
319 0xffff, /* dst_mask */
320 FALSE), /* pcrel_offset */
321 /* A low 8 bit absolute relocation of 24 bit program memory address.
322 For LDI command. Will not be changed when linker stubs are needed. */
323 HOWTO (R_AVR_HI8_LDI_PM, /* type */
324 9, /* rightshift */
325 1, /* size (0 = byte, 1 = short, 2 = long) */
326 8, /* bitsize */
327 FALSE, /* pc_relative */
328 0, /* bitpos */
329 complain_overflow_dont, /* complain_on_overflow */
330 bfd_elf_generic_reloc, /* special_function */
331 "R_AVR_HI8_LDI_PM", /* name */
332 FALSE, /* partial_inplace */
333 0xffff, /* src_mask */
334 0xffff, /* dst_mask */
335 FALSE), /* pcrel_offset */
336 /* A low 8 bit absolute relocation of 24 bit program memory address.
337 For LDI command. Will not be changed when linker stubs are needed. */
338 HOWTO (R_AVR_HH8_LDI_PM, /* type */
339 17, /* rightshift */
340 1, /* size (0 = byte, 1 = short, 2 = long) */
341 8, /* bitsize */
342 FALSE, /* pc_relative */
343 0, /* bitpos */
344 complain_overflow_dont, /* complain_on_overflow */
345 bfd_elf_generic_reloc, /* special_function */
346 "R_AVR_HH8_LDI_PM", /* name */
347 FALSE, /* partial_inplace */
348 0xffff, /* src_mask */
349 0xffff, /* dst_mask */
350 FALSE), /* pcrel_offset */
351 /* A low 8 bit absolute relocation of 24 bit program memory address.
352 For LDI command. Will not be changed when linker stubs are needed. */
353 HOWTO (R_AVR_LO8_LDI_PM_NEG, /* type */
354 1, /* rightshift */
355 1, /* size (0 = byte, 1 = short, 2 = long) */
356 8, /* bitsize */
357 FALSE, /* pc_relative */
358 0, /* bitpos */
359 complain_overflow_dont, /* complain_on_overflow */
360 bfd_elf_generic_reloc, /* special_function */
361 "R_AVR_LO8_LDI_PM_NEG", /* name */
362 FALSE, /* partial_inplace */
363 0xffff, /* src_mask */
364 0xffff, /* dst_mask */
365 FALSE), /* pcrel_offset */
366 /* A low 8 bit absolute relocation of 24 bit program memory address.
367 For LDI command. Will not be changed when linker stubs are needed. */
368 HOWTO (R_AVR_HI8_LDI_PM_NEG, /* type */
369 9, /* rightshift */
370 1, /* size (0 = byte, 1 = short, 2 = long) */
371 8, /* bitsize */
372 FALSE, /* pc_relative */
373 0, /* bitpos */
374 complain_overflow_dont, /* complain_on_overflow */
375 bfd_elf_generic_reloc, /* special_function */
376 "R_AVR_HI8_LDI_PM_NEG", /* name */
377 FALSE, /* partial_inplace */
378 0xffff, /* src_mask */
379 0xffff, /* dst_mask */
380 FALSE), /* pcrel_offset */
381 /* A low 8 bit absolute relocation of 24 bit program memory address.
382 For LDI command. Will not be changed when linker stubs are needed. */
383 HOWTO (R_AVR_HH8_LDI_PM_NEG, /* type */
384 17, /* rightshift */
385 1, /* size (0 = byte, 1 = short, 2 = long) */
386 8, /* bitsize */
387 FALSE, /* pc_relative */
388 0, /* bitpos */
389 complain_overflow_dont, /* complain_on_overflow */
390 bfd_elf_generic_reloc, /* special_function */
391 "R_AVR_HH8_LDI_PM_NEG", /* name */
392 FALSE, /* partial_inplace */
393 0xffff, /* src_mask */
394 0xffff, /* dst_mask */
395 FALSE), /* pcrel_offset */
396 /* Relocation for CALL command in ATmega. */
397 HOWTO (R_AVR_CALL, /* type */
398 1, /* rightshift */
399 2, /* size (0 = byte, 1 = short, 2 = long) */
400 23, /* bitsize */
401 FALSE, /* pc_relative */
402 0, /* bitpos */
403 complain_overflow_dont,/* complain_on_overflow */
404 bfd_elf_generic_reloc, /* special_function */
405 "R_AVR_CALL", /* name */
406 FALSE, /* partial_inplace */
407 0xffffffff, /* src_mask */
408 0xffffffff, /* dst_mask */
409 FALSE), /* pcrel_offset */
410 /* A 16 bit absolute relocation of 16 bit address.
411 For LDI command. */
412 HOWTO (R_AVR_LDI, /* type */
413 0, /* rightshift */
414 1, /* size (0 = byte, 1 = short, 2 = long) */
415 16, /* bitsize */
416 FALSE, /* pc_relative */
417 0, /* bitpos */
418 complain_overflow_dont,/* complain_on_overflow */
419 bfd_elf_generic_reloc, /* special_function */
420 "R_AVR_LDI", /* name */
421 FALSE, /* partial_inplace */
422 0xffff, /* src_mask */
423 0xffff, /* dst_mask */
424 FALSE), /* pcrel_offset */
425 /* A 6 bit absolute relocation of 6 bit offset.
426 For ldd/sdd command. */
427 HOWTO (R_AVR_6, /* type */
428 0, /* rightshift */
429 0, /* size (0 = byte, 1 = short, 2 = long) */
430 6, /* bitsize */
431 FALSE, /* pc_relative */
432 0, /* bitpos */
433 complain_overflow_dont,/* complain_on_overflow */
434 bfd_elf_generic_reloc, /* special_function */
435 "R_AVR_6", /* name */
436 FALSE, /* partial_inplace */
437 0xffff, /* src_mask */
438 0xffff, /* dst_mask */
439 FALSE), /* pcrel_offset */
440 /* A 6 bit absolute relocation of 6 bit offset.
441 For sbiw/adiw command. */
442 HOWTO (R_AVR_6_ADIW, /* type */
443 0, /* rightshift */
444 0, /* size (0 = byte, 1 = short, 2 = long) */
445 6, /* bitsize */
446 FALSE, /* pc_relative */
447 0, /* bitpos */
448 complain_overflow_dont,/* complain_on_overflow */
449 bfd_elf_generic_reloc, /* special_function */
450 "R_AVR_6_ADIW", /* name */
451 FALSE, /* partial_inplace */
452 0xffff, /* src_mask */
453 0xffff, /* dst_mask */
454 FALSE), /* pcrel_offset */
455 /* Most significant 8 bit value of a 32 bit link-time constant. */
456 HOWTO (R_AVR_MS8_LDI, /* type */
457 24, /* rightshift */
458 1, /* size (0 = byte, 1 = short, 2 = long) */
459 8, /* bitsize */
460 FALSE, /* pc_relative */
461 0, /* bitpos */
462 complain_overflow_dont, /* complain_on_overflow */
463 bfd_elf_generic_reloc, /* special_function */
464 "R_AVR_MS8_LDI", /* name */
465 FALSE, /* partial_inplace */
466 0xffff, /* src_mask */
467 0xffff, /* dst_mask */
468 FALSE), /* pcrel_offset */
469 /* Negative most significant 8 bit value of a 32 bit link-time constant. */
470 HOWTO (R_AVR_MS8_LDI_NEG, /* type */
471 24, /* rightshift */
472 1, /* size (0 = byte, 1 = short, 2 = long) */
473 8, /* bitsize */
474 FALSE, /* pc_relative */
475 0, /* bitpos */
476 complain_overflow_dont, /* complain_on_overflow */
477 bfd_elf_generic_reloc, /* special_function */
478 "R_AVR_MS8_LDI_NEG", /* name */
479 FALSE, /* partial_inplace */
480 0xffff, /* src_mask */
481 0xffff, /* dst_mask */
482 FALSE), /* pcrel_offset */
483 /* A low 8 bit absolute relocation of 24 bit program memory address.
484 For LDI command. Will be changed when linker stubs are needed. */
485 HOWTO (R_AVR_LO8_LDI_GS, /* type */
486 1, /* rightshift */
487 1, /* size (0 = byte, 1 = short, 2 = long) */
488 8, /* bitsize */
489 FALSE, /* pc_relative */
490 0, /* bitpos */
491 complain_overflow_dont, /* complain_on_overflow */
492 bfd_elf_generic_reloc, /* special_function */
493 "R_AVR_LO8_LDI_GS", /* name */
494 FALSE, /* partial_inplace */
495 0xffff, /* src_mask */
496 0xffff, /* dst_mask */
497 FALSE), /* pcrel_offset */
498 /* A low 8 bit absolute relocation of 24 bit program memory address.
499 For LDI command. Will be changed when linker stubs are needed. */
500 HOWTO (R_AVR_HI8_LDI_GS, /* type */
501 9, /* rightshift */
502 1, /* size (0 = byte, 1 = short, 2 = long) */
503 8, /* bitsize */
504 FALSE, /* pc_relative */
505 0, /* bitpos */
506 complain_overflow_dont, /* complain_on_overflow */
507 bfd_elf_generic_reloc, /* special_function */
508 "R_AVR_HI8_LDI_GS", /* name */
509 FALSE, /* partial_inplace */
510 0xffff, /* src_mask */
511 0xffff, /* dst_mask */
512 FALSE), /* pcrel_offset */
513 /* 8 bit offset. */
514 HOWTO (R_AVR_8, /* type */
515 0, /* rightshift */
516 0, /* size (0 = byte, 1 = short, 2 = long) */
517 8, /* bitsize */
518 FALSE, /* pc_relative */
519 0, /* bitpos */
520 complain_overflow_bitfield,/* complain_on_overflow */
521 bfd_elf_generic_reloc, /* special_function */
522 "R_AVR_8", /* name */
523 FALSE, /* partial_inplace */
524 0x000000ff, /* src_mask */
525 0x000000ff, /* dst_mask */
526 FALSE), /* pcrel_offset */
527 /* lo8-part to use in .byte lo8(sym). */
528 HOWTO (R_AVR_8_LO8, /* type */
529 0, /* rightshift */
530 0, /* size (0 = byte, 1 = short, 2 = long) */
531 8, /* bitsize */
532 FALSE, /* pc_relative */
533 0, /* bitpos */
534 complain_overflow_dont,/* complain_on_overflow */
535 bfd_elf_generic_reloc, /* special_function */
536 "R_AVR_8_LO8", /* name */
537 FALSE, /* partial_inplace */
538 0xffffff, /* src_mask */
539 0xffffff, /* dst_mask */
540 FALSE), /* pcrel_offset */
541 /* hi8-part to use in .byte hi8(sym). */
542 HOWTO (R_AVR_8_HI8, /* type */
543 8, /* rightshift */
544 0, /* size (0 = byte, 1 = short, 2 = long) */
545 8, /* bitsize */
546 FALSE, /* pc_relative */
547 0, /* bitpos */
548 complain_overflow_dont,/* complain_on_overflow */
549 bfd_elf_generic_reloc, /* special_function */
550 "R_AVR_8_HI8", /* name */
551 FALSE, /* partial_inplace */
552 0xffffff, /* src_mask */
553 0xffffff, /* dst_mask */
554 FALSE), /* pcrel_offset */
555 /* hlo8-part to use in .byte hlo8(sym). */
556 HOWTO (R_AVR_8_HLO8, /* type */
557 16, /* rightshift */
558 0, /* size (0 = byte, 1 = short, 2 = long) */
559 8, /* bitsize */
560 FALSE, /* pc_relative */
561 0, /* bitpos */
562 complain_overflow_dont,/* complain_on_overflow */
563 bfd_elf_generic_reloc, /* special_function */
564 "R_AVR_8_HLO8", /* name */
565 FALSE, /* partial_inplace */
566 0xffffff, /* src_mask */
567 0xffffff, /* dst_mask */
568 FALSE), /* pcrel_offset */
569 HOWTO (R_AVR_DIFF8, /* type */
570 0, /* rightshift */
571 0, /* size (0 = byte, 1 = short, 2 = long) */
572 8, /* bitsize */
573 FALSE, /* pc_relative */
574 0, /* bitpos */
575 complain_overflow_bitfield, /* complain_on_overflow */
576 bfd_elf_avr_diff_reloc, /* special_function */
577 "R_AVR_DIFF8", /* name */
578 FALSE, /* partial_inplace */
579 0, /* src_mask */
580 0xff, /* dst_mask */
581 FALSE), /* pcrel_offset */
582 HOWTO (R_AVR_DIFF16, /* type */
583 0, /* rightshift */
584 1, /* size (0 = byte, 1 = short, 2 = long) */
585 16, /* bitsize */
586 FALSE, /* pc_relative */
587 0, /* bitpos */
588 complain_overflow_bitfield, /* complain_on_overflow */
589 bfd_elf_avr_diff_reloc, /* special_function */
590 "R_AVR_DIFF16", /* name */
591 FALSE, /* partial_inplace */
592 0, /* src_mask */
593 0xffff, /* dst_mask */
594 FALSE), /* pcrel_offset */
595 HOWTO (R_AVR_DIFF32, /* type */
596 0, /* rightshift */
597 2, /* size (0 = byte, 1 = short, 2 = long) */
598 32, /* bitsize */
599 FALSE, /* pc_relative */
600 0, /* bitpos */
601 complain_overflow_bitfield, /* complain_on_overflow */
602 bfd_elf_avr_diff_reloc, /* special_function */
603 "R_AVR_DIFF32", /* name */
604 FALSE, /* partial_inplace */
605 0, /* src_mask */
606 0xffffffff, /* dst_mask */
607 FALSE) /* pcrel_offset */
608 };
609
610 /* Map BFD reloc types to AVR ELF reloc types. */
611
612 struct avr_reloc_map
613 {
614 bfd_reloc_code_real_type bfd_reloc_val;
615 unsigned int elf_reloc_val;
616 };
617
618 static const struct avr_reloc_map avr_reloc_map[] =
619 {
620 { BFD_RELOC_NONE, R_AVR_NONE },
621 { BFD_RELOC_32, R_AVR_32 },
622 { BFD_RELOC_AVR_7_PCREL, R_AVR_7_PCREL },
623 { BFD_RELOC_AVR_13_PCREL, R_AVR_13_PCREL },
624 { BFD_RELOC_16, R_AVR_16 },
625 { BFD_RELOC_AVR_16_PM, R_AVR_16_PM },
626 { BFD_RELOC_AVR_LO8_LDI, R_AVR_LO8_LDI},
627 { BFD_RELOC_AVR_HI8_LDI, R_AVR_HI8_LDI },
628 { BFD_RELOC_AVR_HH8_LDI, R_AVR_HH8_LDI },
629 { BFD_RELOC_AVR_MS8_LDI, R_AVR_MS8_LDI },
630 { BFD_RELOC_AVR_LO8_LDI_NEG, R_AVR_LO8_LDI_NEG },
631 { BFD_RELOC_AVR_HI8_LDI_NEG, R_AVR_HI8_LDI_NEG },
632 { BFD_RELOC_AVR_HH8_LDI_NEG, R_AVR_HH8_LDI_NEG },
633 { BFD_RELOC_AVR_MS8_LDI_NEG, R_AVR_MS8_LDI_NEG },
634 { BFD_RELOC_AVR_LO8_LDI_PM, R_AVR_LO8_LDI_PM },
635 { BFD_RELOC_AVR_LO8_LDI_GS, R_AVR_LO8_LDI_GS },
636 { BFD_RELOC_AVR_HI8_LDI_PM, R_AVR_HI8_LDI_PM },
637 { BFD_RELOC_AVR_HI8_LDI_GS, R_AVR_HI8_LDI_GS },
638 { BFD_RELOC_AVR_HH8_LDI_PM, R_AVR_HH8_LDI_PM },
639 { BFD_RELOC_AVR_LO8_LDI_PM_NEG, R_AVR_LO8_LDI_PM_NEG },
640 { BFD_RELOC_AVR_HI8_LDI_PM_NEG, R_AVR_HI8_LDI_PM_NEG },
641 { BFD_RELOC_AVR_HH8_LDI_PM_NEG, R_AVR_HH8_LDI_PM_NEG },
642 { BFD_RELOC_AVR_CALL, R_AVR_CALL },
643 { BFD_RELOC_AVR_LDI, R_AVR_LDI },
644 { BFD_RELOC_AVR_6, R_AVR_6 },
645 { BFD_RELOC_AVR_6_ADIW, R_AVR_6_ADIW },
646 { BFD_RELOC_8, R_AVR_8 },
647 { BFD_RELOC_AVR_8_LO, R_AVR_8_LO8 },
648 { BFD_RELOC_AVR_8_HI, R_AVR_8_HI8 },
649 { BFD_RELOC_AVR_8_HLO, R_AVR_8_HLO8 },
650 { BFD_RELOC_AVR_DIFF8, R_AVR_DIFF8 },
651 { BFD_RELOC_AVR_DIFF16, R_AVR_DIFF16 },
652 { BFD_RELOC_AVR_DIFF32, R_AVR_DIFF32 }
653 };
654
655 /* Meant to be filled one day with the wrap around address for the
656 specific device. I.e. should get the value 0x4000 for 16k devices,
657 0x8000 for 32k devices and so on.
658
659 We initialize it here with a value of 0x1000000 resulting in
660 that we will never suggest a wrap-around jump during relaxation.
661 The logic of the source code later on assumes that in
662 avr_pc_wrap_around one single bit is set. */
663 static bfd_vma avr_pc_wrap_around = 0x10000000;
664
665 /* If this variable holds a value different from zero, the linker relaxation
666 machine will try to optimize call/ret sequences by a single jump
667 instruction. This option could be switched off by a linker switch. */
668 static int avr_replace_call_ret_sequences = 1;
669 \f
670 /* Initialize an entry in the stub hash table. */
671
672 static struct bfd_hash_entry *
673 stub_hash_newfunc (struct bfd_hash_entry *entry,
674 struct bfd_hash_table *table,
675 const char *string)
676 {
677 /* Allocate the structure if it has not already been allocated by a
678 subclass. */
679 if (entry == NULL)
680 {
681 entry = bfd_hash_allocate (table,
682 sizeof (struct elf32_avr_stub_hash_entry));
683 if (entry == NULL)
684 return entry;
685 }
686
687 /* Call the allocation method of the superclass. */
688 entry = bfd_hash_newfunc (entry, table, string);
689 if (entry != NULL)
690 {
691 struct elf32_avr_stub_hash_entry *hsh;
692
693 /* Initialize the local fields. */
694 hsh = avr_stub_hash_entry (entry);
695 hsh->stub_offset = 0;
696 hsh->target_value = 0;
697 }
698
699 return entry;
700 }
701
702 /* This function is just a straight passthrough to the real
703 function in linker.c. Its prupose is so that its address
704 can be compared inside the avr_link_hash_table macro. */
705
706 static struct bfd_hash_entry *
707 elf32_avr_link_hash_newfunc (struct bfd_hash_entry * entry,
708 struct bfd_hash_table * table,
709 const char * string)
710 {
711 return _bfd_elf_link_hash_newfunc (entry, table, string);
712 }
713
714 /* Create the derived linker hash table. The AVR ELF port uses the derived
715 hash table to keep information specific to the AVR ELF linker (without
716 using static variables). */
717
718 static struct bfd_link_hash_table *
719 elf32_avr_link_hash_table_create (bfd *abfd)
720 {
721 struct elf32_avr_link_hash_table *htab;
722 bfd_size_type amt = sizeof (*htab);
723
724 htab = bfd_zmalloc (amt);
725 if (htab == NULL)
726 return NULL;
727
728 if (!_bfd_elf_link_hash_table_init (&htab->etab, abfd,
729 elf32_avr_link_hash_newfunc,
730 sizeof (struct elf_link_hash_entry),
731 AVR_ELF_DATA))
732 {
733 free (htab);
734 return NULL;
735 }
736
737 /* Init the stub hash table too. */
738 if (!bfd_hash_table_init (&htab->bstab, stub_hash_newfunc,
739 sizeof (struct elf32_avr_stub_hash_entry)))
740 return NULL;
741
742 return &htab->etab.root;
743 }
744
745 /* Free the derived linker hash table. */
746
747 static void
748 elf32_avr_link_hash_table_free (struct bfd_link_hash_table *btab)
749 {
750 struct elf32_avr_link_hash_table *htab
751 = (struct elf32_avr_link_hash_table *) btab;
752
753 /* Free the address mapping table. */
754 if (htab->amt_stub_offsets != NULL)
755 free (htab->amt_stub_offsets);
756 if (htab->amt_destination_addr != NULL)
757 free (htab->amt_destination_addr);
758
759 bfd_hash_table_free (&htab->bstab);
760 _bfd_elf_link_hash_table_free (btab);
761 }
762
763 /* Calculates the effective distance of a pc relative jump/call. */
764
765 static int
766 avr_relative_distance_considering_wrap_around (unsigned int distance)
767 {
768 unsigned int wrap_around_mask = avr_pc_wrap_around - 1;
769 int dist_with_wrap_around = distance & wrap_around_mask;
770
771 if (dist_with_wrap_around > ((int) (avr_pc_wrap_around >> 1)))
772 dist_with_wrap_around -= avr_pc_wrap_around;
773
774 return dist_with_wrap_around;
775 }
776
777
778 static reloc_howto_type *
779 bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
780 bfd_reloc_code_real_type code)
781 {
782 unsigned int i;
783
784 for (i = 0;
785 i < sizeof (avr_reloc_map) / sizeof (struct avr_reloc_map);
786 i++)
787 if (avr_reloc_map[i].bfd_reloc_val == code)
788 return &elf_avr_howto_table[avr_reloc_map[i].elf_reloc_val];
789
790 return NULL;
791 }
792
793 static reloc_howto_type *
794 bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
795 const char *r_name)
796 {
797 unsigned int i;
798
799 for (i = 0;
800 i < sizeof (elf_avr_howto_table) / sizeof (elf_avr_howto_table[0]);
801 i++)
802 if (elf_avr_howto_table[i].name != NULL
803 && strcasecmp (elf_avr_howto_table[i].name, r_name) == 0)
804 return &elf_avr_howto_table[i];
805
806 return NULL;
807 }
808
809 /* Set the howto pointer for an AVR ELF reloc. */
810
811 static void
812 avr_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
813 arelent *cache_ptr,
814 Elf_Internal_Rela *dst)
815 {
816 unsigned int r_type;
817
818 r_type = ELF32_R_TYPE (dst->r_info);
819 BFD_ASSERT (r_type < (unsigned int) R_AVR_max);
820 cache_ptr->howto = &elf_avr_howto_table[r_type];
821 }
822
823 static bfd_boolean
824 avr_stub_is_required_for_16_bit_reloc (bfd_vma relocation)
825 {
826 return (relocation >= 0x020000);
827 }
828
829 /* Returns the address of the corresponding stub if there is one.
830 Returns otherwise an address above 0x020000. This function
831 could also be used, if there is no knowledge on the section where
832 the destination is found. */
833
834 static bfd_vma
835 avr_get_stub_addr (bfd_vma srel,
836 struct elf32_avr_link_hash_table *htab)
837 {
838 unsigned int sindex;
839 bfd_vma stub_sec_addr =
840 (htab->stub_sec->output_section->vma +
841 htab->stub_sec->output_offset);
842
843 for (sindex = 0; sindex < htab->amt_max_entry_cnt; sindex ++)
844 if (htab->amt_destination_addr[sindex] == srel)
845 return htab->amt_stub_offsets[sindex] + stub_sec_addr;
846
847 /* Return an address that could not be reached by 16 bit relocs. */
848 return 0x020000;
849 }
850
851 /* Perform a diff relocation. Nothing to do, as the difference value is already
852 written into the section's contents. */
853
854 static bfd_reloc_status_type
855 bfd_elf_avr_diff_reloc (bfd *abfd ATTRIBUTE_UNUSED,
856 arelent *reloc_entry ATTRIBUTE_UNUSED,
857 asymbol *symbol ATTRIBUTE_UNUSED,
858 void *data ATTRIBUTE_UNUSED,
859 asection *input_section ATTRIBUTE_UNUSED,
860 bfd *output_bfd ATTRIBUTE_UNUSED,
861 char **error_message ATTRIBUTE_UNUSED)
862 {
863 return bfd_reloc_ok;
864 }
865
866
867 /* Perform a single relocation. By default we use the standard BFD
868 routines, but a few relocs, we have to do them ourselves. */
869
870 static bfd_reloc_status_type
871 avr_final_link_relocate (reloc_howto_type * howto,
872 bfd * input_bfd,
873 asection * input_section,
874 bfd_byte * contents,
875 Elf_Internal_Rela * rel,
876 bfd_vma relocation,
877 struct elf32_avr_link_hash_table * htab)
878 {
879 bfd_reloc_status_type r = bfd_reloc_ok;
880 bfd_vma x;
881 bfd_signed_vma srel;
882 bfd_signed_vma reloc_addr;
883 bfd_boolean use_stubs = FALSE;
884 /* Usually is 0, unless we are generating code for a bootloader. */
885 bfd_signed_vma base_addr = htab->vector_base;
886
887 /* Absolute addr of the reloc in the final excecutable. */
888 reloc_addr = rel->r_offset + input_section->output_section->vma
889 + input_section->output_offset;
890
891 switch (howto->type)
892 {
893 case R_AVR_7_PCREL:
894 contents += rel->r_offset;
895 srel = (bfd_signed_vma) relocation;
896 srel += rel->r_addend;
897 srel -= rel->r_offset;
898 srel -= 2; /* Branch instructions add 2 to the PC... */
899 srel -= (input_section->output_section->vma +
900 input_section->output_offset);
901
902 if (srel & 1)
903 return bfd_reloc_outofrange;
904 if (srel > ((1 << 7) - 1) || (srel < - (1 << 7)))
905 return bfd_reloc_overflow;
906 x = bfd_get_16 (input_bfd, contents);
907 x = (x & 0xfc07) | (((srel >> 1) << 3) & 0x3f8);
908 bfd_put_16 (input_bfd, x, contents);
909 break;
910
911 case R_AVR_13_PCREL:
912 contents += rel->r_offset;
913 srel = (bfd_signed_vma) relocation;
914 srel += rel->r_addend;
915 srel -= rel->r_offset;
916 srel -= 2; /* Branch instructions add 2 to the PC... */
917 srel -= (input_section->output_section->vma +
918 input_section->output_offset);
919
920 if (srel & 1)
921 return bfd_reloc_outofrange;
922
923 srel = avr_relative_distance_considering_wrap_around (srel);
924
925 /* AVR addresses commands as words. */
926 srel >>= 1;
927
928 /* Check for overflow. */
929 if (srel < -2048 || srel > 2047)
930 {
931 /* Relative distance is too large. */
932
933 /* Always apply WRAPAROUND for avr2, avr25, and avr4. */
934 switch (bfd_get_mach (input_bfd))
935 {
936 case bfd_mach_avr2:
937 case bfd_mach_avr25:
938 case bfd_mach_avr4:
939 break;
940
941 default:
942 return bfd_reloc_overflow;
943 }
944 }
945
946 x = bfd_get_16 (input_bfd, contents);
947 x = (x & 0xf000) | (srel & 0xfff);
948 bfd_put_16 (input_bfd, x, contents);
949 break;
950
951 case R_AVR_LO8_LDI:
952 contents += rel->r_offset;
953 srel = (bfd_signed_vma) relocation + rel->r_addend;
954 x = bfd_get_16 (input_bfd, contents);
955 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
956 bfd_put_16 (input_bfd, x, contents);
957 break;
958
959 case R_AVR_LDI:
960 contents += rel->r_offset;
961 srel = (bfd_signed_vma) relocation + rel->r_addend;
962 if (((srel > 0) && (srel & 0xffff) > 255)
963 || ((srel < 0) && ((-srel) & 0xffff) > 128))
964 /* Remove offset for data/eeprom section. */
965 return bfd_reloc_overflow;
966
967 x = bfd_get_16 (input_bfd, contents);
968 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
969 bfd_put_16 (input_bfd, x, contents);
970 break;
971
972 case R_AVR_6:
973 contents += rel->r_offset;
974 srel = (bfd_signed_vma) relocation + rel->r_addend;
975 if (((srel & 0xffff) > 63) || (srel < 0))
976 /* Remove offset for data/eeprom section. */
977 return bfd_reloc_overflow;
978 x = bfd_get_16 (input_bfd, contents);
979 x = (x & 0xd3f8) | ((srel & 7) | ((srel & (3 << 3)) << 7)
980 | ((srel & (1 << 5)) << 8));
981 bfd_put_16 (input_bfd, x, contents);
982 break;
983
984 case R_AVR_6_ADIW:
985 contents += rel->r_offset;
986 srel = (bfd_signed_vma) relocation + rel->r_addend;
987 if (((srel & 0xffff) > 63) || (srel < 0))
988 /* Remove offset for data/eeprom section. */
989 return bfd_reloc_overflow;
990 x = bfd_get_16 (input_bfd, contents);
991 x = (x & 0xff30) | (srel & 0xf) | ((srel & 0x30) << 2);
992 bfd_put_16 (input_bfd, x, contents);
993 break;
994
995 case R_AVR_HI8_LDI:
996 contents += rel->r_offset;
997 srel = (bfd_signed_vma) relocation + rel->r_addend;
998 srel = (srel >> 8) & 0xff;
999 x = bfd_get_16 (input_bfd, contents);
1000 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1001 bfd_put_16 (input_bfd, x, contents);
1002 break;
1003
1004 case R_AVR_HH8_LDI:
1005 contents += rel->r_offset;
1006 srel = (bfd_signed_vma) relocation + rel->r_addend;
1007 srel = (srel >> 16) & 0xff;
1008 x = bfd_get_16 (input_bfd, contents);
1009 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1010 bfd_put_16 (input_bfd, x, contents);
1011 break;
1012
1013 case R_AVR_MS8_LDI:
1014 contents += rel->r_offset;
1015 srel = (bfd_signed_vma) relocation + rel->r_addend;
1016 srel = (srel >> 24) & 0xff;
1017 x = bfd_get_16 (input_bfd, contents);
1018 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1019 bfd_put_16 (input_bfd, x, contents);
1020 break;
1021
1022 case R_AVR_LO8_LDI_NEG:
1023 contents += rel->r_offset;
1024 srel = (bfd_signed_vma) relocation + rel->r_addend;
1025 srel = -srel;
1026 x = bfd_get_16 (input_bfd, contents);
1027 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1028 bfd_put_16 (input_bfd, x, contents);
1029 break;
1030
1031 case R_AVR_HI8_LDI_NEG:
1032 contents += rel->r_offset;
1033 srel = (bfd_signed_vma) relocation + rel->r_addend;
1034 srel = -srel;
1035 srel = (srel >> 8) & 0xff;
1036 x = bfd_get_16 (input_bfd, contents);
1037 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1038 bfd_put_16 (input_bfd, x, contents);
1039 break;
1040
1041 case R_AVR_HH8_LDI_NEG:
1042 contents += rel->r_offset;
1043 srel = (bfd_signed_vma) relocation + rel->r_addend;
1044 srel = -srel;
1045 srel = (srel >> 16) & 0xff;
1046 x = bfd_get_16 (input_bfd, contents);
1047 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1048 bfd_put_16 (input_bfd, x, contents);
1049 break;
1050
1051 case R_AVR_MS8_LDI_NEG:
1052 contents += rel->r_offset;
1053 srel = (bfd_signed_vma) relocation + rel->r_addend;
1054 srel = -srel;
1055 srel = (srel >> 24) & 0xff;
1056 x = bfd_get_16 (input_bfd, contents);
1057 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1058 bfd_put_16 (input_bfd, x, contents);
1059 break;
1060
1061 case R_AVR_LO8_LDI_GS:
1062 use_stubs = (!htab->no_stubs);
1063 /* Fall through. */
1064 case R_AVR_LO8_LDI_PM:
1065 contents += rel->r_offset;
1066 srel = (bfd_signed_vma) relocation + rel->r_addend;
1067
1068 if (use_stubs
1069 && avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1070 {
1071 bfd_vma old_srel = srel;
1072
1073 /* We need to use the address of the stub instead. */
1074 srel = avr_get_stub_addr (srel, htab);
1075 if (debug_stubs)
1076 printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1077 "reloc at address 0x%x.\n",
1078 (unsigned int) srel,
1079 (unsigned int) old_srel,
1080 (unsigned int) reloc_addr);
1081
1082 if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1083 return bfd_reloc_outofrange;
1084 }
1085
1086 if (srel & 1)
1087 return bfd_reloc_outofrange;
1088 srel = srel >> 1;
1089 x = bfd_get_16 (input_bfd, contents);
1090 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1091 bfd_put_16 (input_bfd, x, contents);
1092 break;
1093
1094 case R_AVR_HI8_LDI_GS:
1095 use_stubs = (!htab->no_stubs);
1096 /* Fall through. */
1097 case R_AVR_HI8_LDI_PM:
1098 contents += rel->r_offset;
1099 srel = (bfd_signed_vma) relocation + rel->r_addend;
1100
1101 if (use_stubs
1102 && avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1103 {
1104 bfd_vma old_srel = srel;
1105
1106 /* We need to use the address of the stub instead. */
1107 srel = avr_get_stub_addr (srel, htab);
1108 if (debug_stubs)
1109 printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1110 "reloc at address 0x%x.\n",
1111 (unsigned int) srel,
1112 (unsigned int) old_srel,
1113 (unsigned int) reloc_addr);
1114
1115 if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1116 return bfd_reloc_outofrange;
1117 }
1118
1119 if (srel & 1)
1120 return bfd_reloc_outofrange;
1121 srel = srel >> 1;
1122 srel = (srel >> 8) & 0xff;
1123 x = bfd_get_16 (input_bfd, contents);
1124 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1125 bfd_put_16 (input_bfd, x, contents);
1126 break;
1127
1128 case R_AVR_HH8_LDI_PM:
1129 contents += rel->r_offset;
1130 srel = (bfd_signed_vma) relocation + rel->r_addend;
1131 if (srel & 1)
1132 return bfd_reloc_outofrange;
1133 srel = srel >> 1;
1134 srel = (srel >> 16) & 0xff;
1135 x = bfd_get_16 (input_bfd, contents);
1136 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1137 bfd_put_16 (input_bfd, x, contents);
1138 break;
1139
1140 case R_AVR_LO8_LDI_PM_NEG:
1141 contents += rel->r_offset;
1142 srel = (bfd_signed_vma) relocation + rel->r_addend;
1143 srel = -srel;
1144 if (srel & 1)
1145 return bfd_reloc_outofrange;
1146 srel = srel >> 1;
1147 x = bfd_get_16 (input_bfd, contents);
1148 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1149 bfd_put_16 (input_bfd, x, contents);
1150 break;
1151
1152 case R_AVR_HI8_LDI_PM_NEG:
1153 contents += rel->r_offset;
1154 srel = (bfd_signed_vma) relocation + rel->r_addend;
1155 srel = -srel;
1156 if (srel & 1)
1157 return bfd_reloc_outofrange;
1158 srel = srel >> 1;
1159 srel = (srel >> 8) & 0xff;
1160 x = bfd_get_16 (input_bfd, contents);
1161 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1162 bfd_put_16 (input_bfd, x, contents);
1163 break;
1164
1165 case R_AVR_HH8_LDI_PM_NEG:
1166 contents += rel->r_offset;
1167 srel = (bfd_signed_vma) relocation + rel->r_addend;
1168 srel = -srel;
1169 if (srel & 1)
1170 return bfd_reloc_outofrange;
1171 srel = srel >> 1;
1172 srel = (srel >> 16) & 0xff;
1173 x = bfd_get_16 (input_bfd, contents);
1174 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1175 bfd_put_16 (input_bfd, x, contents);
1176 break;
1177
1178 case R_AVR_CALL:
1179 contents += rel->r_offset;
1180 srel = (bfd_signed_vma) relocation + rel->r_addend;
1181 if (srel & 1)
1182 return bfd_reloc_outofrange;
1183 srel = srel >> 1;
1184 x = bfd_get_16 (input_bfd, contents);
1185 x |= ((srel & 0x10000) | ((srel << 3) & 0x1f00000)) >> 16;
1186 bfd_put_16 (input_bfd, x, contents);
1187 bfd_put_16 (input_bfd, (bfd_vma) srel & 0xffff, contents+2);
1188 break;
1189
1190 case R_AVR_16_PM:
1191 use_stubs = (!htab->no_stubs);
1192 contents += rel->r_offset;
1193 srel = (bfd_signed_vma) relocation + rel->r_addend;
1194
1195 if (use_stubs
1196 && avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1197 {
1198 bfd_vma old_srel = srel;
1199
1200 /* We need to use the address of the stub instead. */
1201 srel = avr_get_stub_addr (srel,htab);
1202 if (debug_stubs)
1203 printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1204 "reloc at address 0x%x.\n",
1205 (unsigned int) srel,
1206 (unsigned int) old_srel,
1207 (unsigned int) reloc_addr);
1208
1209 if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1210 return bfd_reloc_outofrange;
1211 }
1212
1213 if (srel & 1)
1214 return bfd_reloc_outofrange;
1215 srel = srel >> 1;
1216 bfd_put_16 (input_bfd, (bfd_vma) srel &0x00ffff, contents);
1217 break;
1218
1219 case R_AVR_DIFF8:
1220 case R_AVR_DIFF16:
1221 case R_AVR_DIFF32:
1222 /* Nothing to do here, as contents already contains the diff value. */
1223 r = bfd_reloc_ok;
1224 break;
1225
1226 default:
1227 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1228 contents, rel->r_offset,
1229 relocation, rel->r_addend);
1230 }
1231
1232 return r;
1233 }
1234
1235 /* Relocate an AVR ELF section. */
1236
1237 static bfd_boolean
1238 elf32_avr_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
1239 struct bfd_link_info *info,
1240 bfd *input_bfd,
1241 asection *input_section,
1242 bfd_byte *contents,
1243 Elf_Internal_Rela *relocs,
1244 Elf_Internal_Sym *local_syms,
1245 asection **local_sections)
1246 {
1247 Elf_Internal_Shdr * symtab_hdr;
1248 struct elf_link_hash_entry ** sym_hashes;
1249 Elf_Internal_Rela * rel;
1250 Elf_Internal_Rela * relend;
1251 struct elf32_avr_link_hash_table * htab = avr_link_hash_table (info);
1252
1253 if (htab == NULL)
1254 return FALSE;
1255
1256 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1257 sym_hashes = elf_sym_hashes (input_bfd);
1258 relend = relocs + input_section->reloc_count;
1259
1260 for (rel = relocs; rel < relend; rel ++)
1261 {
1262 reloc_howto_type * howto;
1263 unsigned long r_symndx;
1264 Elf_Internal_Sym * sym;
1265 asection * sec;
1266 struct elf_link_hash_entry * h;
1267 bfd_vma relocation;
1268 bfd_reloc_status_type r;
1269 const char * name;
1270 int r_type;
1271
1272 r_type = ELF32_R_TYPE (rel->r_info);
1273 r_symndx = ELF32_R_SYM (rel->r_info);
1274 howto = elf_avr_howto_table + r_type;
1275 h = NULL;
1276 sym = NULL;
1277 sec = NULL;
1278
1279 if (r_symndx < symtab_hdr->sh_info)
1280 {
1281 sym = local_syms + r_symndx;
1282 sec = local_sections [r_symndx];
1283 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1284
1285 name = bfd_elf_string_from_elf_section
1286 (input_bfd, symtab_hdr->sh_link, sym->st_name);
1287 name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
1288 }
1289 else
1290 {
1291 bfd_boolean unresolved_reloc, warned, ignored;
1292
1293 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1294 r_symndx, symtab_hdr, sym_hashes,
1295 h, sec, relocation,
1296 unresolved_reloc, warned, ignored);
1297
1298 name = h->root.root.string;
1299 }
1300
1301 if (sec != NULL && discarded_section (sec))
1302 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1303 rel, 1, relend, howto, 0, contents);
1304
1305 if (info->relocatable)
1306 continue;
1307
1308 r = avr_final_link_relocate (howto, input_bfd, input_section,
1309 contents, rel, relocation, htab);
1310
1311 if (r != bfd_reloc_ok)
1312 {
1313 const char * msg = (const char *) NULL;
1314
1315 switch (r)
1316 {
1317 case bfd_reloc_overflow:
1318 r = info->callbacks->reloc_overflow
1319 (info, (h ? &h->root : NULL),
1320 name, howto->name, (bfd_vma) 0,
1321 input_bfd, input_section, rel->r_offset);
1322 break;
1323
1324 case bfd_reloc_undefined:
1325 r = info->callbacks->undefined_symbol
1326 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
1327 break;
1328
1329 case bfd_reloc_outofrange:
1330 msg = _("internal error: out of range error");
1331 break;
1332
1333 case bfd_reloc_notsupported:
1334 msg = _("internal error: unsupported relocation error");
1335 break;
1336
1337 case bfd_reloc_dangerous:
1338 msg = _("internal error: dangerous relocation");
1339 break;
1340
1341 default:
1342 msg = _("internal error: unknown error");
1343 break;
1344 }
1345
1346 if (msg)
1347 r = info->callbacks->warning
1348 (info, msg, name, input_bfd, input_section, rel->r_offset);
1349
1350 if (! r)
1351 return FALSE;
1352 }
1353 }
1354
1355 return TRUE;
1356 }
1357
1358 /* The final processing done just before writing out a AVR ELF object
1359 file. This gets the AVR architecture right based on the machine
1360 number. */
1361
1362 static void
1363 bfd_elf_avr_final_write_processing (bfd *abfd,
1364 bfd_boolean linker ATTRIBUTE_UNUSED)
1365 {
1366 unsigned long val;
1367
1368 switch (bfd_get_mach (abfd))
1369 {
1370 default:
1371 case bfd_mach_avr2:
1372 val = E_AVR_MACH_AVR2;
1373 break;
1374
1375 case bfd_mach_avr1:
1376 val = E_AVR_MACH_AVR1;
1377 break;
1378
1379 case bfd_mach_avr25:
1380 val = E_AVR_MACH_AVR25;
1381 break;
1382
1383 case bfd_mach_avr3:
1384 val = E_AVR_MACH_AVR3;
1385 break;
1386
1387 case bfd_mach_avr31:
1388 val = E_AVR_MACH_AVR31;
1389 break;
1390
1391 case bfd_mach_avr35:
1392 val = E_AVR_MACH_AVR35;
1393 break;
1394
1395 case bfd_mach_avr4:
1396 val = E_AVR_MACH_AVR4;
1397 break;
1398
1399 case bfd_mach_avr5:
1400 val = E_AVR_MACH_AVR5;
1401 break;
1402
1403 case bfd_mach_avr51:
1404 val = E_AVR_MACH_AVR51;
1405 break;
1406
1407 case bfd_mach_avr6:
1408 val = E_AVR_MACH_AVR6;
1409 break;
1410
1411 case bfd_mach_avrxmega1:
1412 val = E_AVR_MACH_XMEGA1;
1413 break;
1414
1415 case bfd_mach_avrxmega2:
1416 val = E_AVR_MACH_XMEGA2;
1417 break;
1418
1419 case bfd_mach_avrxmega3:
1420 val = E_AVR_MACH_XMEGA3;
1421 break;
1422
1423 case bfd_mach_avrxmega4:
1424 val = E_AVR_MACH_XMEGA4;
1425 break;
1426
1427 case bfd_mach_avrxmega5:
1428 val = E_AVR_MACH_XMEGA5;
1429 break;
1430
1431 case bfd_mach_avrxmega6:
1432 val = E_AVR_MACH_XMEGA6;
1433 break;
1434
1435 case bfd_mach_avrxmega7:
1436 val = E_AVR_MACH_XMEGA7;
1437 break;
1438 }
1439
1440 elf_elfheader (abfd)->e_machine = EM_AVR;
1441 elf_elfheader (abfd)->e_flags &= ~ EF_AVR_MACH;
1442 elf_elfheader (abfd)->e_flags |= val;
1443 elf_elfheader (abfd)->e_flags |= EF_AVR_LINKRELAX_PREPARED;
1444 }
1445
1446 /* Set the right machine number. */
1447
1448 static bfd_boolean
1449 elf32_avr_object_p (bfd *abfd)
1450 {
1451 unsigned int e_set = bfd_mach_avr2;
1452
1453 if (elf_elfheader (abfd)->e_machine == EM_AVR
1454 || elf_elfheader (abfd)->e_machine == EM_AVR_OLD)
1455 {
1456 int e_mach = elf_elfheader (abfd)->e_flags & EF_AVR_MACH;
1457
1458 switch (e_mach)
1459 {
1460 default:
1461 case E_AVR_MACH_AVR2:
1462 e_set = bfd_mach_avr2;
1463 break;
1464
1465 case E_AVR_MACH_AVR1:
1466 e_set = bfd_mach_avr1;
1467 break;
1468
1469 case E_AVR_MACH_AVR25:
1470 e_set = bfd_mach_avr25;
1471 break;
1472
1473 case E_AVR_MACH_AVR3:
1474 e_set = bfd_mach_avr3;
1475 break;
1476
1477 case E_AVR_MACH_AVR31:
1478 e_set = bfd_mach_avr31;
1479 break;
1480
1481 case E_AVR_MACH_AVR35:
1482 e_set = bfd_mach_avr35;
1483 break;
1484
1485 case E_AVR_MACH_AVR4:
1486 e_set = bfd_mach_avr4;
1487 break;
1488
1489 case E_AVR_MACH_AVR5:
1490 e_set = bfd_mach_avr5;
1491 break;
1492
1493 case E_AVR_MACH_AVR51:
1494 e_set = bfd_mach_avr51;
1495 break;
1496
1497 case E_AVR_MACH_AVR6:
1498 e_set = bfd_mach_avr6;
1499 break;
1500
1501 case E_AVR_MACH_XMEGA1:
1502 e_set = bfd_mach_avrxmega1;
1503 break;
1504
1505 case E_AVR_MACH_XMEGA2:
1506 e_set = bfd_mach_avrxmega2;
1507 break;
1508
1509 case E_AVR_MACH_XMEGA3:
1510 e_set = bfd_mach_avrxmega3;
1511 break;
1512
1513 case E_AVR_MACH_XMEGA4:
1514 e_set = bfd_mach_avrxmega4;
1515 break;
1516
1517 case E_AVR_MACH_XMEGA5:
1518 e_set = bfd_mach_avrxmega5;
1519 break;
1520
1521 case E_AVR_MACH_XMEGA6:
1522 e_set = bfd_mach_avrxmega6;
1523 break;
1524
1525 case E_AVR_MACH_XMEGA7:
1526 e_set = bfd_mach_avrxmega7;
1527 break;
1528 }
1529 }
1530 return bfd_default_set_arch_mach (abfd, bfd_arch_avr,
1531 e_set);
1532 }
1533
1534 /* Returns whether the relocation type passed is a diff reloc. */
1535
1536 static bfd_boolean
1537 elf32_avr_is_diff_reloc (Elf_Internal_Rela *irel)
1538 {
1539 return (ELF32_R_TYPE (irel->r_info) == R_AVR_DIFF8
1540 ||ELF32_R_TYPE (irel->r_info) == R_AVR_DIFF16
1541 || ELF32_R_TYPE (irel->r_info) == R_AVR_DIFF32);
1542 }
1543
1544 /* Reduce the diff value written in the section by count if the shrinked
1545 insn address happens to fall between the two symbols for which this
1546 diff reloc was emitted. */
1547
1548 static void
1549 elf32_avr_adjust_diff_reloc_value (bfd *abfd,
1550 struct bfd_section *isec,
1551 Elf_Internal_Rela *irel,
1552 bfd_vma symval,
1553 bfd_vma shrinked_insn_address,
1554 int count)
1555 {
1556 unsigned char *reloc_contents = NULL;
1557 unsigned char *isec_contents = elf_section_data (isec)->this_hdr.contents;
1558 if (isec_contents == NULL)
1559 {
1560 if (! bfd_malloc_and_get_section (abfd, isec, &isec_contents))
1561 return;
1562
1563 elf_section_data (isec)->this_hdr.contents = isec_contents;
1564 }
1565
1566 reloc_contents = isec_contents + irel->r_offset;
1567
1568 /* Read value written in object file. */
1569 bfd_vma x = 0;
1570 switch (ELF32_R_TYPE (irel->r_info))
1571 {
1572 case R_AVR_DIFF8:
1573 {
1574 x = *reloc_contents;
1575 break;
1576 }
1577 case R_AVR_DIFF16:
1578 {
1579 x = bfd_get_16 (abfd, reloc_contents);
1580 break;
1581 }
1582 case R_AVR_DIFF32:
1583 {
1584 x = bfd_get_32 (abfd, reloc_contents);
1585 break;
1586 }
1587 default:
1588 {
1589 BFD_FAIL();
1590 }
1591 }
1592
1593 /* For a diff reloc sym1 - sym2 the diff at assembly time (x) is written
1594 into the object file at the reloc offset. sym2's logical value is
1595 symval (<start_of_section>) + reloc addend. Compute the start and end
1596 addresses and check if the shrinked insn falls between sym1 and sym2. */
1597
1598 bfd_vma end_address = symval + irel->r_addend;
1599 bfd_vma start_address = end_address - x;
1600
1601 /* Reduce the diff value by count bytes and write it back into section
1602 contents. */
1603
1604 if (shrinked_insn_address >= start_address &&
1605 shrinked_insn_address <= end_address)
1606 {
1607 switch (ELF32_R_TYPE (irel->r_info))
1608 {
1609 case R_AVR_DIFF8:
1610 {
1611 *reloc_contents = (x - count);
1612 break;
1613 }
1614 case R_AVR_DIFF16:
1615 {
1616 bfd_put_16 (abfd, (x - count) & 0xFFFF, reloc_contents);
1617 break;
1618 }
1619 case R_AVR_DIFF32:
1620 {
1621 bfd_put_32 (abfd, (x - count) & 0xFFFFFFFF, reloc_contents);
1622 break;
1623 }
1624 default:
1625 {
1626 BFD_FAIL();
1627 }
1628 }
1629
1630 }
1631 }
1632
1633 /* Delete some bytes from a section while changing the size of an instruction.
1634 The parameter "addr" denotes the section-relative offset pointing just
1635 behind the shrinked instruction. "addr+count" point at the first
1636 byte just behind the original unshrinked instruction. */
1637
1638 static bfd_boolean
1639 elf32_avr_relax_delete_bytes (bfd *abfd,
1640 asection *sec,
1641 bfd_vma addr,
1642 int count)
1643 {
1644 Elf_Internal_Shdr *symtab_hdr;
1645 unsigned int sec_shndx;
1646 bfd_byte *contents;
1647 Elf_Internal_Rela *irel, *irelend;
1648 Elf_Internal_Sym *isym;
1649 Elf_Internal_Sym *isymbuf = NULL;
1650 bfd_vma toaddr;
1651 struct elf_link_hash_entry **sym_hashes;
1652 struct elf_link_hash_entry **end_hashes;
1653 unsigned int symcount;
1654
1655 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1656 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1657 contents = elf_section_data (sec)->this_hdr.contents;
1658
1659 toaddr = sec->size;
1660
1661 irel = elf_section_data (sec)->relocs;
1662 irelend = irel + sec->reloc_count;
1663
1664 /* Actually delete the bytes. */
1665 if (toaddr - addr - count > 0)
1666 memmove (contents + addr, contents + addr + count,
1667 (size_t) (toaddr - addr - count));
1668 sec->size -= count;
1669
1670 /* Adjust all the reloc addresses. */
1671 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1672 {
1673 bfd_vma old_reloc_address;
1674
1675 old_reloc_address = (sec->output_section->vma
1676 + sec->output_offset + irel->r_offset);
1677
1678 /* Get the new reloc address. */
1679 if ((irel->r_offset > addr
1680 && irel->r_offset < toaddr))
1681 {
1682 if (debug_relax)
1683 printf ("Relocation at address 0x%x needs to be moved.\n"
1684 "Old section offset: 0x%x, New section offset: 0x%x \n",
1685 (unsigned int) old_reloc_address,
1686 (unsigned int) irel->r_offset,
1687 (unsigned int) ((irel->r_offset) - count));
1688
1689 irel->r_offset -= count;
1690 }
1691
1692 }
1693
1694 /* The reloc's own addresses are now ok. However, we need to readjust
1695 the reloc's addend, i.e. the reloc's value if two conditions are met:
1696 1.) the reloc is relative to a symbol in this section that
1697 is located in front of the shrinked instruction
1698 2.) symbol plus addend end up behind the shrinked instruction.
1699
1700 The most common case where this happens are relocs relative to
1701 the section-start symbol.
1702
1703 This step needs to be done for all of the sections of the bfd. */
1704
1705 {
1706 struct bfd_section *isec;
1707
1708 for (isec = abfd->sections; isec; isec = isec->next)
1709 {
1710 bfd_vma symval;
1711 bfd_vma shrinked_insn_address;
1712
1713 if (isec->reloc_count == 0)
1714 continue;
1715
1716 shrinked_insn_address = (sec->output_section->vma
1717 + sec->output_offset + addr - count);
1718
1719 irel = elf_section_data (isec)->relocs;
1720 /* PR 12161: Read in the relocs for this section if necessary. */
1721 if (irel == NULL)
1722 irel = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL, TRUE);
1723
1724 for (irelend = irel + isec->reloc_count;
1725 irel < irelend;
1726 irel++)
1727 {
1728 /* Read this BFD's local symbols if we haven't done
1729 so already. */
1730 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
1731 {
1732 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1733 if (isymbuf == NULL)
1734 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
1735 symtab_hdr->sh_info, 0,
1736 NULL, NULL, NULL);
1737 if (isymbuf == NULL)
1738 return FALSE;
1739 }
1740
1741 /* Get the value of the symbol referred to by the reloc. */
1742 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1743 {
1744 /* A local symbol. */
1745 asection *sym_sec;
1746
1747 isym = isymbuf + ELF32_R_SYM (irel->r_info);
1748 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1749 symval = isym->st_value;
1750 /* If the reloc is absolute, it will not have
1751 a symbol or section associated with it. */
1752 if (sym_sec == sec)
1753 {
1754 symval += sym_sec->output_section->vma
1755 + sym_sec->output_offset;
1756
1757 if (debug_relax)
1758 printf ("Checking if the relocation's "
1759 "addend needs corrections.\n"
1760 "Address of anchor symbol: 0x%x \n"
1761 "Address of relocation target: 0x%x \n"
1762 "Address of relaxed insn: 0x%x \n",
1763 (unsigned int) symval,
1764 (unsigned int) (symval + irel->r_addend),
1765 (unsigned int) shrinked_insn_address);
1766
1767 if (symval <= shrinked_insn_address
1768 && (symval + irel->r_addend) > shrinked_insn_address)
1769 {
1770 if (elf32_avr_is_diff_reloc (irel))
1771 {
1772 elf32_avr_adjust_diff_reloc_value (abfd, isec, irel,
1773 symval,
1774 shrinked_insn_address,
1775 count);
1776 }
1777
1778 irel->r_addend -= count;
1779
1780 if (debug_relax)
1781 printf ("Relocation's addend needed to be fixed \n");
1782 }
1783 }
1784 /* else...Reference symbol is absolute. No adjustment needed. */
1785 }
1786 /* else...Reference symbol is extern. No need for adjusting
1787 the addend. */
1788 }
1789 }
1790 }
1791
1792 /* Adjust the local symbols defined in this section. */
1793 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1794 /* Fix PR 9841, there may be no local symbols. */
1795 if (isym != NULL)
1796 {
1797 Elf_Internal_Sym *isymend;
1798
1799 isymend = isym + symtab_hdr->sh_info;
1800 for (; isym < isymend; isym++)
1801 {
1802 if (isym->st_shndx == sec_shndx
1803 && isym->st_value > addr
1804 && isym->st_value < toaddr)
1805 isym->st_value -= count;
1806 }
1807 }
1808
1809 /* Now adjust the global symbols defined in this section. */
1810 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1811 - symtab_hdr->sh_info);
1812 sym_hashes = elf_sym_hashes (abfd);
1813 end_hashes = sym_hashes + symcount;
1814 for (; sym_hashes < end_hashes; sym_hashes++)
1815 {
1816 struct elf_link_hash_entry *sym_hash = *sym_hashes;
1817 if ((sym_hash->root.type == bfd_link_hash_defined
1818 || sym_hash->root.type == bfd_link_hash_defweak)
1819 && sym_hash->root.u.def.section == sec
1820 && sym_hash->root.u.def.value > addr
1821 && sym_hash->root.u.def.value < toaddr)
1822 {
1823 sym_hash->root.u.def.value -= count;
1824 }
1825 }
1826
1827 return TRUE;
1828 }
1829
1830 /* This function handles relaxing for the avr.
1831 Many important relaxing opportunities within functions are already
1832 realized by the compiler itself.
1833 Here we try to replace call (4 bytes) -> rcall (2 bytes)
1834 and jump -> rjmp (safes also 2 bytes).
1835 As well we now optimize seqences of
1836 - call/rcall function
1837 - ret
1838 to yield
1839 - jmp/rjmp function
1840 - ret
1841 . In case that within a sequence
1842 - jmp/rjmp label
1843 - ret
1844 the ret could no longer be reached it is optimized away. In order
1845 to check if the ret is no longer needed, it is checked that the ret's address
1846 is not the target of a branch or jump within the same section, it is checked
1847 that there is no skip instruction before the jmp/rjmp and that there
1848 is no local or global label place at the address of the ret.
1849
1850 We refrain from relaxing within sections ".vectors" and
1851 ".jumptables" in order to maintain the position of the instructions.
1852 There, however, we substitute jmp/call by a sequence rjmp,nop/rcall,nop
1853 if possible. (In future one could possibly use the space of the nop
1854 for the first instruction of the irq service function.
1855
1856 The .jumptables sections is meant to be used for a future tablejump variant
1857 for the devices with 3-byte program counter where the table itself
1858 contains 4-byte jump instructions whose relative offset must not
1859 be changed. */
1860
1861 static bfd_boolean
1862 elf32_avr_relax_section (bfd *abfd,
1863 asection *sec,
1864 struct bfd_link_info *link_info,
1865 bfd_boolean *again)
1866 {
1867 Elf_Internal_Shdr *symtab_hdr;
1868 Elf_Internal_Rela *internal_relocs;
1869 Elf_Internal_Rela *irel, *irelend;
1870 bfd_byte *contents = NULL;
1871 Elf_Internal_Sym *isymbuf = NULL;
1872 struct elf32_avr_link_hash_table *htab;
1873
1874 /* If 'shrinkable' is FALSE, do not shrink by deleting bytes while
1875 relaxing. Such shrinking can cause issues for the sections such
1876 as .vectors and .jumptables. Instead the unused bytes should be
1877 filled with nop instructions. */
1878 bfd_boolean shrinkable = TRUE;
1879
1880 if (!strcmp (sec->name,".vectors")
1881 || !strcmp (sec->name,".jumptables"))
1882 shrinkable = FALSE;
1883
1884 if (link_info->relocatable)
1885 (*link_info->callbacks->einfo)
1886 (_("%P%F: --relax and -r may not be used together\n"));
1887
1888 htab = avr_link_hash_table (link_info);
1889 if (htab == NULL)
1890 return FALSE;
1891
1892 /* Assume nothing changes. */
1893 *again = FALSE;
1894
1895 if ((!htab->no_stubs) && (sec == htab->stub_sec))
1896 {
1897 /* We are just relaxing the stub section.
1898 Let's calculate the size needed again. */
1899 bfd_size_type last_estimated_stub_section_size = htab->stub_sec->size;
1900
1901 if (debug_relax)
1902 printf ("Relaxing the stub section. Size prior to this pass: %i\n",
1903 (int) last_estimated_stub_section_size);
1904
1905 elf32_avr_size_stubs (htab->stub_sec->output_section->owner,
1906 link_info, FALSE);
1907
1908 /* Check if the number of trampolines changed. */
1909 if (last_estimated_stub_section_size != htab->stub_sec->size)
1910 *again = TRUE;
1911
1912 if (debug_relax)
1913 printf ("Size of stub section after this pass: %i\n",
1914 (int) htab->stub_sec->size);
1915
1916 return TRUE;
1917 }
1918
1919 /* We don't have to do anything for a relocatable link, if
1920 this section does not have relocs, or if this is not a
1921 code section. */
1922 if (link_info->relocatable
1923 || (sec->flags & SEC_RELOC) == 0
1924 || sec->reloc_count == 0
1925 || (sec->flags & SEC_CODE) == 0)
1926 return TRUE;
1927
1928 /* Check if the object file to relax uses internal symbols so that we
1929 could fix up the relocations. */
1930 if (!(elf_elfheader (abfd)->e_flags & EF_AVR_LINKRELAX_PREPARED))
1931 return TRUE;
1932
1933 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1934
1935 /* Get a copy of the native relocations. */
1936 internal_relocs = (_bfd_elf_link_read_relocs
1937 (abfd, sec, NULL, NULL, link_info->keep_memory));
1938 if (internal_relocs == NULL)
1939 goto error_return;
1940
1941 /* Walk through the relocs looking for relaxing opportunities. */
1942 irelend = internal_relocs + sec->reloc_count;
1943 for (irel = internal_relocs; irel < irelend; irel++)
1944 {
1945 bfd_vma symval;
1946
1947 if ( ELF32_R_TYPE (irel->r_info) != R_AVR_13_PCREL
1948 && ELF32_R_TYPE (irel->r_info) != R_AVR_7_PCREL
1949 && ELF32_R_TYPE (irel->r_info) != R_AVR_CALL)
1950 continue;
1951
1952 /* Get the section contents if we haven't done so already. */
1953 if (contents == NULL)
1954 {
1955 /* Get cached copy if it exists. */
1956 if (elf_section_data (sec)->this_hdr.contents != NULL)
1957 contents = elf_section_data (sec)->this_hdr.contents;
1958 else
1959 {
1960 /* Go get them off disk. */
1961 if (! bfd_malloc_and_get_section (abfd, sec, &contents))
1962 goto error_return;
1963 }
1964 }
1965
1966 /* Read this BFD's local symbols if we haven't done so already. */
1967 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
1968 {
1969 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1970 if (isymbuf == NULL)
1971 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
1972 symtab_hdr->sh_info, 0,
1973 NULL, NULL, NULL);
1974 if (isymbuf == NULL)
1975 goto error_return;
1976 }
1977
1978
1979 /* Get the value of the symbol referred to by the reloc. */
1980 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1981 {
1982 /* A local symbol. */
1983 Elf_Internal_Sym *isym;
1984 asection *sym_sec;
1985
1986 isym = isymbuf + ELF32_R_SYM (irel->r_info);
1987 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1988 symval = isym->st_value;
1989 /* If the reloc is absolute, it will not have
1990 a symbol or section associated with it. */
1991 if (sym_sec)
1992 symval += sym_sec->output_section->vma
1993 + sym_sec->output_offset;
1994 }
1995 else
1996 {
1997 unsigned long indx;
1998 struct elf_link_hash_entry *h;
1999
2000 /* An external symbol. */
2001 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
2002 h = elf_sym_hashes (abfd)[indx];
2003 BFD_ASSERT (h != NULL);
2004 if (h->root.type != bfd_link_hash_defined
2005 && h->root.type != bfd_link_hash_defweak)
2006 /* This appears to be a reference to an undefined
2007 symbol. Just ignore it--it will be caught by the
2008 regular reloc processing. */
2009 continue;
2010
2011 symval = (h->root.u.def.value
2012 + h->root.u.def.section->output_section->vma
2013 + h->root.u.def.section->output_offset);
2014 }
2015
2016 /* For simplicity of coding, we are going to modify the section
2017 contents, the section relocs, and the BFD symbol table. We
2018 must tell the rest of the code not to free up this
2019 information. It would be possible to instead create a table
2020 of changes which have to be made, as is done in coff-mips.c;
2021 that would be more work, but would require less memory when
2022 the linker is run. */
2023 switch (ELF32_R_TYPE (irel->r_info))
2024 {
2025 /* Try to turn a 22-bit absolute call/jump into an 13-bit
2026 pc-relative rcall/rjmp. */
2027 case R_AVR_CALL:
2028 {
2029 bfd_vma value = symval + irel->r_addend;
2030 bfd_vma dot, gap;
2031 int distance_short_enough = 0;
2032
2033 /* Get the address of this instruction. */
2034 dot = (sec->output_section->vma
2035 + sec->output_offset + irel->r_offset);
2036
2037 /* Compute the distance from this insn to the branch target. */
2038 gap = value - dot;
2039
2040 /* Check if the gap falls in the range that can be accommodated
2041 in 13bits signed (It is 12bits when encoded, as we deal with
2042 word addressing). */
2043 if (!shrinkable && ((int) gap >= -4096 && (int) gap <= 4095))
2044 distance_short_enough = 1;
2045 /* If shrinkable, then we can check for a range of distance which
2046 is two bytes farther on both the directions because the call
2047 or jump target will be closer by two bytes after the
2048 relaxation. */
2049 else if (shrinkable && ((int) gap >= -4094 && (int) gap <= 4097))
2050 distance_short_enough = 1;
2051
2052 /* Here we handle the wrap-around case. E.g. for a 16k device
2053 we could use a rjmp to jump from address 0x100 to 0x3d00!
2054 In order to make this work properly, we need to fill the
2055 vaiable avr_pc_wrap_around with the appropriate value.
2056 I.e. 0x4000 for a 16k device. */
2057 {
2058 /* Shrinking the code size makes the gaps larger in the
2059 case of wrap-arounds. So we use a heuristical safety
2060 margin to avoid that during relax the distance gets
2061 again too large for the short jumps. Let's assume
2062 a typical code-size reduction due to relax for a
2063 16k device of 600 bytes. So let's use twice the
2064 typical value as safety margin. */
2065 int rgap;
2066 int safety_margin;
2067
2068 int assumed_shrink = 600;
2069 if (avr_pc_wrap_around > 0x4000)
2070 assumed_shrink = 900;
2071
2072 safety_margin = 2 * assumed_shrink;
2073
2074 rgap = avr_relative_distance_considering_wrap_around (gap);
2075
2076 if (rgap >= (-4092 + safety_margin)
2077 && rgap <= (4094 - safety_margin))
2078 distance_short_enough = 1;
2079 }
2080
2081 if (distance_short_enough)
2082 {
2083 unsigned char code_msb;
2084 unsigned char code_lsb;
2085
2086 if (debug_relax)
2087 printf ("shrinking jump/call instruction at address 0x%x"
2088 " in section %s\n\n",
2089 (int) dot, sec->name);
2090
2091 /* Note that we've changed the relocs, section contents,
2092 etc. */
2093 elf_section_data (sec)->relocs = internal_relocs;
2094 elf_section_data (sec)->this_hdr.contents = contents;
2095 symtab_hdr->contents = (unsigned char *) isymbuf;
2096
2097 /* Get the instruction code for relaxing. */
2098 code_lsb = bfd_get_8 (abfd, contents + irel->r_offset);
2099 code_msb = bfd_get_8 (abfd, contents + irel->r_offset + 1);
2100
2101 /* Mask out the relocation bits. */
2102 code_msb &= 0x94;
2103 code_lsb &= 0x0E;
2104 if (code_msb == 0x94 && code_lsb == 0x0E)
2105 {
2106 /* we are changing call -> rcall . */
2107 bfd_put_8 (abfd, 0x00, contents + irel->r_offset);
2108 bfd_put_8 (abfd, 0xD0, contents + irel->r_offset + 1);
2109 }
2110 else if (code_msb == 0x94 && code_lsb == 0x0C)
2111 {
2112 /* we are changeing jump -> rjmp. */
2113 bfd_put_8 (abfd, 0x00, contents + irel->r_offset);
2114 bfd_put_8 (abfd, 0xC0, contents + irel->r_offset + 1);
2115 }
2116 else
2117 abort ();
2118
2119 /* Fix the relocation's type. */
2120 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2121 R_AVR_13_PCREL);
2122
2123 /* We should not modify the ordering if 'shrinkable' is
2124 FALSE. */
2125 if (!shrinkable)
2126 {
2127 /* Let's insert a nop. */
2128 bfd_put_8 (abfd, 0x00, contents + irel->r_offset + 2);
2129 bfd_put_8 (abfd, 0x00, contents + irel->r_offset + 3);
2130 }
2131 else
2132 {
2133 /* Delete two bytes of data. */
2134 if (!elf32_avr_relax_delete_bytes (abfd, sec,
2135 irel->r_offset + 2, 2))
2136 goto error_return;
2137
2138 /* That will change things, so, we should relax again.
2139 Note that this is not required, and it may be slow. */
2140 *again = TRUE;
2141 }
2142 }
2143 }
2144
2145 default:
2146 {
2147 unsigned char code_msb;
2148 unsigned char code_lsb;
2149 bfd_vma dot;
2150
2151 code_msb = bfd_get_8 (abfd, contents + irel->r_offset + 1);
2152 code_lsb = bfd_get_8 (abfd, contents + irel->r_offset + 0);
2153
2154 /* Get the address of this instruction. */
2155 dot = (sec->output_section->vma
2156 + sec->output_offset + irel->r_offset);
2157
2158 /* Here we look for rcall/ret or call/ret sequences that could be
2159 safely replaced by rjmp/ret or jmp/ret. */
2160 if (((code_msb & 0xf0) == 0xd0)
2161 && avr_replace_call_ret_sequences)
2162 {
2163 /* This insn is a rcall. */
2164 unsigned char next_insn_msb = 0;
2165 unsigned char next_insn_lsb = 0;
2166
2167 if (irel->r_offset + 3 < sec->size)
2168 {
2169 next_insn_msb =
2170 bfd_get_8 (abfd, contents + irel->r_offset + 3);
2171 next_insn_lsb =
2172 bfd_get_8 (abfd, contents + irel->r_offset + 2);
2173 }
2174
2175 if ((0x95 == next_insn_msb) && (0x08 == next_insn_lsb))
2176 {
2177 /* The next insn is a ret. We now convert the rcall insn
2178 into a rjmp instruction. */
2179 code_msb &= 0xef;
2180 bfd_put_8 (abfd, code_msb, contents + irel->r_offset + 1);
2181 if (debug_relax)
2182 printf ("converted rcall/ret sequence at address 0x%x"
2183 " into rjmp/ret sequence. Section is %s\n\n",
2184 (int) dot, sec->name);
2185 *again = TRUE;
2186 break;
2187 }
2188 }
2189 else if ((0x94 == (code_msb & 0xfe))
2190 && (0x0e == (code_lsb & 0x0e))
2191 && avr_replace_call_ret_sequences)
2192 {
2193 /* This insn is a call. */
2194 unsigned char next_insn_msb = 0;
2195 unsigned char next_insn_lsb = 0;
2196
2197 if (irel->r_offset + 5 < sec->size)
2198 {
2199 next_insn_msb =
2200 bfd_get_8 (abfd, contents + irel->r_offset + 5);
2201 next_insn_lsb =
2202 bfd_get_8 (abfd, contents + irel->r_offset + 4);
2203 }
2204
2205 if ((0x95 == next_insn_msb) && (0x08 == next_insn_lsb))
2206 {
2207 /* The next insn is a ret. We now convert the call insn
2208 into a jmp instruction. */
2209
2210 code_lsb &= 0xfd;
2211 bfd_put_8 (abfd, code_lsb, contents + irel->r_offset);
2212 if (debug_relax)
2213 printf ("converted call/ret sequence at address 0x%x"
2214 " into jmp/ret sequence. Section is %s\n\n",
2215 (int) dot, sec->name);
2216 *again = TRUE;
2217 break;
2218 }
2219 }
2220 else if ((0xc0 == (code_msb & 0xf0))
2221 || ((0x94 == (code_msb & 0xfe))
2222 && (0x0c == (code_lsb & 0x0e))))
2223 {
2224 /* This insn is a rjmp or a jmp. */
2225 unsigned char next_insn_msb = 0;
2226 unsigned char next_insn_lsb = 0;
2227 int insn_size;
2228
2229 if (0xc0 == (code_msb & 0xf0))
2230 insn_size = 2; /* rjmp insn */
2231 else
2232 insn_size = 4; /* jmp insn */
2233
2234 if (irel->r_offset + insn_size + 1 < sec->size)
2235 {
2236 next_insn_msb =
2237 bfd_get_8 (abfd, contents + irel->r_offset
2238 + insn_size + 1);
2239 next_insn_lsb =
2240 bfd_get_8 (abfd, contents + irel->r_offset
2241 + insn_size);
2242 }
2243
2244 if ((0x95 == next_insn_msb) && (0x08 == next_insn_lsb))
2245 {
2246 /* The next insn is a ret. We possibly could delete
2247 this ret. First we need to check for preceding
2248 sbis/sbic/sbrs or cpse "skip" instructions. */
2249
2250 int there_is_preceding_non_skip_insn = 1;
2251 bfd_vma address_of_ret;
2252
2253 address_of_ret = dot + insn_size;
2254
2255 if (debug_relax && (insn_size == 2))
2256 printf ("found rjmp / ret sequence at address 0x%x\n",
2257 (int) dot);
2258 if (debug_relax && (insn_size == 4))
2259 printf ("found jmp / ret sequence at address 0x%x\n",
2260 (int) dot);
2261
2262 /* We have to make sure that there is a preceding insn. */
2263 if (irel->r_offset >= 2)
2264 {
2265 unsigned char preceding_msb;
2266 unsigned char preceding_lsb;
2267
2268 preceding_msb =
2269 bfd_get_8 (abfd, contents + irel->r_offset - 1);
2270 preceding_lsb =
2271 bfd_get_8 (abfd, contents + irel->r_offset - 2);
2272
2273 /* sbic. */
2274 if (0x99 == preceding_msb)
2275 there_is_preceding_non_skip_insn = 0;
2276
2277 /* sbis. */
2278 if (0x9b == preceding_msb)
2279 there_is_preceding_non_skip_insn = 0;
2280
2281 /* sbrc */
2282 if ((0xfc == (preceding_msb & 0xfe)
2283 && (0x00 == (preceding_lsb & 0x08))))
2284 there_is_preceding_non_skip_insn = 0;
2285
2286 /* sbrs */
2287 if ((0xfe == (preceding_msb & 0xfe)
2288 && (0x00 == (preceding_lsb & 0x08))))
2289 there_is_preceding_non_skip_insn = 0;
2290
2291 /* cpse */
2292 if (0x10 == (preceding_msb & 0xfc))
2293 there_is_preceding_non_skip_insn = 0;
2294
2295 if (there_is_preceding_non_skip_insn == 0)
2296 if (debug_relax)
2297 printf ("preceding skip insn prevents deletion of"
2298 " ret insn at Addy 0x%x in section %s\n",
2299 (int) dot + 2, sec->name);
2300 }
2301 else
2302 {
2303 /* There is no previous instruction. */
2304 there_is_preceding_non_skip_insn = 0;
2305 }
2306
2307 if (there_is_preceding_non_skip_insn)
2308 {
2309 /* We now only have to make sure that there is no
2310 local label defined at the address of the ret
2311 instruction and that there is no local relocation
2312 in this section pointing to the ret. */
2313
2314 int deleting_ret_is_safe = 1;
2315 unsigned int section_offset_of_ret_insn =
2316 irel->r_offset + insn_size;
2317 Elf_Internal_Sym *isym, *isymend;
2318 unsigned int sec_shndx;
2319 struct bfd_section *isec;
2320
2321 sec_shndx =
2322 _bfd_elf_section_from_bfd_section (abfd, sec);
2323
2324 /* Check for local symbols. */
2325 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
2326 isymend = isym + symtab_hdr->sh_info;
2327 /* PR 6019: There may not be any local symbols. */
2328 for (; isym != NULL && isym < isymend; isym++)
2329 {
2330 if (isym->st_value == section_offset_of_ret_insn
2331 && isym->st_shndx == sec_shndx)
2332 {
2333 deleting_ret_is_safe = 0;
2334 if (debug_relax)
2335 printf ("local label prevents deletion of ret "
2336 "insn at address 0x%x\n",
2337 (int) dot + insn_size);
2338 }
2339 }
2340
2341 /* Now check for global symbols. */
2342 {
2343 int symcount;
2344 struct elf_link_hash_entry **sym_hashes;
2345 struct elf_link_hash_entry **end_hashes;
2346
2347 symcount = (symtab_hdr->sh_size
2348 / sizeof (Elf32_External_Sym)
2349 - symtab_hdr->sh_info);
2350 sym_hashes = elf_sym_hashes (abfd);
2351 end_hashes = sym_hashes + symcount;
2352 for (; sym_hashes < end_hashes; sym_hashes++)
2353 {
2354 struct elf_link_hash_entry *sym_hash =
2355 *sym_hashes;
2356 if ((sym_hash->root.type == bfd_link_hash_defined
2357 || sym_hash->root.type ==
2358 bfd_link_hash_defweak)
2359 && sym_hash->root.u.def.section == sec
2360 && sym_hash->root.u.def.value == section_offset_of_ret_insn)
2361 {
2362 deleting_ret_is_safe = 0;
2363 if (debug_relax)
2364 printf ("global label prevents deletion of "
2365 "ret insn at address 0x%x\n",
2366 (int) dot + insn_size);
2367 }
2368 }
2369 }
2370
2371 /* Now we check for relocations pointing to ret. */
2372 for (isec = abfd->sections; isec && deleting_ret_is_safe; isec = isec->next)
2373 {
2374 Elf_Internal_Rela *rel;
2375 Elf_Internal_Rela *relend;
2376
2377 rel = elf_section_data (isec)->relocs;
2378 if (rel == NULL)
2379 rel = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL, TRUE);
2380
2381 relend = rel + isec->reloc_count;
2382
2383 for (; rel && rel < relend; rel++)
2384 {
2385 bfd_vma reloc_target = 0;
2386
2387 /* Read this BFD's local symbols if we haven't
2388 done so already. */
2389 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
2390 {
2391 isymbuf = (Elf_Internal_Sym *)
2392 symtab_hdr->contents;
2393 if (isymbuf == NULL)
2394 isymbuf = bfd_elf_get_elf_syms
2395 (abfd,
2396 symtab_hdr,
2397 symtab_hdr->sh_info, 0,
2398 NULL, NULL, NULL);
2399 if (isymbuf == NULL)
2400 break;
2401 }
2402
2403 /* Get the value of the symbol referred to
2404 by the reloc. */
2405 if (ELF32_R_SYM (rel->r_info)
2406 < symtab_hdr->sh_info)
2407 {
2408 /* A local symbol. */
2409 asection *sym_sec;
2410
2411 isym = isymbuf
2412 + ELF32_R_SYM (rel->r_info);
2413 sym_sec = bfd_section_from_elf_index
2414 (abfd, isym->st_shndx);
2415 symval = isym->st_value;
2416
2417 /* If the reloc is absolute, it will not
2418 have a symbol or section associated
2419 with it. */
2420
2421 if (sym_sec)
2422 {
2423 symval +=
2424 sym_sec->output_section->vma
2425 + sym_sec->output_offset;
2426 reloc_target = symval + rel->r_addend;
2427 }
2428 else
2429 {
2430 reloc_target = symval + rel->r_addend;
2431 /* Reference symbol is absolute. */
2432 }
2433 }
2434 /* else ... reference symbol is extern. */
2435
2436 if (address_of_ret == reloc_target)
2437 {
2438 deleting_ret_is_safe = 0;
2439 if (debug_relax)
2440 printf ("ret from "
2441 "rjmp/jmp ret sequence at address"
2442 " 0x%x could not be deleted. ret"
2443 " is target of a relocation.\n",
2444 (int) address_of_ret);
2445 break;
2446 }
2447 }
2448 }
2449
2450 if (deleting_ret_is_safe)
2451 {
2452 if (debug_relax)
2453 printf ("unreachable ret instruction "
2454 "at address 0x%x deleted.\n",
2455 (int) dot + insn_size);
2456
2457 /* Delete two bytes of data. */
2458 if (!elf32_avr_relax_delete_bytes (abfd, sec,
2459 irel->r_offset + insn_size, 2))
2460 goto error_return;
2461
2462 /* That will change things, so, we should relax
2463 again. Note that this is not required, and it
2464 may be slow. */
2465 *again = TRUE;
2466 break;
2467 }
2468 }
2469 }
2470 }
2471 break;
2472 }
2473 }
2474 }
2475
2476 if (contents != NULL
2477 && elf_section_data (sec)->this_hdr.contents != contents)
2478 {
2479 if (! link_info->keep_memory)
2480 free (contents);
2481 else
2482 {
2483 /* Cache the section contents for elf_link_input_bfd. */
2484 elf_section_data (sec)->this_hdr.contents = contents;
2485 }
2486 }
2487
2488 if (internal_relocs != NULL
2489 && elf_section_data (sec)->relocs != internal_relocs)
2490 free (internal_relocs);
2491
2492 return TRUE;
2493
2494 error_return:
2495 if (isymbuf != NULL
2496 && symtab_hdr->contents != (unsigned char *) isymbuf)
2497 free (isymbuf);
2498 if (contents != NULL
2499 && elf_section_data (sec)->this_hdr.contents != contents)
2500 free (contents);
2501 if (internal_relocs != NULL
2502 && elf_section_data (sec)->relocs != internal_relocs)
2503 free (internal_relocs);
2504
2505 return FALSE;
2506 }
2507
2508 /* This is a version of bfd_generic_get_relocated_section_contents
2509 which uses elf32_avr_relocate_section.
2510
2511 For avr it's essentially a cut and paste taken from the H8300 port.
2512 The author of the relaxation support patch for avr had absolutely no
2513 clue what is happening here but found out that this part of the code
2514 seems to be important. */
2515
2516 static bfd_byte *
2517 elf32_avr_get_relocated_section_contents (bfd *output_bfd,
2518 struct bfd_link_info *link_info,
2519 struct bfd_link_order *link_order,
2520 bfd_byte *data,
2521 bfd_boolean relocatable,
2522 asymbol **symbols)
2523 {
2524 Elf_Internal_Shdr *symtab_hdr;
2525 asection *input_section = link_order->u.indirect.section;
2526 bfd *input_bfd = input_section->owner;
2527 asection **sections = NULL;
2528 Elf_Internal_Rela *internal_relocs = NULL;
2529 Elf_Internal_Sym *isymbuf = NULL;
2530
2531 /* We only need to handle the case of relaxing, or of having a
2532 particular set of section contents, specially. */
2533 if (relocatable
2534 || elf_section_data (input_section)->this_hdr.contents == NULL)
2535 return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
2536 link_order, data,
2537 relocatable,
2538 symbols);
2539 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2540
2541 memcpy (data, elf_section_data (input_section)->this_hdr.contents,
2542 (size_t) input_section->size);
2543
2544 if ((input_section->flags & SEC_RELOC) != 0
2545 && input_section->reloc_count > 0)
2546 {
2547 asection **secpp;
2548 Elf_Internal_Sym *isym, *isymend;
2549 bfd_size_type amt;
2550
2551 internal_relocs = (_bfd_elf_link_read_relocs
2552 (input_bfd, input_section, NULL, NULL, FALSE));
2553 if (internal_relocs == NULL)
2554 goto error_return;
2555
2556 if (symtab_hdr->sh_info != 0)
2557 {
2558 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
2559 if (isymbuf == NULL)
2560 isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2561 symtab_hdr->sh_info, 0,
2562 NULL, NULL, NULL);
2563 if (isymbuf == NULL)
2564 goto error_return;
2565 }
2566
2567 amt = symtab_hdr->sh_info;
2568 amt *= sizeof (asection *);
2569 sections = bfd_malloc (amt);
2570 if (sections == NULL && amt != 0)
2571 goto error_return;
2572
2573 isymend = isymbuf + symtab_hdr->sh_info;
2574 for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
2575 {
2576 asection *isec;
2577
2578 if (isym->st_shndx == SHN_UNDEF)
2579 isec = bfd_und_section_ptr;
2580 else if (isym->st_shndx == SHN_ABS)
2581 isec = bfd_abs_section_ptr;
2582 else if (isym->st_shndx == SHN_COMMON)
2583 isec = bfd_com_section_ptr;
2584 else
2585 isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
2586
2587 *secpp = isec;
2588 }
2589
2590 if (! elf32_avr_relocate_section (output_bfd, link_info, input_bfd,
2591 input_section, data, internal_relocs,
2592 isymbuf, sections))
2593 goto error_return;
2594
2595 if (sections != NULL)
2596 free (sections);
2597 if (isymbuf != NULL
2598 && symtab_hdr->contents != (unsigned char *) isymbuf)
2599 free (isymbuf);
2600 if (elf_section_data (input_section)->relocs != internal_relocs)
2601 free (internal_relocs);
2602 }
2603
2604 return data;
2605
2606 error_return:
2607 if (sections != NULL)
2608 free (sections);
2609 if (isymbuf != NULL
2610 && symtab_hdr->contents != (unsigned char *) isymbuf)
2611 free (isymbuf);
2612 if (internal_relocs != NULL
2613 && elf_section_data (input_section)->relocs != internal_relocs)
2614 free (internal_relocs);
2615 return NULL;
2616 }
2617
2618
2619 /* Determines the hash entry name for a particular reloc. It consists of
2620 the identifier of the symbol section and the added reloc addend and
2621 symbol offset relative to the section the symbol is attached to. */
2622
2623 static char *
2624 avr_stub_name (const asection *symbol_section,
2625 const bfd_vma symbol_offset,
2626 const Elf_Internal_Rela *rela)
2627 {
2628 char *stub_name;
2629 bfd_size_type len;
2630
2631 len = 8 + 1 + 8 + 1 + 1;
2632 stub_name = bfd_malloc (len);
2633
2634 sprintf (stub_name, "%08x+%08x",
2635 symbol_section->id & 0xffffffff,
2636 (unsigned int) ((rela->r_addend & 0xffffffff) + symbol_offset));
2637
2638 return stub_name;
2639 }
2640
2641
2642 /* Add a new stub entry to the stub hash. Not all fields of the new
2643 stub entry are initialised. */
2644
2645 static struct elf32_avr_stub_hash_entry *
2646 avr_add_stub (const char *stub_name,
2647 struct elf32_avr_link_hash_table *htab)
2648 {
2649 struct elf32_avr_stub_hash_entry *hsh;
2650
2651 /* Enter this entry into the linker stub hash table. */
2652 hsh = avr_stub_hash_lookup (&htab->bstab, stub_name, TRUE, FALSE);
2653
2654 if (hsh == NULL)
2655 {
2656 (*_bfd_error_handler) (_("%B: cannot create stub entry %s"),
2657 NULL, stub_name);
2658 return NULL;
2659 }
2660
2661 hsh->stub_offset = 0;
2662 return hsh;
2663 }
2664
2665 /* We assume that there is already space allocated for the stub section
2666 contents and that before building the stubs the section size is
2667 initialized to 0. We assume that within the stub hash table entry,
2668 the absolute position of the jmp target has been written in the
2669 target_value field. We write here the offset of the generated jmp insn
2670 relative to the trampoline section start to the stub_offset entry in
2671 the stub hash table entry. */
2672
2673 static bfd_boolean
2674 avr_build_one_stub (struct bfd_hash_entry *bh, void *in_arg)
2675 {
2676 struct elf32_avr_stub_hash_entry *hsh;
2677 struct bfd_link_info *info;
2678 struct elf32_avr_link_hash_table *htab;
2679 bfd *stub_bfd;
2680 bfd_byte *loc;
2681 bfd_vma target;
2682 bfd_vma starget;
2683
2684 /* Basic opcode */
2685 bfd_vma jmp_insn = 0x0000940c;
2686
2687 /* Massage our args to the form they really have. */
2688 hsh = avr_stub_hash_entry (bh);
2689
2690 if (!hsh->is_actually_needed)
2691 return TRUE;
2692
2693 info = (struct bfd_link_info *) in_arg;
2694
2695 htab = avr_link_hash_table (info);
2696 if (htab == NULL)
2697 return FALSE;
2698
2699 target = hsh->target_value;
2700
2701 /* Make a note of the offset within the stubs for this entry. */
2702 hsh->stub_offset = htab->stub_sec->size;
2703 loc = htab->stub_sec->contents + hsh->stub_offset;
2704
2705 stub_bfd = htab->stub_sec->owner;
2706
2707 if (debug_stubs)
2708 printf ("Building one Stub. Address: 0x%x, Offset: 0x%x\n",
2709 (unsigned int) target,
2710 (unsigned int) hsh->stub_offset);
2711
2712 /* We now have to add the information on the jump target to the bare
2713 opcode bits already set in jmp_insn. */
2714
2715 /* Check for the alignment of the address. */
2716 if (target & 1)
2717 return FALSE;
2718
2719 starget = target >> 1;
2720 jmp_insn |= ((starget & 0x10000) | ((starget << 3) & 0x1f00000)) >> 16;
2721 bfd_put_16 (stub_bfd, jmp_insn, loc);
2722 bfd_put_16 (stub_bfd, (bfd_vma) starget & 0xffff, loc + 2);
2723
2724 htab->stub_sec->size += 4;
2725
2726 /* Now add the entries in the address mapping table if there is still
2727 space left. */
2728 {
2729 unsigned int nr;
2730
2731 nr = htab->amt_entry_cnt + 1;
2732 if (nr <= htab->amt_max_entry_cnt)
2733 {
2734 htab->amt_entry_cnt = nr;
2735
2736 htab->amt_stub_offsets[nr - 1] = hsh->stub_offset;
2737 htab->amt_destination_addr[nr - 1] = target;
2738 }
2739 }
2740
2741 return TRUE;
2742 }
2743
2744 static bfd_boolean
2745 avr_mark_stub_not_to_be_necessary (struct bfd_hash_entry *bh,
2746 void *in_arg ATTRIBUTE_UNUSED)
2747 {
2748 struct elf32_avr_stub_hash_entry *hsh;
2749
2750 hsh = avr_stub_hash_entry (bh);
2751 hsh->is_actually_needed = FALSE;
2752
2753 return TRUE;
2754 }
2755
2756 static bfd_boolean
2757 avr_size_one_stub (struct bfd_hash_entry *bh, void *in_arg)
2758 {
2759 struct elf32_avr_stub_hash_entry *hsh;
2760 struct elf32_avr_link_hash_table *htab;
2761 int size;
2762
2763 /* Massage our args to the form they really have. */
2764 hsh = avr_stub_hash_entry (bh);
2765 htab = in_arg;
2766
2767 if (hsh->is_actually_needed)
2768 size = 4;
2769 else
2770 size = 0;
2771
2772 htab->stub_sec->size += size;
2773 return TRUE;
2774 }
2775
2776 void
2777 elf32_avr_setup_params (struct bfd_link_info *info,
2778 bfd *avr_stub_bfd,
2779 asection *avr_stub_section,
2780 bfd_boolean no_stubs,
2781 bfd_boolean deb_stubs,
2782 bfd_boolean deb_relax,
2783 bfd_vma pc_wrap_around,
2784 bfd_boolean call_ret_replacement)
2785 {
2786 struct elf32_avr_link_hash_table *htab = avr_link_hash_table (info);
2787
2788 if (htab == NULL)
2789 return;
2790 htab->stub_sec = avr_stub_section;
2791 htab->stub_bfd = avr_stub_bfd;
2792 htab->no_stubs = no_stubs;
2793
2794 debug_relax = deb_relax;
2795 debug_stubs = deb_stubs;
2796 avr_pc_wrap_around = pc_wrap_around;
2797 avr_replace_call_ret_sequences = call_ret_replacement;
2798 }
2799
2800
2801 /* Set up various things so that we can make a list of input sections
2802 for each output section included in the link. Returns -1 on error,
2803 0 when no stubs will be needed, and 1 on success. It also sets
2804 information on the stubs bfd and the stub section in the info
2805 struct. */
2806
2807 int
2808 elf32_avr_setup_section_lists (bfd *output_bfd,
2809 struct bfd_link_info *info)
2810 {
2811 bfd *input_bfd;
2812 unsigned int bfd_count;
2813 int top_id, top_index;
2814 asection *section;
2815 asection **input_list, **list;
2816 bfd_size_type amt;
2817 struct elf32_avr_link_hash_table *htab = avr_link_hash_table (info);
2818
2819 if (htab == NULL || htab->no_stubs)
2820 return 0;
2821
2822 /* Count the number of input BFDs and find the top input section id. */
2823 for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
2824 input_bfd != NULL;
2825 input_bfd = input_bfd->link.next)
2826 {
2827 bfd_count += 1;
2828 for (section = input_bfd->sections;
2829 section != NULL;
2830 section = section->next)
2831 if (top_id < section->id)
2832 top_id = section->id;
2833 }
2834
2835 htab->bfd_count = bfd_count;
2836
2837 /* We can't use output_bfd->section_count here to find the top output
2838 section index as some sections may have been removed, and
2839 strip_excluded_output_sections doesn't renumber the indices. */
2840 for (section = output_bfd->sections, top_index = 0;
2841 section != NULL;
2842 section = section->next)
2843 if (top_index < section->index)
2844 top_index = section->index;
2845
2846 htab->top_index = top_index;
2847 amt = sizeof (asection *) * (top_index + 1);
2848 input_list = bfd_malloc (amt);
2849 htab->input_list = input_list;
2850 if (input_list == NULL)
2851 return -1;
2852
2853 /* For sections we aren't interested in, mark their entries with a
2854 value we can check later. */
2855 list = input_list + top_index;
2856 do
2857 *list = bfd_abs_section_ptr;
2858 while (list-- != input_list);
2859
2860 for (section = output_bfd->sections;
2861 section != NULL;
2862 section = section->next)
2863 if ((section->flags & SEC_CODE) != 0)
2864 input_list[section->index] = NULL;
2865
2866 return 1;
2867 }
2868
2869
2870 /* Read in all local syms for all input bfds, and create hash entries
2871 for export stubs if we are building a multi-subspace shared lib.
2872 Returns -1 on error, 0 otherwise. */
2873
2874 static int
2875 get_local_syms (bfd *input_bfd, struct bfd_link_info *info)
2876 {
2877 unsigned int bfd_indx;
2878 Elf_Internal_Sym *local_syms, **all_local_syms;
2879 struct elf32_avr_link_hash_table *htab = avr_link_hash_table (info);
2880 bfd_size_type amt;
2881
2882 if (htab == NULL)
2883 return -1;
2884
2885 /* We want to read in symbol extension records only once. To do this
2886 we need to read in the local symbols in parallel and save them for
2887 later use; so hold pointers to the local symbols in an array. */
2888 amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
2889 all_local_syms = bfd_zmalloc (amt);
2890 htab->all_local_syms = all_local_syms;
2891 if (all_local_syms == NULL)
2892 return -1;
2893
2894 /* Walk over all the input BFDs, swapping in local symbols.
2895 If we are creating a shared library, create hash entries for the
2896 export stubs. */
2897 for (bfd_indx = 0;
2898 input_bfd != NULL;
2899 input_bfd = input_bfd->link.next, bfd_indx++)
2900 {
2901 Elf_Internal_Shdr *symtab_hdr;
2902
2903 /* We'll need the symbol table in a second. */
2904 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2905 if (symtab_hdr->sh_info == 0)
2906 continue;
2907
2908 /* We need an array of the local symbols attached to the input bfd. */
2909 local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
2910 if (local_syms == NULL)
2911 {
2912 local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2913 symtab_hdr->sh_info, 0,
2914 NULL, NULL, NULL);
2915 /* Cache them for elf_link_input_bfd. */
2916 symtab_hdr->contents = (unsigned char *) local_syms;
2917 }
2918 if (local_syms == NULL)
2919 return -1;
2920
2921 all_local_syms[bfd_indx] = local_syms;
2922 }
2923
2924 return 0;
2925 }
2926
2927 #define ADD_DUMMY_STUBS_FOR_DEBUGGING 0
2928
2929 bfd_boolean
2930 elf32_avr_size_stubs (bfd *output_bfd,
2931 struct bfd_link_info *info,
2932 bfd_boolean is_prealloc_run)
2933 {
2934 struct elf32_avr_link_hash_table *htab;
2935 int stub_changed = 0;
2936
2937 htab = avr_link_hash_table (info);
2938 if (htab == NULL)
2939 return FALSE;
2940
2941 /* At this point we initialize htab->vector_base
2942 To the start of the text output section. */
2943 htab->vector_base = htab->stub_sec->output_section->vma;
2944
2945 if (get_local_syms (info->input_bfds, info))
2946 {
2947 if (htab->all_local_syms)
2948 goto error_ret_free_local;
2949 return FALSE;
2950 }
2951
2952 if (ADD_DUMMY_STUBS_FOR_DEBUGGING)
2953 {
2954 struct elf32_avr_stub_hash_entry *test;
2955
2956 test = avr_add_stub ("Hugo",htab);
2957 test->target_value = 0x123456;
2958 test->stub_offset = 13;
2959
2960 test = avr_add_stub ("Hugo2",htab);
2961 test->target_value = 0x84210;
2962 test->stub_offset = 14;
2963 }
2964
2965 while (1)
2966 {
2967 bfd *input_bfd;
2968 unsigned int bfd_indx;
2969
2970 /* We will have to re-generate the stub hash table each time anything
2971 in memory has changed. */
2972
2973 bfd_hash_traverse (&htab->bstab, avr_mark_stub_not_to_be_necessary, htab);
2974 for (input_bfd = info->input_bfds, bfd_indx = 0;
2975 input_bfd != NULL;
2976 input_bfd = input_bfd->link.next, bfd_indx++)
2977 {
2978 Elf_Internal_Shdr *symtab_hdr;
2979 asection *section;
2980 Elf_Internal_Sym *local_syms;
2981
2982 /* We'll need the symbol table in a second. */
2983 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2984 if (symtab_hdr->sh_info == 0)
2985 continue;
2986
2987 local_syms = htab->all_local_syms[bfd_indx];
2988
2989 /* Walk over each section attached to the input bfd. */
2990 for (section = input_bfd->sections;
2991 section != NULL;
2992 section = section->next)
2993 {
2994 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2995
2996 /* If there aren't any relocs, then there's nothing more
2997 to do. */
2998 if ((section->flags & SEC_RELOC) == 0
2999 || section->reloc_count == 0)
3000 continue;
3001
3002 /* If this section is a link-once section that will be
3003 discarded, then don't create any stubs. */
3004 if (section->output_section == NULL
3005 || section->output_section->owner != output_bfd)
3006 continue;
3007
3008 /* Get the relocs. */
3009 internal_relocs
3010 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
3011 info->keep_memory);
3012 if (internal_relocs == NULL)
3013 goto error_ret_free_local;
3014
3015 /* Now examine each relocation. */
3016 irela = internal_relocs;
3017 irelaend = irela + section->reloc_count;
3018 for (; irela < irelaend; irela++)
3019 {
3020 unsigned int r_type, r_indx;
3021 struct elf32_avr_stub_hash_entry *hsh;
3022 asection *sym_sec;
3023 bfd_vma sym_value;
3024 bfd_vma destination;
3025 struct elf_link_hash_entry *hh;
3026 char *stub_name;
3027
3028 r_type = ELF32_R_TYPE (irela->r_info);
3029 r_indx = ELF32_R_SYM (irela->r_info);
3030
3031 /* Only look for 16 bit GS relocs. No other reloc will need a
3032 stub. */
3033 if (!((r_type == R_AVR_16_PM)
3034 || (r_type == R_AVR_LO8_LDI_GS)
3035 || (r_type == R_AVR_HI8_LDI_GS)))
3036 continue;
3037
3038 /* Now determine the call target, its name, value,
3039 section. */
3040 sym_sec = NULL;
3041 sym_value = 0;
3042 destination = 0;
3043 hh = NULL;
3044 if (r_indx < symtab_hdr->sh_info)
3045 {
3046 /* It's a local symbol. */
3047 Elf_Internal_Sym *sym;
3048 Elf_Internal_Shdr *hdr;
3049 unsigned int shndx;
3050
3051 sym = local_syms + r_indx;
3052 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
3053 sym_value = sym->st_value;
3054 shndx = sym->st_shndx;
3055 if (shndx < elf_numsections (input_bfd))
3056 {
3057 hdr = elf_elfsections (input_bfd)[shndx];
3058 sym_sec = hdr->bfd_section;
3059 destination = (sym_value + irela->r_addend
3060 + sym_sec->output_offset
3061 + sym_sec->output_section->vma);
3062 }
3063 }
3064 else
3065 {
3066 /* It's an external symbol. */
3067 int e_indx;
3068
3069 e_indx = r_indx - symtab_hdr->sh_info;
3070 hh = elf_sym_hashes (input_bfd)[e_indx];
3071
3072 while (hh->root.type == bfd_link_hash_indirect
3073 || hh->root.type == bfd_link_hash_warning)
3074 hh = (struct elf_link_hash_entry *)
3075 (hh->root.u.i.link);
3076
3077 if (hh->root.type == bfd_link_hash_defined
3078 || hh->root.type == bfd_link_hash_defweak)
3079 {
3080 sym_sec = hh->root.u.def.section;
3081 sym_value = hh->root.u.def.value;
3082 if (sym_sec->output_section != NULL)
3083 destination = (sym_value + irela->r_addend
3084 + sym_sec->output_offset
3085 + sym_sec->output_section->vma);
3086 }
3087 else if (hh->root.type == bfd_link_hash_undefweak)
3088 {
3089 if (! info->shared)
3090 continue;
3091 }
3092 else if (hh->root.type == bfd_link_hash_undefined)
3093 {
3094 if (! (info->unresolved_syms_in_objects == RM_IGNORE
3095 && (ELF_ST_VISIBILITY (hh->other)
3096 == STV_DEFAULT)))
3097 continue;
3098 }
3099 else
3100 {
3101 bfd_set_error (bfd_error_bad_value);
3102
3103 error_ret_free_internal:
3104 if (elf_section_data (section)->relocs == NULL)
3105 free (internal_relocs);
3106 goto error_ret_free_local;
3107 }
3108 }
3109
3110 if (! avr_stub_is_required_for_16_bit_reloc
3111 (destination - htab->vector_base))
3112 {
3113 if (!is_prealloc_run)
3114 /* We are having a reloc that does't need a stub. */
3115 continue;
3116
3117 /* We don't right now know if a stub will be needed.
3118 Let's rather be on the safe side. */
3119 }
3120
3121 /* Get the name of this stub. */
3122 stub_name = avr_stub_name (sym_sec, sym_value, irela);
3123
3124 if (!stub_name)
3125 goto error_ret_free_internal;
3126
3127
3128 hsh = avr_stub_hash_lookup (&htab->bstab,
3129 stub_name,
3130 FALSE, FALSE);
3131 if (hsh != NULL)
3132 {
3133 /* The proper stub has already been created. Mark it
3134 to be used and write the possibly changed destination
3135 value. */
3136 hsh->is_actually_needed = TRUE;
3137 hsh->target_value = destination;
3138 free (stub_name);
3139 continue;
3140 }
3141
3142 hsh = avr_add_stub (stub_name, htab);
3143 if (hsh == NULL)
3144 {
3145 free (stub_name);
3146 goto error_ret_free_internal;
3147 }
3148
3149 hsh->is_actually_needed = TRUE;
3150 hsh->target_value = destination;
3151
3152 if (debug_stubs)
3153 printf ("Adding stub with destination 0x%x to the"
3154 " hash table.\n", (unsigned int) destination);
3155 if (debug_stubs)
3156 printf ("(Pre-Alloc run: %i)\n", is_prealloc_run);
3157
3158 stub_changed = TRUE;
3159 }
3160
3161 /* We're done with the internal relocs, free them. */
3162 if (elf_section_data (section)->relocs == NULL)
3163 free (internal_relocs);
3164 }
3165 }
3166
3167 /* Re-Calculate the number of needed stubs. */
3168 htab->stub_sec->size = 0;
3169 bfd_hash_traverse (&htab->bstab, avr_size_one_stub, htab);
3170
3171 if (!stub_changed)
3172 break;
3173
3174 stub_changed = FALSE;
3175 }
3176
3177 free (htab->all_local_syms);
3178 return TRUE;
3179
3180 error_ret_free_local:
3181 free (htab->all_local_syms);
3182 return FALSE;
3183 }
3184
3185
3186 /* Build all the stubs associated with the current output file. The
3187 stubs are kept in a hash table attached to the main linker hash
3188 table. We also set up the .plt entries for statically linked PIC
3189 functions here. This function is called via hppaelf_finish in the
3190 linker. */
3191
3192 bfd_boolean
3193 elf32_avr_build_stubs (struct bfd_link_info *info)
3194 {
3195 asection *stub_sec;
3196 struct bfd_hash_table *table;
3197 struct elf32_avr_link_hash_table *htab;
3198 bfd_size_type total_size = 0;
3199
3200 htab = avr_link_hash_table (info);
3201 if (htab == NULL)
3202 return FALSE;
3203
3204 /* In case that there were several stub sections: */
3205 for (stub_sec = htab->stub_bfd->sections;
3206 stub_sec != NULL;
3207 stub_sec = stub_sec->next)
3208 {
3209 bfd_size_type size;
3210
3211 /* Allocate memory to hold the linker stubs. */
3212 size = stub_sec->size;
3213 total_size += size;
3214
3215 stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
3216 if (stub_sec->contents == NULL && size != 0)
3217 return FALSE;
3218 stub_sec->size = 0;
3219 }
3220
3221 /* Allocate memory for the adress mapping table. */
3222 htab->amt_entry_cnt = 0;
3223 htab->amt_max_entry_cnt = total_size / 4;
3224 htab->amt_stub_offsets = bfd_malloc (sizeof (bfd_vma)
3225 * htab->amt_max_entry_cnt);
3226 htab->amt_destination_addr = bfd_malloc (sizeof (bfd_vma)
3227 * htab->amt_max_entry_cnt );
3228
3229 if (debug_stubs)
3230 printf ("Allocating %i entries in the AMT\n", htab->amt_max_entry_cnt);
3231
3232 /* Build the stubs as directed by the stub hash table. */
3233 table = &htab->bstab;
3234 bfd_hash_traverse (table, avr_build_one_stub, info);
3235
3236 if (debug_stubs)
3237 printf ("Final Stub section Size: %i\n", (int) htab->stub_sec->size);
3238
3239 return TRUE;
3240 }
3241
3242 #define ELF_ARCH bfd_arch_avr
3243 #define ELF_TARGET_ID AVR_ELF_DATA
3244 #define ELF_MACHINE_CODE EM_AVR
3245 #define ELF_MACHINE_ALT1 EM_AVR_OLD
3246 #define ELF_MAXPAGESIZE 1
3247
3248 #define TARGET_LITTLE_SYM avr_elf32_vec
3249 #define TARGET_LITTLE_NAME "elf32-avr"
3250
3251 #define bfd_elf32_bfd_link_hash_table_create elf32_avr_link_hash_table_create
3252 #define bfd_elf32_bfd_link_hash_table_free elf32_avr_link_hash_table_free
3253
3254 #define elf_info_to_howto avr_info_to_howto_rela
3255 #define elf_info_to_howto_rel NULL
3256 #define elf_backend_relocate_section elf32_avr_relocate_section
3257 #define elf_backend_can_gc_sections 1
3258 #define elf_backend_rela_normal 1
3259 #define elf_backend_final_write_processing \
3260 bfd_elf_avr_final_write_processing
3261 #define elf_backend_object_p elf32_avr_object_p
3262
3263 #define bfd_elf32_bfd_relax_section elf32_avr_relax_section
3264 #define bfd_elf32_bfd_get_relocated_section_contents \
3265 elf32_avr_get_relocated_section_contents
3266
3267 #include "elf32-target.h"
This page took 0.123515 seconds and 5 git commands to generate.