Don't call bfd_link_hash_table_free
[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 /* Free the derived linker hash table. */
715
716 static void
717 elf32_avr_link_hash_table_free (struct bfd_link_hash_table *btab)
718 {
719 struct elf32_avr_link_hash_table *htab
720 = (struct elf32_avr_link_hash_table *) btab;
721
722 /* Free the address mapping table. */
723 if (htab->amt_stub_offsets != NULL)
724 free (htab->amt_stub_offsets);
725 if (htab->amt_destination_addr != NULL)
726 free (htab->amt_destination_addr);
727
728 bfd_hash_table_free (&htab->bstab);
729 _bfd_elf_link_hash_table_free (btab);
730 }
731
732 /* Create the derived linker hash table. The AVR ELF port uses the derived
733 hash table to keep information specific to the AVR ELF linker (without
734 using static variables). */
735
736 static struct bfd_link_hash_table *
737 elf32_avr_link_hash_table_create (bfd *abfd)
738 {
739 struct elf32_avr_link_hash_table *htab;
740 bfd_size_type amt = sizeof (*htab);
741
742 htab = bfd_zmalloc (amt);
743 if (htab == NULL)
744 return NULL;
745
746 if (!_bfd_elf_link_hash_table_init (&htab->etab, abfd,
747 elf32_avr_link_hash_newfunc,
748 sizeof (struct elf_link_hash_entry),
749 AVR_ELF_DATA))
750 {
751 free (htab);
752 return NULL;
753 }
754
755 /* Init the stub hash table too. */
756 if (!bfd_hash_table_init (&htab->bstab, stub_hash_newfunc,
757 sizeof (struct elf32_avr_stub_hash_entry)))
758 return NULL;
759 (void) elf32_avr_link_hash_table_free;
760
761 return &htab->etab.root;
762 }
763
764 /* Calculates the effective distance of a pc relative jump/call. */
765
766 static int
767 avr_relative_distance_considering_wrap_around (unsigned int distance)
768 {
769 unsigned int wrap_around_mask = avr_pc_wrap_around - 1;
770 int dist_with_wrap_around = distance & wrap_around_mask;
771
772 if (dist_with_wrap_around > ((int) (avr_pc_wrap_around >> 1)))
773 dist_with_wrap_around -= avr_pc_wrap_around;
774
775 return dist_with_wrap_around;
776 }
777
778
779 static reloc_howto_type *
780 bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
781 bfd_reloc_code_real_type code)
782 {
783 unsigned int i;
784
785 for (i = 0;
786 i < sizeof (avr_reloc_map) / sizeof (struct avr_reloc_map);
787 i++)
788 if (avr_reloc_map[i].bfd_reloc_val == code)
789 return &elf_avr_howto_table[avr_reloc_map[i].elf_reloc_val];
790
791 return NULL;
792 }
793
794 static reloc_howto_type *
795 bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
796 const char *r_name)
797 {
798 unsigned int i;
799
800 for (i = 0;
801 i < sizeof (elf_avr_howto_table) / sizeof (elf_avr_howto_table[0]);
802 i++)
803 if (elf_avr_howto_table[i].name != NULL
804 && strcasecmp (elf_avr_howto_table[i].name, r_name) == 0)
805 return &elf_avr_howto_table[i];
806
807 return NULL;
808 }
809
810 /* Set the howto pointer for an AVR ELF reloc. */
811
812 static void
813 avr_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
814 arelent *cache_ptr,
815 Elf_Internal_Rela *dst)
816 {
817 unsigned int r_type;
818
819 r_type = ELF32_R_TYPE (dst->r_info);
820 BFD_ASSERT (r_type < (unsigned int) R_AVR_max);
821 cache_ptr->howto = &elf_avr_howto_table[r_type];
822 }
823
824 static bfd_boolean
825 avr_stub_is_required_for_16_bit_reloc (bfd_vma relocation)
826 {
827 return (relocation >= 0x020000);
828 }
829
830 /* Returns the address of the corresponding stub if there is one.
831 Returns otherwise an address above 0x020000. This function
832 could also be used, if there is no knowledge on the section where
833 the destination is found. */
834
835 static bfd_vma
836 avr_get_stub_addr (bfd_vma srel,
837 struct elf32_avr_link_hash_table *htab)
838 {
839 unsigned int sindex;
840 bfd_vma stub_sec_addr =
841 (htab->stub_sec->output_section->vma +
842 htab->stub_sec->output_offset);
843
844 for (sindex = 0; sindex < htab->amt_max_entry_cnt; sindex ++)
845 if (htab->amt_destination_addr[sindex] == srel)
846 return htab->amt_stub_offsets[sindex] + stub_sec_addr;
847
848 /* Return an address that could not be reached by 16 bit relocs. */
849 return 0x020000;
850 }
851
852 /* Perform a diff relocation. Nothing to do, as the difference value is already
853 written into the section's contents. */
854
855 static bfd_reloc_status_type
856 bfd_elf_avr_diff_reloc (bfd *abfd ATTRIBUTE_UNUSED,
857 arelent *reloc_entry ATTRIBUTE_UNUSED,
858 asymbol *symbol ATTRIBUTE_UNUSED,
859 void *data ATTRIBUTE_UNUSED,
860 asection *input_section ATTRIBUTE_UNUSED,
861 bfd *output_bfd ATTRIBUTE_UNUSED,
862 char **error_message ATTRIBUTE_UNUSED)
863 {
864 return bfd_reloc_ok;
865 }
866
867
868 /* Perform a single relocation. By default we use the standard BFD
869 routines, but a few relocs, we have to do them ourselves. */
870
871 static bfd_reloc_status_type
872 avr_final_link_relocate (reloc_howto_type * howto,
873 bfd * input_bfd,
874 asection * input_section,
875 bfd_byte * contents,
876 Elf_Internal_Rela * rel,
877 bfd_vma relocation,
878 struct elf32_avr_link_hash_table * htab)
879 {
880 bfd_reloc_status_type r = bfd_reloc_ok;
881 bfd_vma x;
882 bfd_signed_vma srel;
883 bfd_signed_vma reloc_addr;
884 bfd_boolean use_stubs = FALSE;
885 /* Usually is 0, unless we are generating code for a bootloader. */
886 bfd_signed_vma base_addr = htab->vector_base;
887
888 /* Absolute addr of the reloc in the final excecutable. */
889 reloc_addr = rel->r_offset + input_section->output_section->vma
890 + input_section->output_offset;
891
892 switch (howto->type)
893 {
894 case R_AVR_7_PCREL:
895 contents += rel->r_offset;
896 srel = (bfd_signed_vma) relocation;
897 srel += rel->r_addend;
898 srel -= rel->r_offset;
899 srel -= 2; /* Branch instructions add 2 to the PC... */
900 srel -= (input_section->output_section->vma +
901 input_section->output_offset);
902
903 if (srel & 1)
904 return bfd_reloc_outofrange;
905 if (srel > ((1 << 7) - 1) || (srel < - (1 << 7)))
906 return bfd_reloc_overflow;
907 x = bfd_get_16 (input_bfd, contents);
908 x = (x & 0xfc07) | (((srel >> 1) << 3) & 0x3f8);
909 bfd_put_16 (input_bfd, x, contents);
910 break;
911
912 case R_AVR_13_PCREL:
913 contents += rel->r_offset;
914 srel = (bfd_signed_vma) relocation;
915 srel += rel->r_addend;
916 srel -= rel->r_offset;
917 srel -= 2; /* Branch instructions add 2 to the PC... */
918 srel -= (input_section->output_section->vma +
919 input_section->output_offset);
920
921 if (srel & 1)
922 return bfd_reloc_outofrange;
923
924 srel = avr_relative_distance_considering_wrap_around (srel);
925
926 /* AVR addresses commands as words. */
927 srel >>= 1;
928
929 /* Check for overflow. */
930 if (srel < -2048 || srel > 2047)
931 {
932 /* Relative distance is too large. */
933
934 /* Always apply WRAPAROUND for avr2, avr25, and avr4. */
935 switch (bfd_get_mach (input_bfd))
936 {
937 case bfd_mach_avr2:
938 case bfd_mach_avr25:
939 case bfd_mach_avr4:
940 break;
941
942 default:
943 return bfd_reloc_overflow;
944 }
945 }
946
947 x = bfd_get_16 (input_bfd, contents);
948 x = (x & 0xf000) | (srel & 0xfff);
949 bfd_put_16 (input_bfd, x, contents);
950 break;
951
952 case R_AVR_LO8_LDI:
953 contents += rel->r_offset;
954 srel = (bfd_signed_vma) relocation + rel->r_addend;
955 x = bfd_get_16 (input_bfd, contents);
956 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
957 bfd_put_16 (input_bfd, x, contents);
958 break;
959
960 case R_AVR_LDI:
961 contents += rel->r_offset;
962 srel = (bfd_signed_vma) relocation + rel->r_addend;
963 if (((srel > 0) && (srel & 0xffff) > 255)
964 || ((srel < 0) && ((-srel) & 0xffff) > 128))
965 /* Remove offset for data/eeprom section. */
966 return bfd_reloc_overflow;
967
968 x = bfd_get_16 (input_bfd, contents);
969 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
970 bfd_put_16 (input_bfd, x, contents);
971 break;
972
973 case R_AVR_6:
974 contents += rel->r_offset;
975 srel = (bfd_signed_vma) relocation + rel->r_addend;
976 if (((srel & 0xffff) > 63) || (srel < 0))
977 /* Remove offset for data/eeprom section. */
978 return bfd_reloc_overflow;
979 x = bfd_get_16 (input_bfd, contents);
980 x = (x & 0xd3f8) | ((srel & 7) | ((srel & (3 << 3)) << 7)
981 | ((srel & (1 << 5)) << 8));
982 bfd_put_16 (input_bfd, x, contents);
983 break;
984
985 case R_AVR_6_ADIW:
986 contents += rel->r_offset;
987 srel = (bfd_signed_vma) relocation + rel->r_addend;
988 if (((srel & 0xffff) > 63) || (srel < 0))
989 /* Remove offset for data/eeprom section. */
990 return bfd_reloc_overflow;
991 x = bfd_get_16 (input_bfd, contents);
992 x = (x & 0xff30) | (srel & 0xf) | ((srel & 0x30) << 2);
993 bfd_put_16 (input_bfd, x, contents);
994 break;
995
996 case R_AVR_HI8_LDI:
997 contents += rel->r_offset;
998 srel = (bfd_signed_vma) relocation + rel->r_addend;
999 srel = (srel >> 8) & 0xff;
1000 x = bfd_get_16 (input_bfd, contents);
1001 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1002 bfd_put_16 (input_bfd, x, contents);
1003 break;
1004
1005 case R_AVR_HH8_LDI:
1006 contents += rel->r_offset;
1007 srel = (bfd_signed_vma) relocation + rel->r_addend;
1008 srel = (srel >> 16) & 0xff;
1009 x = bfd_get_16 (input_bfd, contents);
1010 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1011 bfd_put_16 (input_bfd, x, contents);
1012 break;
1013
1014 case R_AVR_MS8_LDI:
1015 contents += rel->r_offset;
1016 srel = (bfd_signed_vma) relocation + rel->r_addend;
1017 srel = (srel >> 24) & 0xff;
1018 x = bfd_get_16 (input_bfd, contents);
1019 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1020 bfd_put_16 (input_bfd, x, contents);
1021 break;
1022
1023 case R_AVR_LO8_LDI_NEG:
1024 contents += rel->r_offset;
1025 srel = (bfd_signed_vma) relocation + rel->r_addend;
1026 srel = -srel;
1027 x = bfd_get_16 (input_bfd, contents);
1028 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1029 bfd_put_16 (input_bfd, x, contents);
1030 break;
1031
1032 case R_AVR_HI8_LDI_NEG:
1033 contents += rel->r_offset;
1034 srel = (bfd_signed_vma) relocation + rel->r_addend;
1035 srel = -srel;
1036 srel = (srel >> 8) & 0xff;
1037 x = bfd_get_16 (input_bfd, contents);
1038 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1039 bfd_put_16 (input_bfd, x, contents);
1040 break;
1041
1042 case R_AVR_HH8_LDI_NEG:
1043 contents += rel->r_offset;
1044 srel = (bfd_signed_vma) relocation + rel->r_addend;
1045 srel = -srel;
1046 srel = (srel >> 16) & 0xff;
1047 x = bfd_get_16 (input_bfd, contents);
1048 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1049 bfd_put_16 (input_bfd, x, contents);
1050 break;
1051
1052 case R_AVR_MS8_LDI_NEG:
1053 contents += rel->r_offset;
1054 srel = (bfd_signed_vma) relocation + rel->r_addend;
1055 srel = -srel;
1056 srel = (srel >> 24) & 0xff;
1057 x = bfd_get_16 (input_bfd, contents);
1058 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1059 bfd_put_16 (input_bfd, x, contents);
1060 break;
1061
1062 case R_AVR_LO8_LDI_GS:
1063 use_stubs = (!htab->no_stubs);
1064 /* Fall through. */
1065 case R_AVR_LO8_LDI_PM:
1066 contents += rel->r_offset;
1067 srel = (bfd_signed_vma) relocation + rel->r_addend;
1068
1069 if (use_stubs
1070 && avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1071 {
1072 bfd_vma old_srel = srel;
1073
1074 /* We need to use the address of the stub instead. */
1075 srel = avr_get_stub_addr (srel, htab);
1076 if (debug_stubs)
1077 printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1078 "reloc at address 0x%x.\n",
1079 (unsigned int) srel,
1080 (unsigned int) old_srel,
1081 (unsigned int) reloc_addr);
1082
1083 if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1084 return bfd_reloc_outofrange;
1085 }
1086
1087 if (srel & 1)
1088 return bfd_reloc_outofrange;
1089 srel = srel >> 1;
1090 x = bfd_get_16 (input_bfd, contents);
1091 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1092 bfd_put_16 (input_bfd, x, contents);
1093 break;
1094
1095 case R_AVR_HI8_LDI_GS:
1096 use_stubs = (!htab->no_stubs);
1097 /* Fall through. */
1098 case R_AVR_HI8_LDI_PM:
1099 contents += rel->r_offset;
1100 srel = (bfd_signed_vma) relocation + rel->r_addend;
1101
1102 if (use_stubs
1103 && avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1104 {
1105 bfd_vma old_srel = srel;
1106
1107 /* We need to use the address of the stub instead. */
1108 srel = avr_get_stub_addr (srel, htab);
1109 if (debug_stubs)
1110 printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1111 "reloc at address 0x%x.\n",
1112 (unsigned int) srel,
1113 (unsigned int) old_srel,
1114 (unsigned int) reloc_addr);
1115
1116 if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1117 return bfd_reloc_outofrange;
1118 }
1119
1120 if (srel & 1)
1121 return bfd_reloc_outofrange;
1122 srel = srel >> 1;
1123 srel = (srel >> 8) & 0xff;
1124 x = bfd_get_16 (input_bfd, contents);
1125 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1126 bfd_put_16 (input_bfd, x, contents);
1127 break;
1128
1129 case R_AVR_HH8_LDI_PM:
1130 contents += rel->r_offset;
1131 srel = (bfd_signed_vma) relocation + rel->r_addend;
1132 if (srel & 1)
1133 return bfd_reloc_outofrange;
1134 srel = srel >> 1;
1135 srel = (srel >> 16) & 0xff;
1136 x = bfd_get_16 (input_bfd, contents);
1137 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1138 bfd_put_16 (input_bfd, x, contents);
1139 break;
1140
1141 case R_AVR_LO8_LDI_PM_NEG:
1142 contents += rel->r_offset;
1143 srel = (bfd_signed_vma) relocation + rel->r_addend;
1144 srel = -srel;
1145 if (srel & 1)
1146 return bfd_reloc_outofrange;
1147 srel = srel >> 1;
1148 x = bfd_get_16 (input_bfd, contents);
1149 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1150 bfd_put_16 (input_bfd, x, contents);
1151 break;
1152
1153 case R_AVR_HI8_LDI_PM_NEG:
1154 contents += rel->r_offset;
1155 srel = (bfd_signed_vma) relocation + rel->r_addend;
1156 srel = -srel;
1157 if (srel & 1)
1158 return bfd_reloc_outofrange;
1159 srel = srel >> 1;
1160 srel = (srel >> 8) & 0xff;
1161 x = bfd_get_16 (input_bfd, contents);
1162 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1163 bfd_put_16 (input_bfd, x, contents);
1164 break;
1165
1166 case R_AVR_HH8_LDI_PM_NEG:
1167 contents += rel->r_offset;
1168 srel = (bfd_signed_vma) relocation + rel->r_addend;
1169 srel = -srel;
1170 if (srel & 1)
1171 return bfd_reloc_outofrange;
1172 srel = srel >> 1;
1173 srel = (srel >> 16) & 0xff;
1174 x = bfd_get_16 (input_bfd, contents);
1175 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1176 bfd_put_16 (input_bfd, x, contents);
1177 break;
1178
1179 case R_AVR_CALL:
1180 contents += rel->r_offset;
1181 srel = (bfd_signed_vma) relocation + rel->r_addend;
1182 if (srel & 1)
1183 return bfd_reloc_outofrange;
1184 srel = srel >> 1;
1185 x = bfd_get_16 (input_bfd, contents);
1186 x |= ((srel & 0x10000) | ((srel << 3) & 0x1f00000)) >> 16;
1187 bfd_put_16 (input_bfd, x, contents);
1188 bfd_put_16 (input_bfd, (bfd_vma) srel & 0xffff, contents+2);
1189 break;
1190
1191 case R_AVR_16_PM:
1192 use_stubs = (!htab->no_stubs);
1193 contents += rel->r_offset;
1194 srel = (bfd_signed_vma) relocation + rel->r_addend;
1195
1196 if (use_stubs
1197 && avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1198 {
1199 bfd_vma old_srel = srel;
1200
1201 /* We need to use the address of the stub instead. */
1202 srel = avr_get_stub_addr (srel,htab);
1203 if (debug_stubs)
1204 printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1205 "reloc at address 0x%x.\n",
1206 (unsigned int) srel,
1207 (unsigned int) old_srel,
1208 (unsigned int) reloc_addr);
1209
1210 if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1211 return bfd_reloc_outofrange;
1212 }
1213
1214 if (srel & 1)
1215 return bfd_reloc_outofrange;
1216 srel = srel >> 1;
1217 bfd_put_16 (input_bfd, (bfd_vma) srel &0x00ffff, contents);
1218 break;
1219
1220 case R_AVR_DIFF8:
1221 case R_AVR_DIFF16:
1222 case R_AVR_DIFF32:
1223 /* Nothing to do here, as contents already contains the diff value. */
1224 r = bfd_reloc_ok;
1225 break;
1226
1227 default:
1228 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1229 contents, rel->r_offset,
1230 relocation, rel->r_addend);
1231 }
1232
1233 return r;
1234 }
1235
1236 /* Relocate an AVR ELF section. */
1237
1238 static bfd_boolean
1239 elf32_avr_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
1240 struct bfd_link_info *info,
1241 bfd *input_bfd,
1242 asection *input_section,
1243 bfd_byte *contents,
1244 Elf_Internal_Rela *relocs,
1245 Elf_Internal_Sym *local_syms,
1246 asection **local_sections)
1247 {
1248 Elf_Internal_Shdr * symtab_hdr;
1249 struct elf_link_hash_entry ** sym_hashes;
1250 Elf_Internal_Rela * rel;
1251 Elf_Internal_Rela * relend;
1252 struct elf32_avr_link_hash_table * htab = avr_link_hash_table (info);
1253
1254 if (htab == NULL)
1255 return FALSE;
1256
1257 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1258 sym_hashes = elf_sym_hashes (input_bfd);
1259 relend = relocs + input_section->reloc_count;
1260
1261 for (rel = relocs; rel < relend; rel ++)
1262 {
1263 reloc_howto_type * howto;
1264 unsigned long r_symndx;
1265 Elf_Internal_Sym * sym;
1266 asection * sec;
1267 struct elf_link_hash_entry * h;
1268 bfd_vma relocation;
1269 bfd_reloc_status_type r;
1270 const char * name;
1271 int r_type;
1272
1273 r_type = ELF32_R_TYPE (rel->r_info);
1274 r_symndx = ELF32_R_SYM (rel->r_info);
1275 howto = elf_avr_howto_table + r_type;
1276 h = NULL;
1277 sym = NULL;
1278 sec = NULL;
1279
1280 if (r_symndx < symtab_hdr->sh_info)
1281 {
1282 sym = local_syms + r_symndx;
1283 sec = local_sections [r_symndx];
1284 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1285
1286 name = bfd_elf_string_from_elf_section
1287 (input_bfd, symtab_hdr->sh_link, sym->st_name);
1288 name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
1289 }
1290 else
1291 {
1292 bfd_boolean unresolved_reloc, warned, ignored;
1293
1294 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1295 r_symndx, symtab_hdr, sym_hashes,
1296 h, sec, relocation,
1297 unresolved_reloc, warned, ignored);
1298
1299 name = h->root.root.string;
1300 }
1301
1302 if (sec != NULL && discarded_section (sec))
1303 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1304 rel, 1, relend, howto, 0, contents);
1305
1306 if (info->relocatable)
1307 continue;
1308
1309 r = avr_final_link_relocate (howto, input_bfd, input_section,
1310 contents, rel, relocation, htab);
1311
1312 if (r != bfd_reloc_ok)
1313 {
1314 const char * msg = (const char *) NULL;
1315
1316 switch (r)
1317 {
1318 case bfd_reloc_overflow:
1319 r = info->callbacks->reloc_overflow
1320 (info, (h ? &h->root : NULL),
1321 name, howto->name, (bfd_vma) 0,
1322 input_bfd, input_section, rel->r_offset);
1323 break;
1324
1325 case bfd_reloc_undefined:
1326 r = info->callbacks->undefined_symbol
1327 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
1328 break;
1329
1330 case bfd_reloc_outofrange:
1331 msg = _("internal error: out of range error");
1332 break;
1333
1334 case bfd_reloc_notsupported:
1335 msg = _("internal error: unsupported relocation error");
1336 break;
1337
1338 case bfd_reloc_dangerous:
1339 msg = _("internal error: dangerous relocation");
1340 break;
1341
1342 default:
1343 msg = _("internal error: unknown error");
1344 break;
1345 }
1346
1347 if (msg)
1348 r = info->callbacks->warning
1349 (info, msg, name, input_bfd, input_section, rel->r_offset);
1350
1351 if (! r)
1352 return FALSE;
1353 }
1354 }
1355
1356 return TRUE;
1357 }
1358
1359 /* The final processing done just before writing out a AVR ELF object
1360 file. This gets the AVR architecture right based on the machine
1361 number. */
1362
1363 static void
1364 bfd_elf_avr_final_write_processing (bfd *abfd,
1365 bfd_boolean linker ATTRIBUTE_UNUSED)
1366 {
1367 unsigned long val;
1368
1369 switch (bfd_get_mach (abfd))
1370 {
1371 default:
1372 case bfd_mach_avr2:
1373 val = E_AVR_MACH_AVR2;
1374 break;
1375
1376 case bfd_mach_avr1:
1377 val = E_AVR_MACH_AVR1;
1378 break;
1379
1380 case bfd_mach_avr25:
1381 val = E_AVR_MACH_AVR25;
1382 break;
1383
1384 case bfd_mach_avr3:
1385 val = E_AVR_MACH_AVR3;
1386 break;
1387
1388 case bfd_mach_avr31:
1389 val = E_AVR_MACH_AVR31;
1390 break;
1391
1392 case bfd_mach_avr35:
1393 val = E_AVR_MACH_AVR35;
1394 break;
1395
1396 case bfd_mach_avr4:
1397 val = E_AVR_MACH_AVR4;
1398 break;
1399
1400 case bfd_mach_avr5:
1401 val = E_AVR_MACH_AVR5;
1402 break;
1403
1404 case bfd_mach_avr51:
1405 val = E_AVR_MACH_AVR51;
1406 break;
1407
1408 case bfd_mach_avr6:
1409 val = E_AVR_MACH_AVR6;
1410 break;
1411
1412 case bfd_mach_avrxmega1:
1413 val = E_AVR_MACH_XMEGA1;
1414 break;
1415
1416 case bfd_mach_avrxmega2:
1417 val = E_AVR_MACH_XMEGA2;
1418 break;
1419
1420 case bfd_mach_avrxmega3:
1421 val = E_AVR_MACH_XMEGA3;
1422 break;
1423
1424 case bfd_mach_avrxmega4:
1425 val = E_AVR_MACH_XMEGA4;
1426 break;
1427
1428 case bfd_mach_avrxmega5:
1429 val = E_AVR_MACH_XMEGA5;
1430 break;
1431
1432 case bfd_mach_avrxmega6:
1433 val = E_AVR_MACH_XMEGA6;
1434 break;
1435
1436 case bfd_mach_avrxmega7:
1437 val = E_AVR_MACH_XMEGA7;
1438 break;
1439 }
1440
1441 elf_elfheader (abfd)->e_machine = EM_AVR;
1442 elf_elfheader (abfd)->e_flags &= ~ EF_AVR_MACH;
1443 elf_elfheader (abfd)->e_flags |= val;
1444 elf_elfheader (abfd)->e_flags |= EF_AVR_LINKRELAX_PREPARED;
1445 }
1446
1447 /* Set the right machine number. */
1448
1449 static bfd_boolean
1450 elf32_avr_object_p (bfd *abfd)
1451 {
1452 unsigned int e_set = bfd_mach_avr2;
1453
1454 if (elf_elfheader (abfd)->e_machine == EM_AVR
1455 || elf_elfheader (abfd)->e_machine == EM_AVR_OLD)
1456 {
1457 int e_mach = elf_elfheader (abfd)->e_flags & EF_AVR_MACH;
1458
1459 switch (e_mach)
1460 {
1461 default:
1462 case E_AVR_MACH_AVR2:
1463 e_set = bfd_mach_avr2;
1464 break;
1465
1466 case E_AVR_MACH_AVR1:
1467 e_set = bfd_mach_avr1;
1468 break;
1469
1470 case E_AVR_MACH_AVR25:
1471 e_set = bfd_mach_avr25;
1472 break;
1473
1474 case E_AVR_MACH_AVR3:
1475 e_set = bfd_mach_avr3;
1476 break;
1477
1478 case E_AVR_MACH_AVR31:
1479 e_set = bfd_mach_avr31;
1480 break;
1481
1482 case E_AVR_MACH_AVR35:
1483 e_set = bfd_mach_avr35;
1484 break;
1485
1486 case E_AVR_MACH_AVR4:
1487 e_set = bfd_mach_avr4;
1488 break;
1489
1490 case E_AVR_MACH_AVR5:
1491 e_set = bfd_mach_avr5;
1492 break;
1493
1494 case E_AVR_MACH_AVR51:
1495 e_set = bfd_mach_avr51;
1496 break;
1497
1498 case E_AVR_MACH_AVR6:
1499 e_set = bfd_mach_avr6;
1500 break;
1501
1502 case E_AVR_MACH_XMEGA1:
1503 e_set = bfd_mach_avrxmega1;
1504 break;
1505
1506 case E_AVR_MACH_XMEGA2:
1507 e_set = bfd_mach_avrxmega2;
1508 break;
1509
1510 case E_AVR_MACH_XMEGA3:
1511 e_set = bfd_mach_avrxmega3;
1512 break;
1513
1514 case E_AVR_MACH_XMEGA4:
1515 e_set = bfd_mach_avrxmega4;
1516 break;
1517
1518 case E_AVR_MACH_XMEGA5:
1519 e_set = bfd_mach_avrxmega5;
1520 break;
1521
1522 case E_AVR_MACH_XMEGA6:
1523 e_set = bfd_mach_avrxmega6;
1524 break;
1525
1526 case E_AVR_MACH_XMEGA7:
1527 e_set = bfd_mach_avrxmega7;
1528 break;
1529 }
1530 }
1531 return bfd_default_set_arch_mach (abfd, bfd_arch_avr,
1532 e_set);
1533 }
1534
1535 /* Returns whether the relocation type passed is a diff reloc. */
1536
1537 static bfd_boolean
1538 elf32_avr_is_diff_reloc (Elf_Internal_Rela *irel)
1539 {
1540 return (ELF32_R_TYPE (irel->r_info) == R_AVR_DIFF8
1541 ||ELF32_R_TYPE (irel->r_info) == R_AVR_DIFF16
1542 || ELF32_R_TYPE (irel->r_info) == R_AVR_DIFF32);
1543 }
1544
1545 /* Reduce the diff value written in the section by count if the shrinked
1546 insn address happens to fall between the two symbols for which this
1547 diff reloc was emitted. */
1548
1549 static void
1550 elf32_avr_adjust_diff_reloc_value (bfd *abfd,
1551 struct bfd_section *isec,
1552 Elf_Internal_Rela *irel,
1553 bfd_vma symval,
1554 bfd_vma shrinked_insn_address,
1555 int count)
1556 {
1557 unsigned char *reloc_contents = NULL;
1558 unsigned char *isec_contents = elf_section_data (isec)->this_hdr.contents;
1559 if (isec_contents == NULL)
1560 {
1561 if (! bfd_malloc_and_get_section (abfd, isec, &isec_contents))
1562 return;
1563
1564 elf_section_data (isec)->this_hdr.contents = isec_contents;
1565 }
1566
1567 reloc_contents = isec_contents + irel->r_offset;
1568
1569 /* Read value written in object file. */
1570 bfd_vma x = 0;
1571 switch (ELF32_R_TYPE (irel->r_info))
1572 {
1573 case R_AVR_DIFF8:
1574 {
1575 x = *reloc_contents;
1576 break;
1577 }
1578 case R_AVR_DIFF16:
1579 {
1580 x = bfd_get_16 (abfd, reloc_contents);
1581 break;
1582 }
1583 case R_AVR_DIFF32:
1584 {
1585 x = bfd_get_32 (abfd, reloc_contents);
1586 break;
1587 }
1588 default:
1589 {
1590 BFD_FAIL();
1591 }
1592 }
1593
1594 /* For a diff reloc sym1 - sym2 the diff at assembly time (x) is written
1595 into the object file at the reloc offset. sym2's logical value is
1596 symval (<start_of_section>) + reloc addend. Compute the start and end
1597 addresses and check if the shrinked insn falls between sym1 and sym2. */
1598
1599 bfd_vma end_address = symval + irel->r_addend;
1600 bfd_vma start_address = end_address - x;
1601
1602 /* Reduce the diff value by count bytes and write it back into section
1603 contents. */
1604
1605 if (shrinked_insn_address >= start_address &&
1606 shrinked_insn_address <= end_address)
1607 {
1608 switch (ELF32_R_TYPE (irel->r_info))
1609 {
1610 case R_AVR_DIFF8:
1611 {
1612 *reloc_contents = (x - count);
1613 break;
1614 }
1615 case R_AVR_DIFF16:
1616 {
1617 bfd_put_16 (abfd, (x - count) & 0xFFFF, reloc_contents);
1618 break;
1619 }
1620 case R_AVR_DIFF32:
1621 {
1622 bfd_put_32 (abfd, (x - count) & 0xFFFFFFFF, reloc_contents);
1623 break;
1624 }
1625 default:
1626 {
1627 BFD_FAIL();
1628 }
1629 }
1630
1631 }
1632 }
1633
1634 /* Delete some bytes from a section while changing the size of an instruction.
1635 The parameter "addr" denotes the section-relative offset pointing just
1636 behind the shrinked instruction. "addr+count" point at the first
1637 byte just behind the original unshrinked instruction. */
1638
1639 static bfd_boolean
1640 elf32_avr_relax_delete_bytes (bfd *abfd,
1641 asection *sec,
1642 bfd_vma addr,
1643 int count)
1644 {
1645 Elf_Internal_Shdr *symtab_hdr;
1646 unsigned int sec_shndx;
1647 bfd_byte *contents;
1648 Elf_Internal_Rela *irel, *irelend;
1649 Elf_Internal_Sym *isym;
1650 Elf_Internal_Sym *isymbuf = NULL;
1651 bfd_vma toaddr;
1652 struct elf_link_hash_entry **sym_hashes;
1653 struct elf_link_hash_entry **end_hashes;
1654 unsigned int symcount;
1655
1656 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1657 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1658 contents = elf_section_data (sec)->this_hdr.contents;
1659
1660 toaddr = sec->size;
1661
1662 irel = elf_section_data (sec)->relocs;
1663 irelend = irel + sec->reloc_count;
1664
1665 /* Actually delete the bytes. */
1666 if (toaddr - addr - count > 0)
1667 memmove (contents + addr, contents + addr + count,
1668 (size_t) (toaddr - addr - count));
1669 sec->size -= count;
1670
1671 /* Adjust all the reloc addresses. */
1672 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1673 {
1674 bfd_vma old_reloc_address;
1675
1676 old_reloc_address = (sec->output_section->vma
1677 + sec->output_offset + irel->r_offset);
1678
1679 /* Get the new reloc address. */
1680 if ((irel->r_offset > addr
1681 && irel->r_offset < toaddr))
1682 {
1683 if (debug_relax)
1684 printf ("Relocation at address 0x%x needs to be moved.\n"
1685 "Old section offset: 0x%x, New section offset: 0x%x \n",
1686 (unsigned int) old_reloc_address,
1687 (unsigned int) irel->r_offset,
1688 (unsigned int) ((irel->r_offset) - count));
1689
1690 irel->r_offset -= count;
1691 }
1692
1693 }
1694
1695 /* The reloc's own addresses are now ok. However, we need to readjust
1696 the reloc's addend, i.e. the reloc's value if two conditions are met:
1697 1.) the reloc is relative to a symbol in this section that
1698 is located in front of the shrinked instruction
1699 2.) symbol plus addend end up behind the shrinked instruction.
1700
1701 The most common case where this happens are relocs relative to
1702 the section-start symbol.
1703
1704 This step needs to be done for all of the sections of the bfd. */
1705
1706 {
1707 struct bfd_section *isec;
1708
1709 for (isec = abfd->sections; isec; isec = isec->next)
1710 {
1711 bfd_vma symval;
1712 bfd_vma shrinked_insn_address;
1713
1714 if (isec->reloc_count == 0)
1715 continue;
1716
1717 shrinked_insn_address = (sec->output_section->vma
1718 + sec->output_offset + addr - count);
1719
1720 irel = elf_section_data (isec)->relocs;
1721 /* PR 12161: Read in the relocs for this section if necessary. */
1722 if (irel == NULL)
1723 irel = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL, TRUE);
1724
1725 for (irelend = irel + isec->reloc_count;
1726 irel < irelend;
1727 irel++)
1728 {
1729 /* Read this BFD's local symbols if we haven't done
1730 so already. */
1731 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
1732 {
1733 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1734 if (isymbuf == NULL)
1735 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
1736 symtab_hdr->sh_info, 0,
1737 NULL, NULL, NULL);
1738 if (isymbuf == NULL)
1739 return FALSE;
1740 }
1741
1742 /* Get the value of the symbol referred to by the reloc. */
1743 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1744 {
1745 /* A local symbol. */
1746 asection *sym_sec;
1747
1748 isym = isymbuf + ELF32_R_SYM (irel->r_info);
1749 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1750 symval = isym->st_value;
1751 /* If the reloc is absolute, it will not have
1752 a symbol or section associated with it. */
1753 if (sym_sec == sec)
1754 {
1755 symval += sym_sec->output_section->vma
1756 + sym_sec->output_offset;
1757
1758 if (debug_relax)
1759 printf ("Checking if the relocation's "
1760 "addend needs corrections.\n"
1761 "Address of anchor symbol: 0x%x \n"
1762 "Address of relocation target: 0x%x \n"
1763 "Address of relaxed insn: 0x%x \n",
1764 (unsigned int) symval,
1765 (unsigned int) (symval + irel->r_addend),
1766 (unsigned int) shrinked_insn_address);
1767
1768 if (symval <= shrinked_insn_address
1769 && (symval + irel->r_addend) > shrinked_insn_address)
1770 {
1771 if (elf32_avr_is_diff_reloc (irel))
1772 {
1773 elf32_avr_adjust_diff_reloc_value (abfd, isec, irel,
1774 symval,
1775 shrinked_insn_address,
1776 count);
1777 }
1778
1779 irel->r_addend -= count;
1780
1781 if (debug_relax)
1782 printf ("Relocation's addend needed to be fixed \n");
1783 }
1784 }
1785 /* else...Reference symbol is absolute. No adjustment needed. */
1786 }
1787 /* else...Reference symbol is extern. No need for adjusting
1788 the addend. */
1789 }
1790 }
1791 }
1792
1793 /* Adjust the local symbols defined in this section. */
1794 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1795 /* Fix PR 9841, there may be no local symbols. */
1796 if (isym != NULL)
1797 {
1798 Elf_Internal_Sym *isymend;
1799
1800 isymend = isym + symtab_hdr->sh_info;
1801 for (; isym < isymend; isym++)
1802 {
1803 if (isym->st_shndx == sec_shndx
1804 && isym->st_value > addr
1805 && isym->st_value < toaddr)
1806 isym->st_value -= count;
1807 }
1808 }
1809
1810 /* Now adjust the global symbols defined in this section. */
1811 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1812 - symtab_hdr->sh_info);
1813 sym_hashes = elf_sym_hashes (abfd);
1814 end_hashes = sym_hashes + symcount;
1815 for (; sym_hashes < end_hashes; sym_hashes++)
1816 {
1817 struct elf_link_hash_entry *sym_hash = *sym_hashes;
1818 if ((sym_hash->root.type == bfd_link_hash_defined
1819 || sym_hash->root.type == bfd_link_hash_defweak)
1820 && sym_hash->root.u.def.section == sec
1821 && sym_hash->root.u.def.value > addr
1822 && sym_hash->root.u.def.value < toaddr)
1823 {
1824 sym_hash->root.u.def.value -= count;
1825 }
1826 }
1827
1828 return TRUE;
1829 }
1830
1831 /* This function handles relaxing for the avr.
1832 Many important relaxing opportunities within functions are already
1833 realized by the compiler itself.
1834 Here we try to replace call (4 bytes) -> rcall (2 bytes)
1835 and jump -> rjmp (safes also 2 bytes).
1836 As well we now optimize seqences of
1837 - call/rcall function
1838 - ret
1839 to yield
1840 - jmp/rjmp function
1841 - ret
1842 . In case that within a sequence
1843 - jmp/rjmp label
1844 - ret
1845 the ret could no longer be reached it is optimized away. In order
1846 to check if the ret is no longer needed, it is checked that the ret's address
1847 is not the target of a branch or jump within the same section, it is checked
1848 that there is no skip instruction before the jmp/rjmp and that there
1849 is no local or global label place at the address of the ret.
1850
1851 We refrain from relaxing within sections ".vectors" and
1852 ".jumptables" in order to maintain the position of the instructions.
1853 There, however, we substitute jmp/call by a sequence rjmp,nop/rcall,nop
1854 if possible. (In future one could possibly use the space of the nop
1855 for the first instruction of the irq service function.
1856
1857 The .jumptables sections is meant to be used for a future tablejump variant
1858 for the devices with 3-byte program counter where the table itself
1859 contains 4-byte jump instructions whose relative offset must not
1860 be changed. */
1861
1862 static bfd_boolean
1863 elf32_avr_relax_section (bfd *abfd,
1864 asection *sec,
1865 struct bfd_link_info *link_info,
1866 bfd_boolean *again)
1867 {
1868 Elf_Internal_Shdr *symtab_hdr;
1869 Elf_Internal_Rela *internal_relocs;
1870 Elf_Internal_Rela *irel, *irelend;
1871 bfd_byte *contents = NULL;
1872 Elf_Internal_Sym *isymbuf = NULL;
1873 struct elf32_avr_link_hash_table *htab;
1874
1875 /* If 'shrinkable' is FALSE, do not shrink by deleting bytes while
1876 relaxing. Such shrinking can cause issues for the sections such
1877 as .vectors and .jumptables. Instead the unused bytes should be
1878 filled with nop instructions. */
1879 bfd_boolean shrinkable = TRUE;
1880
1881 if (!strcmp (sec->name,".vectors")
1882 || !strcmp (sec->name,".jumptables"))
1883 shrinkable = FALSE;
1884
1885 if (link_info->relocatable)
1886 (*link_info->callbacks->einfo)
1887 (_("%P%F: --relax and -r may not be used together\n"));
1888
1889 htab = avr_link_hash_table (link_info);
1890 if (htab == NULL)
1891 return FALSE;
1892
1893 /* Assume nothing changes. */
1894 *again = FALSE;
1895
1896 if ((!htab->no_stubs) && (sec == htab->stub_sec))
1897 {
1898 /* We are just relaxing the stub section.
1899 Let's calculate the size needed again. */
1900 bfd_size_type last_estimated_stub_section_size = htab->stub_sec->size;
1901
1902 if (debug_relax)
1903 printf ("Relaxing the stub section. Size prior to this pass: %i\n",
1904 (int) last_estimated_stub_section_size);
1905
1906 elf32_avr_size_stubs (htab->stub_sec->output_section->owner,
1907 link_info, FALSE);
1908
1909 /* Check if the number of trampolines changed. */
1910 if (last_estimated_stub_section_size != htab->stub_sec->size)
1911 *again = TRUE;
1912
1913 if (debug_relax)
1914 printf ("Size of stub section after this pass: %i\n",
1915 (int) htab->stub_sec->size);
1916
1917 return TRUE;
1918 }
1919
1920 /* We don't have to do anything for a relocatable link, if
1921 this section does not have relocs, or if this is not a
1922 code section. */
1923 if (link_info->relocatable
1924 || (sec->flags & SEC_RELOC) == 0
1925 || sec->reloc_count == 0
1926 || (sec->flags & SEC_CODE) == 0)
1927 return TRUE;
1928
1929 /* Check if the object file to relax uses internal symbols so that we
1930 could fix up the relocations. */
1931 if (!(elf_elfheader (abfd)->e_flags & EF_AVR_LINKRELAX_PREPARED))
1932 return TRUE;
1933
1934 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1935
1936 /* Get a copy of the native relocations. */
1937 internal_relocs = (_bfd_elf_link_read_relocs
1938 (abfd, sec, NULL, NULL, link_info->keep_memory));
1939 if (internal_relocs == NULL)
1940 goto error_return;
1941
1942 /* Walk through the relocs looking for relaxing opportunities. */
1943 irelend = internal_relocs + sec->reloc_count;
1944 for (irel = internal_relocs; irel < irelend; irel++)
1945 {
1946 bfd_vma symval;
1947
1948 if ( ELF32_R_TYPE (irel->r_info) != R_AVR_13_PCREL
1949 && ELF32_R_TYPE (irel->r_info) != R_AVR_7_PCREL
1950 && ELF32_R_TYPE (irel->r_info) != R_AVR_CALL)
1951 continue;
1952
1953 /* Get the section contents if we haven't done so already. */
1954 if (contents == NULL)
1955 {
1956 /* Get cached copy if it exists. */
1957 if (elf_section_data (sec)->this_hdr.contents != NULL)
1958 contents = elf_section_data (sec)->this_hdr.contents;
1959 else
1960 {
1961 /* Go get them off disk. */
1962 if (! bfd_malloc_and_get_section (abfd, sec, &contents))
1963 goto error_return;
1964 }
1965 }
1966
1967 /* Read this BFD's local symbols if we haven't done so already. */
1968 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
1969 {
1970 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1971 if (isymbuf == NULL)
1972 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
1973 symtab_hdr->sh_info, 0,
1974 NULL, NULL, NULL);
1975 if (isymbuf == NULL)
1976 goto error_return;
1977 }
1978
1979
1980 /* Get the value of the symbol referred to by the reloc. */
1981 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1982 {
1983 /* A local symbol. */
1984 Elf_Internal_Sym *isym;
1985 asection *sym_sec;
1986
1987 isym = isymbuf + ELF32_R_SYM (irel->r_info);
1988 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1989 symval = isym->st_value;
1990 /* If the reloc is absolute, it will not have
1991 a symbol or section associated with it. */
1992 if (sym_sec)
1993 symval += sym_sec->output_section->vma
1994 + sym_sec->output_offset;
1995 }
1996 else
1997 {
1998 unsigned long indx;
1999 struct elf_link_hash_entry *h;
2000
2001 /* An external symbol. */
2002 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
2003 h = elf_sym_hashes (abfd)[indx];
2004 BFD_ASSERT (h != NULL);
2005 if (h->root.type != bfd_link_hash_defined
2006 && h->root.type != bfd_link_hash_defweak)
2007 /* This appears to be a reference to an undefined
2008 symbol. Just ignore it--it will be caught by the
2009 regular reloc processing. */
2010 continue;
2011
2012 symval = (h->root.u.def.value
2013 + h->root.u.def.section->output_section->vma
2014 + h->root.u.def.section->output_offset);
2015 }
2016
2017 /* For simplicity of coding, we are going to modify the section
2018 contents, the section relocs, and the BFD symbol table. We
2019 must tell the rest of the code not to free up this
2020 information. It would be possible to instead create a table
2021 of changes which have to be made, as is done in coff-mips.c;
2022 that would be more work, but would require less memory when
2023 the linker is run. */
2024 switch (ELF32_R_TYPE (irel->r_info))
2025 {
2026 /* Try to turn a 22-bit absolute call/jump into an 13-bit
2027 pc-relative rcall/rjmp. */
2028 case R_AVR_CALL:
2029 {
2030 bfd_vma value = symval + irel->r_addend;
2031 bfd_vma dot, gap;
2032 int distance_short_enough = 0;
2033
2034 /* Get the address of this instruction. */
2035 dot = (sec->output_section->vma
2036 + sec->output_offset + irel->r_offset);
2037
2038 /* Compute the distance from this insn to the branch target. */
2039 gap = value - dot;
2040
2041 /* Check if the gap falls in the range that can be accommodated
2042 in 13bits signed (It is 12bits when encoded, as we deal with
2043 word addressing). */
2044 if (!shrinkable && ((int) gap >= -4096 && (int) gap <= 4095))
2045 distance_short_enough = 1;
2046 /* If shrinkable, then we can check for a range of distance which
2047 is two bytes farther on both the directions because the call
2048 or jump target will be closer by two bytes after the
2049 relaxation. */
2050 else if (shrinkable && ((int) gap >= -4094 && (int) gap <= 4097))
2051 distance_short_enough = 1;
2052
2053 /* Here we handle the wrap-around case. E.g. for a 16k device
2054 we could use a rjmp to jump from address 0x100 to 0x3d00!
2055 In order to make this work properly, we need to fill the
2056 vaiable avr_pc_wrap_around with the appropriate value.
2057 I.e. 0x4000 for a 16k device. */
2058 {
2059 /* Shrinking the code size makes the gaps larger in the
2060 case of wrap-arounds. So we use a heuristical safety
2061 margin to avoid that during relax the distance gets
2062 again too large for the short jumps. Let's assume
2063 a typical code-size reduction due to relax for a
2064 16k device of 600 bytes. So let's use twice the
2065 typical value as safety margin. */
2066 int rgap;
2067 int safety_margin;
2068
2069 int assumed_shrink = 600;
2070 if (avr_pc_wrap_around > 0x4000)
2071 assumed_shrink = 900;
2072
2073 safety_margin = 2 * assumed_shrink;
2074
2075 rgap = avr_relative_distance_considering_wrap_around (gap);
2076
2077 if (rgap >= (-4092 + safety_margin)
2078 && rgap <= (4094 - safety_margin))
2079 distance_short_enough = 1;
2080 }
2081
2082 if (distance_short_enough)
2083 {
2084 unsigned char code_msb;
2085 unsigned char code_lsb;
2086
2087 if (debug_relax)
2088 printf ("shrinking jump/call instruction at address 0x%x"
2089 " in section %s\n\n",
2090 (int) dot, sec->name);
2091
2092 /* Note that we've changed the relocs, section contents,
2093 etc. */
2094 elf_section_data (sec)->relocs = internal_relocs;
2095 elf_section_data (sec)->this_hdr.contents = contents;
2096 symtab_hdr->contents = (unsigned char *) isymbuf;
2097
2098 /* Get the instruction code for relaxing. */
2099 code_lsb = bfd_get_8 (abfd, contents + irel->r_offset);
2100 code_msb = bfd_get_8 (abfd, contents + irel->r_offset + 1);
2101
2102 /* Mask out the relocation bits. */
2103 code_msb &= 0x94;
2104 code_lsb &= 0x0E;
2105 if (code_msb == 0x94 && code_lsb == 0x0E)
2106 {
2107 /* we are changing call -> rcall . */
2108 bfd_put_8 (abfd, 0x00, contents + irel->r_offset);
2109 bfd_put_8 (abfd, 0xD0, contents + irel->r_offset + 1);
2110 }
2111 else if (code_msb == 0x94 && code_lsb == 0x0C)
2112 {
2113 /* we are changeing jump -> rjmp. */
2114 bfd_put_8 (abfd, 0x00, contents + irel->r_offset);
2115 bfd_put_8 (abfd, 0xC0, contents + irel->r_offset + 1);
2116 }
2117 else
2118 abort ();
2119
2120 /* Fix the relocation's type. */
2121 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2122 R_AVR_13_PCREL);
2123
2124 /* We should not modify the ordering if 'shrinkable' is
2125 FALSE. */
2126 if (!shrinkable)
2127 {
2128 /* Let's insert a nop. */
2129 bfd_put_8 (abfd, 0x00, contents + irel->r_offset + 2);
2130 bfd_put_8 (abfd, 0x00, contents + irel->r_offset + 3);
2131 }
2132 else
2133 {
2134 /* Delete two bytes of data. */
2135 if (!elf32_avr_relax_delete_bytes (abfd, sec,
2136 irel->r_offset + 2, 2))
2137 goto error_return;
2138
2139 /* That will change things, so, we should relax again.
2140 Note that this is not required, and it may be slow. */
2141 *again = TRUE;
2142 }
2143 }
2144 }
2145
2146 default:
2147 {
2148 unsigned char code_msb;
2149 unsigned char code_lsb;
2150 bfd_vma dot;
2151
2152 code_msb = bfd_get_8 (abfd, contents + irel->r_offset + 1);
2153 code_lsb = bfd_get_8 (abfd, contents + irel->r_offset + 0);
2154
2155 /* Get the address of this instruction. */
2156 dot = (sec->output_section->vma
2157 + sec->output_offset + irel->r_offset);
2158
2159 /* Here we look for rcall/ret or call/ret sequences that could be
2160 safely replaced by rjmp/ret or jmp/ret. */
2161 if (((code_msb & 0xf0) == 0xd0)
2162 && avr_replace_call_ret_sequences)
2163 {
2164 /* This insn is a rcall. */
2165 unsigned char next_insn_msb = 0;
2166 unsigned char next_insn_lsb = 0;
2167
2168 if (irel->r_offset + 3 < sec->size)
2169 {
2170 next_insn_msb =
2171 bfd_get_8 (abfd, contents + irel->r_offset + 3);
2172 next_insn_lsb =
2173 bfd_get_8 (abfd, contents + irel->r_offset + 2);
2174 }
2175
2176 if ((0x95 == next_insn_msb) && (0x08 == next_insn_lsb))
2177 {
2178 /* The next insn is a ret. We now convert the rcall insn
2179 into a rjmp instruction. */
2180 code_msb &= 0xef;
2181 bfd_put_8 (abfd, code_msb, contents + irel->r_offset + 1);
2182 if (debug_relax)
2183 printf ("converted rcall/ret sequence at address 0x%x"
2184 " into rjmp/ret sequence. Section is %s\n\n",
2185 (int) dot, sec->name);
2186 *again = TRUE;
2187 break;
2188 }
2189 }
2190 else if ((0x94 == (code_msb & 0xfe))
2191 && (0x0e == (code_lsb & 0x0e))
2192 && avr_replace_call_ret_sequences)
2193 {
2194 /* This insn is a call. */
2195 unsigned char next_insn_msb = 0;
2196 unsigned char next_insn_lsb = 0;
2197
2198 if (irel->r_offset + 5 < sec->size)
2199 {
2200 next_insn_msb =
2201 bfd_get_8 (abfd, contents + irel->r_offset + 5);
2202 next_insn_lsb =
2203 bfd_get_8 (abfd, contents + irel->r_offset + 4);
2204 }
2205
2206 if ((0x95 == next_insn_msb) && (0x08 == next_insn_lsb))
2207 {
2208 /* The next insn is a ret. We now convert the call insn
2209 into a jmp instruction. */
2210
2211 code_lsb &= 0xfd;
2212 bfd_put_8 (abfd, code_lsb, contents + irel->r_offset);
2213 if (debug_relax)
2214 printf ("converted call/ret sequence at address 0x%x"
2215 " into jmp/ret sequence. Section is %s\n\n",
2216 (int) dot, sec->name);
2217 *again = TRUE;
2218 break;
2219 }
2220 }
2221 else if ((0xc0 == (code_msb & 0xf0))
2222 || ((0x94 == (code_msb & 0xfe))
2223 && (0x0c == (code_lsb & 0x0e))))
2224 {
2225 /* This insn is a rjmp or a jmp. */
2226 unsigned char next_insn_msb = 0;
2227 unsigned char next_insn_lsb = 0;
2228 int insn_size;
2229
2230 if (0xc0 == (code_msb & 0xf0))
2231 insn_size = 2; /* rjmp insn */
2232 else
2233 insn_size = 4; /* jmp insn */
2234
2235 if (irel->r_offset + insn_size + 1 < sec->size)
2236 {
2237 next_insn_msb =
2238 bfd_get_8 (abfd, contents + irel->r_offset
2239 + insn_size + 1);
2240 next_insn_lsb =
2241 bfd_get_8 (abfd, contents + irel->r_offset
2242 + insn_size);
2243 }
2244
2245 if ((0x95 == next_insn_msb) && (0x08 == next_insn_lsb))
2246 {
2247 /* The next insn is a ret. We possibly could delete
2248 this ret. First we need to check for preceding
2249 sbis/sbic/sbrs or cpse "skip" instructions. */
2250
2251 int there_is_preceding_non_skip_insn = 1;
2252 bfd_vma address_of_ret;
2253
2254 address_of_ret = dot + insn_size;
2255
2256 if (debug_relax && (insn_size == 2))
2257 printf ("found rjmp / ret sequence at address 0x%x\n",
2258 (int) dot);
2259 if (debug_relax && (insn_size == 4))
2260 printf ("found jmp / ret sequence at address 0x%x\n",
2261 (int) dot);
2262
2263 /* We have to make sure that there is a preceding insn. */
2264 if (irel->r_offset >= 2)
2265 {
2266 unsigned char preceding_msb;
2267 unsigned char preceding_lsb;
2268
2269 preceding_msb =
2270 bfd_get_8 (abfd, contents + irel->r_offset - 1);
2271 preceding_lsb =
2272 bfd_get_8 (abfd, contents + irel->r_offset - 2);
2273
2274 /* sbic. */
2275 if (0x99 == preceding_msb)
2276 there_is_preceding_non_skip_insn = 0;
2277
2278 /* sbis. */
2279 if (0x9b == preceding_msb)
2280 there_is_preceding_non_skip_insn = 0;
2281
2282 /* sbrc */
2283 if ((0xfc == (preceding_msb & 0xfe)
2284 && (0x00 == (preceding_lsb & 0x08))))
2285 there_is_preceding_non_skip_insn = 0;
2286
2287 /* sbrs */
2288 if ((0xfe == (preceding_msb & 0xfe)
2289 && (0x00 == (preceding_lsb & 0x08))))
2290 there_is_preceding_non_skip_insn = 0;
2291
2292 /* cpse */
2293 if (0x10 == (preceding_msb & 0xfc))
2294 there_is_preceding_non_skip_insn = 0;
2295
2296 if (there_is_preceding_non_skip_insn == 0)
2297 if (debug_relax)
2298 printf ("preceding skip insn prevents deletion of"
2299 " ret insn at Addy 0x%x in section %s\n",
2300 (int) dot + 2, sec->name);
2301 }
2302 else
2303 {
2304 /* There is no previous instruction. */
2305 there_is_preceding_non_skip_insn = 0;
2306 }
2307
2308 if (there_is_preceding_non_skip_insn)
2309 {
2310 /* We now only have to make sure that there is no
2311 local label defined at the address of the ret
2312 instruction and that there is no local relocation
2313 in this section pointing to the ret. */
2314
2315 int deleting_ret_is_safe = 1;
2316 unsigned int section_offset_of_ret_insn =
2317 irel->r_offset + insn_size;
2318 Elf_Internal_Sym *isym, *isymend;
2319 unsigned int sec_shndx;
2320 struct bfd_section *isec;
2321
2322 sec_shndx =
2323 _bfd_elf_section_from_bfd_section (abfd, sec);
2324
2325 /* Check for local symbols. */
2326 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
2327 isymend = isym + symtab_hdr->sh_info;
2328 /* PR 6019: There may not be any local symbols. */
2329 for (; isym != NULL && isym < isymend; isym++)
2330 {
2331 if (isym->st_value == section_offset_of_ret_insn
2332 && isym->st_shndx == sec_shndx)
2333 {
2334 deleting_ret_is_safe = 0;
2335 if (debug_relax)
2336 printf ("local label prevents deletion of ret "
2337 "insn at address 0x%x\n",
2338 (int) dot + insn_size);
2339 }
2340 }
2341
2342 /* Now check for global symbols. */
2343 {
2344 int symcount;
2345 struct elf_link_hash_entry **sym_hashes;
2346 struct elf_link_hash_entry **end_hashes;
2347
2348 symcount = (symtab_hdr->sh_size
2349 / sizeof (Elf32_External_Sym)
2350 - symtab_hdr->sh_info);
2351 sym_hashes = elf_sym_hashes (abfd);
2352 end_hashes = sym_hashes + symcount;
2353 for (; sym_hashes < end_hashes; sym_hashes++)
2354 {
2355 struct elf_link_hash_entry *sym_hash =
2356 *sym_hashes;
2357 if ((sym_hash->root.type == bfd_link_hash_defined
2358 || sym_hash->root.type ==
2359 bfd_link_hash_defweak)
2360 && sym_hash->root.u.def.section == sec
2361 && sym_hash->root.u.def.value == section_offset_of_ret_insn)
2362 {
2363 deleting_ret_is_safe = 0;
2364 if (debug_relax)
2365 printf ("global label prevents deletion of "
2366 "ret insn at address 0x%x\n",
2367 (int) dot + insn_size);
2368 }
2369 }
2370 }
2371
2372 /* Now we check for relocations pointing to ret. */
2373 for (isec = abfd->sections; isec && deleting_ret_is_safe; isec = isec->next)
2374 {
2375 Elf_Internal_Rela *rel;
2376 Elf_Internal_Rela *relend;
2377
2378 rel = elf_section_data (isec)->relocs;
2379 if (rel == NULL)
2380 rel = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL, TRUE);
2381
2382 relend = rel + isec->reloc_count;
2383
2384 for (; rel && rel < relend; rel++)
2385 {
2386 bfd_vma reloc_target = 0;
2387
2388 /* Read this BFD's local symbols if we haven't
2389 done so already. */
2390 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
2391 {
2392 isymbuf = (Elf_Internal_Sym *)
2393 symtab_hdr->contents;
2394 if (isymbuf == NULL)
2395 isymbuf = bfd_elf_get_elf_syms
2396 (abfd,
2397 symtab_hdr,
2398 symtab_hdr->sh_info, 0,
2399 NULL, NULL, NULL);
2400 if (isymbuf == NULL)
2401 break;
2402 }
2403
2404 /* Get the value of the symbol referred to
2405 by the reloc. */
2406 if (ELF32_R_SYM (rel->r_info)
2407 < symtab_hdr->sh_info)
2408 {
2409 /* A local symbol. */
2410 asection *sym_sec;
2411
2412 isym = isymbuf
2413 + ELF32_R_SYM (rel->r_info);
2414 sym_sec = bfd_section_from_elf_index
2415 (abfd, isym->st_shndx);
2416 symval = isym->st_value;
2417
2418 /* If the reloc is absolute, it will not
2419 have a symbol or section associated
2420 with it. */
2421
2422 if (sym_sec)
2423 {
2424 symval +=
2425 sym_sec->output_section->vma
2426 + sym_sec->output_offset;
2427 reloc_target = symval + rel->r_addend;
2428 }
2429 else
2430 {
2431 reloc_target = symval + rel->r_addend;
2432 /* Reference symbol is absolute. */
2433 }
2434 }
2435 /* else ... reference symbol is extern. */
2436
2437 if (address_of_ret == reloc_target)
2438 {
2439 deleting_ret_is_safe = 0;
2440 if (debug_relax)
2441 printf ("ret from "
2442 "rjmp/jmp ret sequence at address"
2443 " 0x%x could not be deleted. ret"
2444 " is target of a relocation.\n",
2445 (int) address_of_ret);
2446 break;
2447 }
2448 }
2449 }
2450
2451 if (deleting_ret_is_safe)
2452 {
2453 if (debug_relax)
2454 printf ("unreachable ret instruction "
2455 "at address 0x%x deleted.\n",
2456 (int) dot + insn_size);
2457
2458 /* Delete two bytes of data. */
2459 if (!elf32_avr_relax_delete_bytes (abfd, sec,
2460 irel->r_offset + insn_size, 2))
2461 goto error_return;
2462
2463 /* That will change things, so, we should relax
2464 again. Note that this is not required, and it
2465 may be slow. */
2466 *again = TRUE;
2467 break;
2468 }
2469 }
2470 }
2471 }
2472 break;
2473 }
2474 }
2475 }
2476
2477 if (contents != NULL
2478 && elf_section_data (sec)->this_hdr.contents != contents)
2479 {
2480 if (! link_info->keep_memory)
2481 free (contents);
2482 else
2483 {
2484 /* Cache the section contents for elf_link_input_bfd. */
2485 elf_section_data (sec)->this_hdr.contents = contents;
2486 }
2487 }
2488
2489 if (internal_relocs != NULL
2490 && elf_section_data (sec)->relocs != internal_relocs)
2491 free (internal_relocs);
2492
2493 return TRUE;
2494
2495 error_return:
2496 if (isymbuf != NULL
2497 && symtab_hdr->contents != (unsigned char *) isymbuf)
2498 free (isymbuf);
2499 if (contents != NULL
2500 && elf_section_data (sec)->this_hdr.contents != contents)
2501 free (contents);
2502 if (internal_relocs != NULL
2503 && elf_section_data (sec)->relocs != internal_relocs)
2504 free (internal_relocs);
2505
2506 return FALSE;
2507 }
2508
2509 /* This is a version of bfd_generic_get_relocated_section_contents
2510 which uses elf32_avr_relocate_section.
2511
2512 For avr it's essentially a cut and paste taken from the H8300 port.
2513 The author of the relaxation support patch for avr had absolutely no
2514 clue what is happening here but found out that this part of the code
2515 seems to be important. */
2516
2517 static bfd_byte *
2518 elf32_avr_get_relocated_section_contents (bfd *output_bfd,
2519 struct bfd_link_info *link_info,
2520 struct bfd_link_order *link_order,
2521 bfd_byte *data,
2522 bfd_boolean relocatable,
2523 asymbol **symbols)
2524 {
2525 Elf_Internal_Shdr *symtab_hdr;
2526 asection *input_section = link_order->u.indirect.section;
2527 bfd *input_bfd = input_section->owner;
2528 asection **sections = NULL;
2529 Elf_Internal_Rela *internal_relocs = NULL;
2530 Elf_Internal_Sym *isymbuf = NULL;
2531
2532 /* We only need to handle the case of relaxing, or of having a
2533 particular set of section contents, specially. */
2534 if (relocatable
2535 || elf_section_data (input_section)->this_hdr.contents == NULL)
2536 return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
2537 link_order, data,
2538 relocatable,
2539 symbols);
2540 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2541
2542 memcpy (data, elf_section_data (input_section)->this_hdr.contents,
2543 (size_t) input_section->size);
2544
2545 if ((input_section->flags & SEC_RELOC) != 0
2546 && input_section->reloc_count > 0)
2547 {
2548 asection **secpp;
2549 Elf_Internal_Sym *isym, *isymend;
2550 bfd_size_type amt;
2551
2552 internal_relocs = (_bfd_elf_link_read_relocs
2553 (input_bfd, input_section, NULL, NULL, FALSE));
2554 if (internal_relocs == NULL)
2555 goto error_return;
2556
2557 if (symtab_hdr->sh_info != 0)
2558 {
2559 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
2560 if (isymbuf == NULL)
2561 isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2562 symtab_hdr->sh_info, 0,
2563 NULL, NULL, NULL);
2564 if (isymbuf == NULL)
2565 goto error_return;
2566 }
2567
2568 amt = symtab_hdr->sh_info;
2569 amt *= sizeof (asection *);
2570 sections = bfd_malloc (amt);
2571 if (sections == NULL && amt != 0)
2572 goto error_return;
2573
2574 isymend = isymbuf + symtab_hdr->sh_info;
2575 for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
2576 {
2577 asection *isec;
2578
2579 if (isym->st_shndx == SHN_UNDEF)
2580 isec = bfd_und_section_ptr;
2581 else if (isym->st_shndx == SHN_ABS)
2582 isec = bfd_abs_section_ptr;
2583 else if (isym->st_shndx == SHN_COMMON)
2584 isec = bfd_com_section_ptr;
2585 else
2586 isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
2587
2588 *secpp = isec;
2589 }
2590
2591 if (! elf32_avr_relocate_section (output_bfd, link_info, input_bfd,
2592 input_section, data, internal_relocs,
2593 isymbuf, sections))
2594 goto error_return;
2595
2596 if (sections != NULL)
2597 free (sections);
2598 if (isymbuf != NULL
2599 && symtab_hdr->contents != (unsigned char *) isymbuf)
2600 free (isymbuf);
2601 if (elf_section_data (input_section)->relocs != internal_relocs)
2602 free (internal_relocs);
2603 }
2604
2605 return data;
2606
2607 error_return:
2608 if (sections != NULL)
2609 free (sections);
2610 if (isymbuf != NULL
2611 && symtab_hdr->contents != (unsigned char *) isymbuf)
2612 free (isymbuf);
2613 if (internal_relocs != NULL
2614 && elf_section_data (input_section)->relocs != internal_relocs)
2615 free (internal_relocs);
2616 return NULL;
2617 }
2618
2619
2620 /* Determines the hash entry name for a particular reloc. It consists of
2621 the identifier of the symbol section and the added reloc addend and
2622 symbol offset relative to the section the symbol is attached to. */
2623
2624 static char *
2625 avr_stub_name (const asection *symbol_section,
2626 const bfd_vma symbol_offset,
2627 const Elf_Internal_Rela *rela)
2628 {
2629 char *stub_name;
2630 bfd_size_type len;
2631
2632 len = 8 + 1 + 8 + 1 + 1;
2633 stub_name = bfd_malloc (len);
2634
2635 sprintf (stub_name, "%08x+%08x",
2636 symbol_section->id & 0xffffffff,
2637 (unsigned int) ((rela->r_addend & 0xffffffff) + symbol_offset));
2638
2639 return stub_name;
2640 }
2641
2642
2643 /* Add a new stub entry to the stub hash. Not all fields of the new
2644 stub entry are initialised. */
2645
2646 static struct elf32_avr_stub_hash_entry *
2647 avr_add_stub (const char *stub_name,
2648 struct elf32_avr_link_hash_table *htab)
2649 {
2650 struct elf32_avr_stub_hash_entry *hsh;
2651
2652 /* Enter this entry into the linker stub hash table. */
2653 hsh = avr_stub_hash_lookup (&htab->bstab, stub_name, TRUE, FALSE);
2654
2655 if (hsh == NULL)
2656 {
2657 (*_bfd_error_handler) (_("%B: cannot create stub entry %s"),
2658 NULL, stub_name);
2659 return NULL;
2660 }
2661
2662 hsh->stub_offset = 0;
2663 return hsh;
2664 }
2665
2666 /* We assume that there is already space allocated for the stub section
2667 contents and that before building the stubs the section size is
2668 initialized to 0. We assume that within the stub hash table entry,
2669 the absolute position of the jmp target has been written in the
2670 target_value field. We write here the offset of the generated jmp insn
2671 relative to the trampoline section start to the stub_offset entry in
2672 the stub hash table entry. */
2673
2674 static bfd_boolean
2675 avr_build_one_stub (struct bfd_hash_entry *bh, void *in_arg)
2676 {
2677 struct elf32_avr_stub_hash_entry *hsh;
2678 struct bfd_link_info *info;
2679 struct elf32_avr_link_hash_table *htab;
2680 bfd *stub_bfd;
2681 bfd_byte *loc;
2682 bfd_vma target;
2683 bfd_vma starget;
2684
2685 /* Basic opcode */
2686 bfd_vma jmp_insn = 0x0000940c;
2687
2688 /* Massage our args to the form they really have. */
2689 hsh = avr_stub_hash_entry (bh);
2690
2691 if (!hsh->is_actually_needed)
2692 return TRUE;
2693
2694 info = (struct bfd_link_info *) in_arg;
2695
2696 htab = avr_link_hash_table (info);
2697 if (htab == NULL)
2698 return FALSE;
2699
2700 target = hsh->target_value;
2701
2702 /* Make a note of the offset within the stubs for this entry. */
2703 hsh->stub_offset = htab->stub_sec->size;
2704 loc = htab->stub_sec->contents + hsh->stub_offset;
2705
2706 stub_bfd = htab->stub_sec->owner;
2707
2708 if (debug_stubs)
2709 printf ("Building one Stub. Address: 0x%x, Offset: 0x%x\n",
2710 (unsigned int) target,
2711 (unsigned int) hsh->stub_offset);
2712
2713 /* We now have to add the information on the jump target to the bare
2714 opcode bits already set in jmp_insn. */
2715
2716 /* Check for the alignment of the address. */
2717 if (target & 1)
2718 return FALSE;
2719
2720 starget = target >> 1;
2721 jmp_insn |= ((starget & 0x10000) | ((starget << 3) & 0x1f00000)) >> 16;
2722 bfd_put_16 (stub_bfd, jmp_insn, loc);
2723 bfd_put_16 (stub_bfd, (bfd_vma) starget & 0xffff, loc + 2);
2724
2725 htab->stub_sec->size += 4;
2726
2727 /* Now add the entries in the address mapping table if there is still
2728 space left. */
2729 {
2730 unsigned int nr;
2731
2732 nr = htab->amt_entry_cnt + 1;
2733 if (nr <= htab->amt_max_entry_cnt)
2734 {
2735 htab->amt_entry_cnt = nr;
2736
2737 htab->amt_stub_offsets[nr - 1] = hsh->stub_offset;
2738 htab->amt_destination_addr[nr - 1] = target;
2739 }
2740 }
2741
2742 return TRUE;
2743 }
2744
2745 static bfd_boolean
2746 avr_mark_stub_not_to_be_necessary (struct bfd_hash_entry *bh,
2747 void *in_arg ATTRIBUTE_UNUSED)
2748 {
2749 struct elf32_avr_stub_hash_entry *hsh;
2750
2751 hsh = avr_stub_hash_entry (bh);
2752 hsh->is_actually_needed = FALSE;
2753
2754 return TRUE;
2755 }
2756
2757 static bfd_boolean
2758 avr_size_one_stub (struct bfd_hash_entry *bh, void *in_arg)
2759 {
2760 struct elf32_avr_stub_hash_entry *hsh;
2761 struct elf32_avr_link_hash_table *htab;
2762 int size;
2763
2764 /* Massage our args to the form they really have. */
2765 hsh = avr_stub_hash_entry (bh);
2766 htab = in_arg;
2767
2768 if (hsh->is_actually_needed)
2769 size = 4;
2770 else
2771 size = 0;
2772
2773 htab->stub_sec->size += size;
2774 return TRUE;
2775 }
2776
2777 void
2778 elf32_avr_setup_params (struct bfd_link_info *info,
2779 bfd *avr_stub_bfd,
2780 asection *avr_stub_section,
2781 bfd_boolean no_stubs,
2782 bfd_boolean deb_stubs,
2783 bfd_boolean deb_relax,
2784 bfd_vma pc_wrap_around,
2785 bfd_boolean call_ret_replacement)
2786 {
2787 struct elf32_avr_link_hash_table *htab = avr_link_hash_table (info);
2788
2789 if (htab == NULL)
2790 return;
2791 htab->stub_sec = avr_stub_section;
2792 htab->stub_bfd = avr_stub_bfd;
2793 htab->no_stubs = no_stubs;
2794
2795 debug_relax = deb_relax;
2796 debug_stubs = deb_stubs;
2797 avr_pc_wrap_around = pc_wrap_around;
2798 avr_replace_call_ret_sequences = call_ret_replacement;
2799 }
2800
2801
2802 /* Set up various things so that we can make a list of input sections
2803 for each output section included in the link. Returns -1 on error,
2804 0 when no stubs will be needed, and 1 on success. It also sets
2805 information on the stubs bfd and the stub section in the info
2806 struct. */
2807
2808 int
2809 elf32_avr_setup_section_lists (bfd *output_bfd,
2810 struct bfd_link_info *info)
2811 {
2812 bfd *input_bfd;
2813 unsigned int bfd_count;
2814 int top_id, top_index;
2815 asection *section;
2816 asection **input_list, **list;
2817 bfd_size_type amt;
2818 struct elf32_avr_link_hash_table *htab = avr_link_hash_table (info);
2819
2820 if (htab == NULL || htab->no_stubs)
2821 return 0;
2822
2823 /* Count the number of input BFDs and find the top input section id. */
2824 for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
2825 input_bfd != NULL;
2826 input_bfd = input_bfd->link.next)
2827 {
2828 bfd_count += 1;
2829 for (section = input_bfd->sections;
2830 section != NULL;
2831 section = section->next)
2832 if (top_id < section->id)
2833 top_id = section->id;
2834 }
2835
2836 htab->bfd_count = bfd_count;
2837
2838 /* We can't use output_bfd->section_count here to find the top output
2839 section index as some sections may have been removed, and
2840 strip_excluded_output_sections doesn't renumber the indices. */
2841 for (section = output_bfd->sections, top_index = 0;
2842 section != NULL;
2843 section = section->next)
2844 if (top_index < section->index)
2845 top_index = section->index;
2846
2847 htab->top_index = top_index;
2848 amt = sizeof (asection *) * (top_index + 1);
2849 input_list = bfd_malloc (amt);
2850 htab->input_list = input_list;
2851 if (input_list == NULL)
2852 return -1;
2853
2854 /* For sections we aren't interested in, mark their entries with a
2855 value we can check later. */
2856 list = input_list + top_index;
2857 do
2858 *list = bfd_abs_section_ptr;
2859 while (list-- != input_list);
2860
2861 for (section = output_bfd->sections;
2862 section != NULL;
2863 section = section->next)
2864 if ((section->flags & SEC_CODE) != 0)
2865 input_list[section->index] = NULL;
2866
2867 return 1;
2868 }
2869
2870
2871 /* Read in all local syms for all input bfds, and create hash entries
2872 for export stubs if we are building a multi-subspace shared lib.
2873 Returns -1 on error, 0 otherwise. */
2874
2875 static int
2876 get_local_syms (bfd *input_bfd, struct bfd_link_info *info)
2877 {
2878 unsigned int bfd_indx;
2879 Elf_Internal_Sym *local_syms, **all_local_syms;
2880 struct elf32_avr_link_hash_table *htab = avr_link_hash_table (info);
2881 bfd_size_type amt;
2882
2883 if (htab == NULL)
2884 return -1;
2885
2886 /* We want to read in symbol extension records only once. To do this
2887 we need to read in the local symbols in parallel and save them for
2888 later use; so hold pointers to the local symbols in an array. */
2889 amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
2890 all_local_syms = bfd_zmalloc (amt);
2891 htab->all_local_syms = all_local_syms;
2892 if (all_local_syms == NULL)
2893 return -1;
2894
2895 /* Walk over all the input BFDs, swapping in local symbols.
2896 If we are creating a shared library, create hash entries for the
2897 export stubs. */
2898 for (bfd_indx = 0;
2899 input_bfd != NULL;
2900 input_bfd = input_bfd->link.next, bfd_indx++)
2901 {
2902 Elf_Internal_Shdr *symtab_hdr;
2903
2904 /* We'll need the symbol table in a second. */
2905 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2906 if (symtab_hdr->sh_info == 0)
2907 continue;
2908
2909 /* We need an array of the local symbols attached to the input bfd. */
2910 local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
2911 if (local_syms == NULL)
2912 {
2913 local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2914 symtab_hdr->sh_info, 0,
2915 NULL, NULL, NULL);
2916 /* Cache them for elf_link_input_bfd. */
2917 symtab_hdr->contents = (unsigned char *) local_syms;
2918 }
2919 if (local_syms == NULL)
2920 return -1;
2921
2922 all_local_syms[bfd_indx] = local_syms;
2923 }
2924
2925 return 0;
2926 }
2927
2928 #define ADD_DUMMY_STUBS_FOR_DEBUGGING 0
2929
2930 bfd_boolean
2931 elf32_avr_size_stubs (bfd *output_bfd,
2932 struct bfd_link_info *info,
2933 bfd_boolean is_prealloc_run)
2934 {
2935 struct elf32_avr_link_hash_table *htab;
2936 int stub_changed = 0;
2937
2938 htab = avr_link_hash_table (info);
2939 if (htab == NULL)
2940 return FALSE;
2941
2942 /* At this point we initialize htab->vector_base
2943 To the start of the text output section. */
2944 htab->vector_base = htab->stub_sec->output_section->vma;
2945
2946 if (get_local_syms (info->input_bfds, info))
2947 {
2948 if (htab->all_local_syms)
2949 goto error_ret_free_local;
2950 return FALSE;
2951 }
2952
2953 if (ADD_DUMMY_STUBS_FOR_DEBUGGING)
2954 {
2955 struct elf32_avr_stub_hash_entry *test;
2956
2957 test = avr_add_stub ("Hugo",htab);
2958 test->target_value = 0x123456;
2959 test->stub_offset = 13;
2960
2961 test = avr_add_stub ("Hugo2",htab);
2962 test->target_value = 0x84210;
2963 test->stub_offset = 14;
2964 }
2965
2966 while (1)
2967 {
2968 bfd *input_bfd;
2969 unsigned int bfd_indx;
2970
2971 /* We will have to re-generate the stub hash table each time anything
2972 in memory has changed. */
2973
2974 bfd_hash_traverse (&htab->bstab, avr_mark_stub_not_to_be_necessary, htab);
2975 for (input_bfd = info->input_bfds, bfd_indx = 0;
2976 input_bfd != NULL;
2977 input_bfd = input_bfd->link.next, bfd_indx++)
2978 {
2979 Elf_Internal_Shdr *symtab_hdr;
2980 asection *section;
2981 Elf_Internal_Sym *local_syms;
2982
2983 /* We'll need the symbol table in a second. */
2984 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2985 if (symtab_hdr->sh_info == 0)
2986 continue;
2987
2988 local_syms = htab->all_local_syms[bfd_indx];
2989
2990 /* Walk over each section attached to the input bfd. */
2991 for (section = input_bfd->sections;
2992 section != NULL;
2993 section = section->next)
2994 {
2995 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2996
2997 /* If there aren't any relocs, then there's nothing more
2998 to do. */
2999 if ((section->flags & SEC_RELOC) == 0
3000 || section->reloc_count == 0)
3001 continue;
3002
3003 /* If this section is a link-once section that will be
3004 discarded, then don't create any stubs. */
3005 if (section->output_section == NULL
3006 || section->output_section->owner != output_bfd)
3007 continue;
3008
3009 /* Get the relocs. */
3010 internal_relocs
3011 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
3012 info->keep_memory);
3013 if (internal_relocs == NULL)
3014 goto error_ret_free_local;
3015
3016 /* Now examine each relocation. */
3017 irela = internal_relocs;
3018 irelaend = irela + section->reloc_count;
3019 for (; irela < irelaend; irela++)
3020 {
3021 unsigned int r_type, r_indx;
3022 struct elf32_avr_stub_hash_entry *hsh;
3023 asection *sym_sec;
3024 bfd_vma sym_value;
3025 bfd_vma destination;
3026 struct elf_link_hash_entry *hh;
3027 char *stub_name;
3028
3029 r_type = ELF32_R_TYPE (irela->r_info);
3030 r_indx = ELF32_R_SYM (irela->r_info);
3031
3032 /* Only look for 16 bit GS relocs. No other reloc will need a
3033 stub. */
3034 if (!((r_type == R_AVR_16_PM)
3035 || (r_type == R_AVR_LO8_LDI_GS)
3036 || (r_type == R_AVR_HI8_LDI_GS)))
3037 continue;
3038
3039 /* Now determine the call target, its name, value,
3040 section. */
3041 sym_sec = NULL;
3042 sym_value = 0;
3043 destination = 0;
3044 hh = NULL;
3045 if (r_indx < symtab_hdr->sh_info)
3046 {
3047 /* It's a local symbol. */
3048 Elf_Internal_Sym *sym;
3049 Elf_Internal_Shdr *hdr;
3050 unsigned int shndx;
3051
3052 sym = local_syms + r_indx;
3053 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
3054 sym_value = sym->st_value;
3055 shndx = sym->st_shndx;
3056 if (shndx < elf_numsections (input_bfd))
3057 {
3058 hdr = elf_elfsections (input_bfd)[shndx];
3059 sym_sec = hdr->bfd_section;
3060 destination = (sym_value + irela->r_addend
3061 + sym_sec->output_offset
3062 + sym_sec->output_section->vma);
3063 }
3064 }
3065 else
3066 {
3067 /* It's an external symbol. */
3068 int e_indx;
3069
3070 e_indx = r_indx - symtab_hdr->sh_info;
3071 hh = elf_sym_hashes (input_bfd)[e_indx];
3072
3073 while (hh->root.type == bfd_link_hash_indirect
3074 || hh->root.type == bfd_link_hash_warning)
3075 hh = (struct elf_link_hash_entry *)
3076 (hh->root.u.i.link);
3077
3078 if (hh->root.type == bfd_link_hash_defined
3079 || hh->root.type == bfd_link_hash_defweak)
3080 {
3081 sym_sec = hh->root.u.def.section;
3082 sym_value = hh->root.u.def.value;
3083 if (sym_sec->output_section != NULL)
3084 destination = (sym_value + irela->r_addend
3085 + sym_sec->output_offset
3086 + sym_sec->output_section->vma);
3087 }
3088 else if (hh->root.type == bfd_link_hash_undefweak)
3089 {
3090 if (! info->shared)
3091 continue;
3092 }
3093 else if (hh->root.type == bfd_link_hash_undefined)
3094 {
3095 if (! (info->unresolved_syms_in_objects == RM_IGNORE
3096 && (ELF_ST_VISIBILITY (hh->other)
3097 == STV_DEFAULT)))
3098 continue;
3099 }
3100 else
3101 {
3102 bfd_set_error (bfd_error_bad_value);
3103
3104 error_ret_free_internal:
3105 if (elf_section_data (section)->relocs == NULL)
3106 free (internal_relocs);
3107 goto error_ret_free_local;
3108 }
3109 }
3110
3111 if (! avr_stub_is_required_for_16_bit_reloc
3112 (destination - htab->vector_base))
3113 {
3114 if (!is_prealloc_run)
3115 /* We are having a reloc that does't need a stub. */
3116 continue;
3117
3118 /* We don't right now know if a stub will be needed.
3119 Let's rather be on the safe side. */
3120 }
3121
3122 /* Get the name of this stub. */
3123 stub_name = avr_stub_name (sym_sec, sym_value, irela);
3124
3125 if (!stub_name)
3126 goto error_ret_free_internal;
3127
3128
3129 hsh = avr_stub_hash_lookup (&htab->bstab,
3130 stub_name,
3131 FALSE, FALSE);
3132 if (hsh != NULL)
3133 {
3134 /* The proper stub has already been created. Mark it
3135 to be used and write the possibly changed destination
3136 value. */
3137 hsh->is_actually_needed = TRUE;
3138 hsh->target_value = destination;
3139 free (stub_name);
3140 continue;
3141 }
3142
3143 hsh = avr_add_stub (stub_name, htab);
3144 if (hsh == NULL)
3145 {
3146 free (stub_name);
3147 goto error_ret_free_internal;
3148 }
3149
3150 hsh->is_actually_needed = TRUE;
3151 hsh->target_value = destination;
3152
3153 if (debug_stubs)
3154 printf ("Adding stub with destination 0x%x to the"
3155 " hash table.\n", (unsigned int) destination);
3156 if (debug_stubs)
3157 printf ("(Pre-Alloc run: %i)\n", is_prealloc_run);
3158
3159 stub_changed = TRUE;
3160 }
3161
3162 /* We're done with the internal relocs, free them. */
3163 if (elf_section_data (section)->relocs == NULL)
3164 free (internal_relocs);
3165 }
3166 }
3167
3168 /* Re-Calculate the number of needed stubs. */
3169 htab->stub_sec->size = 0;
3170 bfd_hash_traverse (&htab->bstab, avr_size_one_stub, htab);
3171
3172 if (!stub_changed)
3173 break;
3174
3175 stub_changed = FALSE;
3176 }
3177
3178 free (htab->all_local_syms);
3179 return TRUE;
3180
3181 error_ret_free_local:
3182 free (htab->all_local_syms);
3183 return FALSE;
3184 }
3185
3186
3187 /* Build all the stubs associated with the current output file. The
3188 stubs are kept in a hash table attached to the main linker hash
3189 table. We also set up the .plt entries for statically linked PIC
3190 functions here. This function is called via hppaelf_finish in the
3191 linker. */
3192
3193 bfd_boolean
3194 elf32_avr_build_stubs (struct bfd_link_info *info)
3195 {
3196 asection *stub_sec;
3197 struct bfd_hash_table *table;
3198 struct elf32_avr_link_hash_table *htab;
3199 bfd_size_type total_size = 0;
3200
3201 htab = avr_link_hash_table (info);
3202 if (htab == NULL)
3203 return FALSE;
3204
3205 /* In case that there were several stub sections: */
3206 for (stub_sec = htab->stub_bfd->sections;
3207 stub_sec != NULL;
3208 stub_sec = stub_sec->next)
3209 {
3210 bfd_size_type size;
3211
3212 /* Allocate memory to hold the linker stubs. */
3213 size = stub_sec->size;
3214 total_size += size;
3215
3216 stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
3217 if (stub_sec->contents == NULL && size != 0)
3218 return FALSE;
3219 stub_sec->size = 0;
3220 }
3221
3222 /* Allocate memory for the adress mapping table. */
3223 htab->amt_entry_cnt = 0;
3224 htab->amt_max_entry_cnt = total_size / 4;
3225 htab->amt_stub_offsets = bfd_malloc (sizeof (bfd_vma)
3226 * htab->amt_max_entry_cnt);
3227 htab->amt_destination_addr = bfd_malloc (sizeof (bfd_vma)
3228 * htab->amt_max_entry_cnt );
3229
3230 if (debug_stubs)
3231 printf ("Allocating %i entries in the AMT\n", htab->amt_max_entry_cnt);
3232
3233 /* Build the stubs as directed by the stub hash table. */
3234 table = &htab->bstab;
3235 bfd_hash_traverse (table, avr_build_one_stub, info);
3236
3237 if (debug_stubs)
3238 printf ("Final Stub section Size: %i\n", (int) htab->stub_sec->size);
3239
3240 return TRUE;
3241 }
3242
3243 #define ELF_ARCH bfd_arch_avr
3244 #define ELF_TARGET_ID AVR_ELF_DATA
3245 #define ELF_MACHINE_CODE EM_AVR
3246 #define ELF_MACHINE_ALT1 EM_AVR_OLD
3247 #define ELF_MAXPAGESIZE 1
3248
3249 #define TARGET_LITTLE_SYM avr_elf32_vec
3250 #define TARGET_LITTLE_NAME "elf32-avr"
3251
3252 #define bfd_elf32_bfd_link_hash_table_create elf32_avr_link_hash_table_create
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"