xref: /netbsd-src/external/gpl3/binutils/dist/bfd/elf32-avr.c (revision dd7241df2fae9da4ea2bd20a68f001fa86ecf909)
1 /* AVR-specific support for 32-bit ELF
2    Copyright (C) 1999-2024 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 bool debug_relax = false;
31 
32 /* Enable debugging printout at stdout with this variable.  */
33 static bool debug_stubs = false;
34 
35 static bfd_reloc_status_type
36 bfd_elf_avr_diff_reloc (bfd *, arelent *, asymbol *, void *,
37 			asection *, bfd *, char **);
38 
39 /* Hash table initialization and handling.  Code is taken from the hppa port
40    and adapted to the needs of AVR.  */
41 
42 /* We use two hash tables to hold information for linking avr objects.
43 
44    The first is the elf32_avr_link_hash_table which is derived from the
45    stanard ELF linker hash table.  We use this as a place to attach the other
46    hash table and some static information.
47 
48    The second is the stub hash table which is derived from the base BFD
49    hash table.  The stub hash table holds the information on the linker
50    stubs.  */
51 
52 struct elf32_avr_stub_hash_entry
53 {
54   /* Base hash table entry structure.  */
55   struct bfd_hash_entry bh_root;
56 
57   /* Offset within stub_sec of the beginning of this stub.  */
58   bfd_vma stub_offset;
59 
60   /* Given the symbol's value and its section we can determine its final
61      value when building the stubs (so the stub knows where to jump).  */
62   bfd_vma target_value;
63 
64   /* This way we could mark stubs to be no longer necessary.  */
65   bool is_actually_needed;
66 };
67 
68 struct elf32_avr_link_hash_table
69 {
70   /* The main hash table.  */
71   struct elf_link_hash_table etab;
72 
73   /* The stub hash table.  */
74   struct bfd_hash_table bstab;
75 
76   bool no_stubs;
77 
78   /* Linker stub bfd.  */
79   bfd *stub_bfd;
80 
81   /* The stub section.  */
82   asection *stub_sec;
83 
84   /* Usually 0, unless we are generating code for a bootloader.  Will
85      be initialized by elf32_avr_size_stubs to the vma offset of the
86      output section associated with the stub section.  */
87   bfd_vma vector_base;
88 
89   /* Assorted information used by elf32_avr_size_stubs.  */
90   unsigned int	      bfd_count;
91   unsigned int	      top_index;
92   asection **	      input_list;
93   Elf_Internal_Sym ** all_local_syms;
94 
95   /* Tables for mapping vma beyond the 128k boundary to the address of the
96      corresponding stub.  (AMT)
97      "amt_max_entry_cnt" reflects the number of entries that memory is allocated
98      for in the "amt_stub_offsets" and "amt_destination_addr" arrays.
99      "amt_entry_cnt" informs how many of these entries actually contain
100      useful data.  */
101   unsigned int amt_entry_cnt;
102   unsigned int amt_max_entry_cnt;
103   bfd_vma *    amt_stub_offsets;
104   bfd_vma *    amt_destination_addr;
105 };
106 
107 /* Various hash macros and functions.  */
108 #define avr_link_hash_table(p) \
109   ((is_elf_hash_table ((p)->hash)					\
110     && elf_hash_table_id (elf_hash_table (p)) == AVR_ELF_DATA)		\
111    ? (struct elf32_avr_link_hash_table *) (p)->hash : NULL)
112 
113 #define avr_stub_hash_entry(ent) \
114   ((struct elf32_avr_stub_hash_entry *)(ent))
115 
116 #define avr_stub_hash_lookup(table, string, create, copy) \
117   ((struct elf32_avr_stub_hash_entry *) \
118    bfd_hash_lookup ((table), (string), (create), (copy)))
119 
120 static reloc_howto_type elf_avr_howto_table[] =
121 {
122   HOWTO (R_AVR_NONE,		/* type */
123 	 0,			/* rightshift */
124 	 0,			/* size */
125 	 0,			/* bitsize */
126 	 false,			/* pc_relative */
127 	 0,			/* bitpos */
128 	 complain_overflow_dont, /* complain_on_overflow */
129 	 bfd_elf_generic_reloc,	/* special_function */
130 	 "R_AVR_NONE",		/* name */
131 	 false,			/* partial_inplace */
132 	 0,			/* src_mask */
133 	 0,			/* dst_mask */
134 	 false),		/* pcrel_offset */
135 
136   HOWTO (R_AVR_32,		/* type */
137 	 0,			/* rightshift */
138 	 4,			/* size */
139 	 32,			/* bitsize */
140 	 false,			/* pc_relative */
141 	 0,			/* bitpos */
142 	 complain_overflow_bitfield, /* complain_on_overflow */
143 	 bfd_elf_generic_reloc,	/* special_function */
144 	 "R_AVR_32",		/* name */
145 	 false,			/* partial_inplace */
146 	 0xffffffff,		/* src_mask */
147 	 0xffffffff,		/* dst_mask */
148 	 false),		/* pcrel_offset */
149 
150   /* A 7 bit PC relative relocation.  */
151   HOWTO (R_AVR_7_PCREL,		/* type */
152 	 1,			/* rightshift */
153 	 2,			/* size */
154 	 7,			/* bitsize */
155 	 true,			/* pc_relative */
156 	 3,			/* bitpos */
157 	 complain_overflow_bitfield, /* complain_on_overflow */
158 	 bfd_elf_generic_reloc, /* special_function */
159 	 "R_AVR_7_PCREL",	/* name */
160 	 false,			/* partial_inplace */
161 	 0xffff,		/* src_mask */
162 	 0xffff,		/* dst_mask */
163 	 true),			/* pcrel_offset */
164 
165   /* A 13 bit PC relative relocation.  */
166   HOWTO (R_AVR_13_PCREL,	/* type */
167 	 1,			/* rightshift */
168 	 2,			/* size */
169 	 13,			/* bitsize */
170 	 true,			/* pc_relative */
171 	 0,			/* bitpos */
172 	 complain_overflow_bitfield, /* complain_on_overflow */
173 	 bfd_elf_generic_reloc, /* special_function */
174 	 "R_AVR_13_PCREL",	/* name */
175 	 false,			/* partial_inplace */
176 	 0xfff,			/* src_mask */
177 	 0xfff,			/* dst_mask */
178 	 true),			/* pcrel_offset */
179 
180   /* A 16 bit absolute relocation.  */
181   HOWTO (R_AVR_16,		/* type */
182 	 0,			/* rightshift */
183 	 2,			/* size */
184 	 16,			/* bitsize */
185 	 false,			/* pc_relative */
186 	 0,			/* bitpos */
187 	 complain_overflow_dont, /* complain_on_overflow */
188 	 bfd_elf_generic_reloc,	/* special_function */
189 	 "R_AVR_16",		/* name */
190 	 false,			/* partial_inplace */
191 	 0xffff,		/* src_mask */
192 	 0xffff,		/* dst_mask */
193 	 false),		/* pcrel_offset */
194 
195   /* A 16 bit absolute relocation for command address
196      Will be changed when linker stubs are needed.  */
197   HOWTO (R_AVR_16_PM,		/* type */
198 	 1,			/* rightshift */
199 	 2,			/* size */
200 	 16,			/* bitsize */
201 	 false,			/* pc_relative */
202 	 0,			/* bitpos */
203 	 complain_overflow_bitfield, /* complain_on_overflow */
204 	 bfd_elf_generic_reloc,	/* special_function */
205 	 "R_AVR_16_PM",		/* name */
206 	 false,			/* partial_inplace */
207 	 0xffff,		/* src_mask */
208 	 0xffff,		/* dst_mask */
209 	 false),		/* pcrel_offset */
210   /* A low 8 bit absolute relocation of 16 bit address.
211      For LDI command.  */
212   HOWTO (R_AVR_LO8_LDI,		/* type */
213 	 0,			/* rightshift */
214 	 2,			/* size */
215 	 8,			/* bitsize */
216 	 false,			/* pc_relative */
217 	 0,			/* bitpos */
218 	 complain_overflow_dont, /* complain_on_overflow */
219 	 bfd_elf_generic_reloc,	/* special_function */
220 	 "R_AVR_LO8_LDI",	/* name */
221 	 false,			/* partial_inplace */
222 	 0xffff,		/* src_mask */
223 	 0xffff,		/* dst_mask */
224 	 false),		/* pcrel_offset */
225   /* A high 8 bit absolute relocation of 16 bit address.
226      For LDI command.  */
227   HOWTO (R_AVR_HI8_LDI,		/* type */
228 	 8,			/* rightshift */
229 	 2,			/* size */
230 	 8,			/* bitsize */
231 	 false,			/* pc_relative */
232 	 0,			/* bitpos */
233 	 complain_overflow_dont, /* complain_on_overflow */
234 	 bfd_elf_generic_reloc,	/* special_function */
235 	 "R_AVR_HI8_LDI",	/* name */
236 	 false,			/* partial_inplace */
237 	 0xffff,		/* src_mask */
238 	 0xffff,		/* dst_mask */
239 	 false),		/* pcrel_offset */
240   /* A high 6 bit absolute relocation of 22 bit address.
241      For LDI command.  As well second most significant 8 bit value of
242      a 32 bit link-time constant.  */
243   HOWTO (R_AVR_HH8_LDI,		/* type */
244 	 16,			/* rightshift */
245 	 2,			/* size */
246 	 8,			/* bitsize */
247 	 false,			/* pc_relative */
248 	 0,			/* bitpos */
249 	 complain_overflow_dont, /* complain_on_overflow */
250 	 bfd_elf_generic_reloc,	/* special_function */
251 	 "R_AVR_HH8_LDI",	/* name */
252 	 false,			/* partial_inplace */
253 	 0xffff,		/* src_mask */
254 	 0xffff,		/* dst_mask */
255 	 false),		/* pcrel_offset */
256   /* A negative low 8 bit absolute relocation of 16 bit address.
257      For LDI command.  */
258   HOWTO (R_AVR_LO8_LDI_NEG,	/* type */
259 	 0,			/* rightshift */
260 	 2,			/* size */
261 	 8,			/* bitsize */
262 	 false,			/* pc_relative */
263 	 0,			/* bitpos */
264 	 complain_overflow_dont, /* complain_on_overflow */
265 	 bfd_elf_generic_reloc,	/* special_function */
266 	 "R_AVR_LO8_LDI_NEG",	/* name */
267 	 false,			/* partial_inplace */
268 	 0xffff,		/* src_mask */
269 	 0xffff,		/* dst_mask */
270 	 false),		/* pcrel_offset */
271   /* A negative high 8 bit absolute relocation of 16 bit address.
272      For LDI command.  */
273   HOWTO (R_AVR_HI8_LDI_NEG,	/* type */
274 	 8,			/* rightshift */
275 	 2,			/* size */
276 	 8,			/* bitsize */
277 	 false,			/* pc_relative */
278 	 0,			/* bitpos */
279 	 complain_overflow_dont, /* complain_on_overflow */
280 	 bfd_elf_generic_reloc,	/* special_function */
281 	 "R_AVR_HI8_LDI_NEG",	/* name */
282 	 false,			/* partial_inplace */
283 	 0xffff,		/* src_mask */
284 	 0xffff,		/* dst_mask */
285 	 false),		/* pcrel_offset */
286   /* A negative high 6 bit absolute relocation of 22 bit address.
287      For LDI command.  */
288   HOWTO (R_AVR_HH8_LDI_NEG,	/* type */
289 	 16,			/* rightshift */
290 	 2,			/* size */
291 	 8,			/* bitsize */
292 	 false,			/* pc_relative */
293 	 0,			/* bitpos */
294 	 complain_overflow_dont, /* complain_on_overflow */
295 	 bfd_elf_generic_reloc,	/* special_function */
296 	 "R_AVR_HH8_LDI_NEG",	/* name */
297 	 false,			/* partial_inplace */
298 	 0xffff,		/* src_mask */
299 	 0xffff,		/* dst_mask */
300 	 false),		/* pcrel_offset */
301   /* A low 8 bit absolute relocation of 24 bit program memory address.
302      For LDI command.  Will not be changed when linker stubs are needed. */
303   HOWTO (R_AVR_LO8_LDI_PM,	/* type */
304 	 1,			/* rightshift */
305 	 2,			/* size */
306 	 8,			/* bitsize */
307 	 false,			/* pc_relative */
308 	 0,			/* bitpos */
309 	 complain_overflow_dont, /* complain_on_overflow */
310 	 bfd_elf_generic_reloc,	/* special_function */
311 	 "R_AVR_LO8_LDI_PM",	/* name */
312 	 false,			/* partial_inplace */
313 	 0xffff,		/* src_mask */
314 	 0xffff,		/* dst_mask */
315 	 false),		/* pcrel_offset */
316   /* A low 8 bit absolute relocation of 24 bit program memory address.
317      For LDI command.  Will not be changed when linker stubs are needed. */
318   HOWTO (R_AVR_HI8_LDI_PM,	/* type */
319 	 9,			/* rightshift */
320 	 2,			/* size */
321 	 8,			/* bitsize */
322 	 false,			/* pc_relative */
323 	 0,			/* bitpos */
324 	 complain_overflow_dont, /* complain_on_overflow */
325 	 bfd_elf_generic_reloc,	/* special_function */
326 	 "R_AVR_HI8_LDI_PM",	/* name */
327 	 false,			/* partial_inplace */
328 	 0xffff,		/* src_mask */
329 	 0xffff,		/* dst_mask */
330 	 false),		/* pcrel_offset */
331   /* A low 8 bit absolute relocation of 24 bit program memory address.
332      For LDI command.  Will not be changed when linker stubs are needed. */
333   HOWTO (R_AVR_HH8_LDI_PM,	/* type */
334 	 17,			/* rightshift */
335 	 2,			/* size */
336 	 8,			/* bitsize */
337 	 false,			/* pc_relative */
338 	 0,			/* bitpos */
339 	 complain_overflow_dont, /* complain_on_overflow */
340 	 bfd_elf_generic_reloc,	/* special_function */
341 	 "R_AVR_HH8_LDI_PM",	/* name */
342 	 false,			/* partial_inplace */
343 	 0xffff,		/* src_mask */
344 	 0xffff,		/* dst_mask */
345 	 false),		/* pcrel_offset */
346   /* A low 8 bit absolute relocation of 24 bit program memory address.
347      For LDI command.  Will not be changed when linker stubs are needed. */
348   HOWTO (R_AVR_LO8_LDI_PM_NEG,	/* type */
349 	 1,			/* rightshift */
350 	 2,			/* size */
351 	 8,			/* bitsize */
352 	 false,			/* pc_relative */
353 	 0,			/* bitpos */
354 	 complain_overflow_dont, /* complain_on_overflow */
355 	 bfd_elf_generic_reloc,	/* special_function */
356 	 "R_AVR_LO8_LDI_PM_NEG", /* name */
357 	 false,			/* partial_inplace */
358 	 0xffff,		/* src_mask */
359 	 0xffff,		/* dst_mask */
360 	 false),		/* pcrel_offset */
361   /* A low 8 bit absolute relocation of 24 bit program memory address.
362      For LDI command.  Will not be changed when linker stubs are needed. */
363   HOWTO (R_AVR_HI8_LDI_PM_NEG,	/* type */
364 	 9,			/* rightshift */
365 	 2,			/* size */
366 	 8,			/* bitsize */
367 	 false,			/* pc_relative */
368 	 0,			/* bitpos */
369 	 complain_overflow_dont, /* complain_on_overflow */
370 	 bfd_elf_generic_reloc,	/* special_function */
371 	 "R_AVR_HI8_LDI_PM_NEG", /* name */
372 	 false,			/* partial_inplace */
373 	 0xffff,		/* src_mask */
374 	 0xffff,		/* dst_mask */
375 	 false),		/* pcrel_offset */
376   /* A low 8 bit absolute relocation of 24 bit program memory address.
377      For LDI command.  Will not be changed when linker stubs are needed. */
378   HOWTO (R_AVR_HH8_LDI_PM_NEG,	/* type */
379 	 17,			/* rightshift */
380 	 2,			/* size */
381 	 8,			/* bitsize */
382 	 false,			/* pc_relative */
383 	 0,			/* bitpos */
384 	 complain_overflow_dont, /* complain_on_overflow */
385 	 bfd_elf_generic_reloc,	/* special_function */
386 	 "R_AVR_HH8_LDI_PM_NEG", /* name */
387 	 false,			/* partial_inplace */
388 	 0xffff,		/* src_mask */
389 	 0xffff,		/* dst_mask */
390 	 false),		/* pcrel_offset */
391   /* Relocation for CALL command in ATmega.  */
392   HOWTO (R_AVR_CALL,		/* type */
393 	 1,			/* rightshift */
394 	 4,			/* size */
395 	 23,			/* bitsize */
396 	 false,			/* pc_relative */
397 	 0,			/* bitpos */
398 	 complain_overflow_dont,/* complain_on_overflow */
399 	 bfd_elf_generic_reloc,	/* special_function */
400 	 "R_AVR_CALL",		/* name */
401 	 false,			/* partial_inplace */
402 	 0xffffffff,		/* src_mask */
403 	 0xffffffff,		/* dst_mask */
404 	 false),			/* pcrel_offset */
405   /* A 16 bit absolute relocation of 16 bit address.
406      For LDI command.  */
407   HOWTO (R_AVR_LDI,		/* type */
408 	 0,			/* rightshift */
409 	 2,			/* size */
410 	 16,			/* bitsize */
411 	 false,			/* pc_relative */
412 	 0,			/* bitpos */
413 	 complain_overflow_dont,/* complain_on_overflow */
414 	 bfd_elf_generic_reloc,	/* special_function */
415 	 "R_AVR_LDI",		/* name */
416 	 false,			/* partial_inplace */
417 	 0xffff,		/* src_mask */
418 	 0xffff,		/* dst_mask */
419 	 false),		/* pcrel_offset */
420   /* A 6 bit absolute relocation of 6 bit offset.
421      For ldd/sdd command.  */
422   HOWTO (R_AVR_6,		/* type */
423 	 0,			/* rightshift */
424 	 1,			/* size */
425 	 6,			/* bitsize */
426 	 false,			/* pc_relative */
427 	 0,			/* bitpos */
428 	 complain_overflow_dont,/* complain_on_overflow */
429 	 bfd_elf_generic_reloc,	/* special_function */
430 	 "R_AVR_6",		/* name */
431 	 false,			/* partial_inplace */
432 	 0xffff,		/* src_mask */
433 	 0xffff,		/* dst_mask */
434 	 false),		/* pcrel_offset */
435   /* A 6 bit absolute relocation of 6 bit offset.
436      For sbiw/adiw command.  */
437   HOWTO (R_AVR_6_ADIW,		/* type */
438 	 0,			/* rightshift */
439 	 1,			/* size */
440 	 6,			/* bitsize */
441 	 false,			/* pc_relative */
442 	 0,			/* bitpos */
443 	 complain_overflow_dont,/* complain_on_overflow */
444 	 bfd_elf_generic_reloc,	/* special_function */
445 	 "R_AVR_6_ADIW",	/* name */
446 	 false,			/* partial_inplace */
447 	 0xffff,		/* src_mask */
448 	 0xffff,		/* dst_mask */
449 	 false),		/* pcrel_offset */
450   /* Most significant 8 bit value of a 32 bit link-time constant.  */
451   HOWTO (R_AVR_MS8_LDI,		/* type */
452 	 24,			/* rightshift */
453 	 2,			/* size */
454 	 8,			/* bitsize */
455 	 false,			/* pc_relative */
456 	 0,			/* bitpos */
457 	 complain_overflow_dont, /* complain_on_overflow */
458 	 bfd_elf_generic_reloc,	/* special_function */
459 	 "R_AVR_MS8_LDI",	/* name */
460 	 false,			/* partial_inplace */
461 	 0xffff,		/* src_mask */
462 	 0xffff,		/* dst_mask */
463 	 false),		/* pcrel_offset */
464   /* Negative most significant 8 bit value of a 32 bit link-time constant.  */
465   HOWTO (R_AVR_MS8_LDI_NEG,	/* type */
466 	 24,			/* rightshift */
467 	 2,			/* size */
468 	 8,			/* bitsize */
469 	 false,			/* pc_relative */
470 	 0,			/* bitpos */
471 	 complain_overflow_dont, /* complain_on_overflow */
472 	 bfd_elf_generic_reloc,	/* special_function */
473 	 "R_AVR_MS8_LDI_NEG",	/* name */
474 	 false,			/* partial_inplace */
475 	 0xffff,		/* src_mask */
476 	 0xffff,		/* dst_mask */
477 	 false),		/* pcrel_offset */
478   /* A low 8 bit absolute relocation of 24 bit program memory address.
479      For LDI command.  Will be changed when linker stubs are needed.  */
480   HOWTO (R_AVR_LO8_LDI_GS,	/* type */
481 	 1,			/* rightshift */
482 	 2,			/* size */
483 	 8,			/* bitsize */
484 	 false,			/* pc_relative */
485 	 0,			/* bitpos */
486 	 complain_overflow_dont, /* complain_on_overflow */
487 	 bfd_elf_generic_reloc, /* special_function */
488 	 "R_AVR_LO8_LDI_GS",	/* name */
489 	 false,			/* partial_inplace */
490 	 0xffff,		/* src_mask */
491 	 0xffff,		/* dst_mask */
492 	 false),		/* pcrel_offset */
493   /* A low 8 bit absolute relocation of 24 bit program memory address.
494      For LDI command.  Will be changed when linker stubs are needed.  */
495   HOWTO (R_AVR_HI8_LDI_GS,	/* type */
496 	 9,			/* rightshift */
497 	 2,			/* size */
498 	 8,			/* bitsize */
499 	 false,			/* pc_relative */
500 	 0,			/* bitpos */
501 	 complain_overflow_dont, /* complain_on_overflow */
502 	 bfd_elf_generic_reloc, /* special_function */
503 	 "R_AVR_HI8_LDI_GS",	/* name */
504 	 false,			/* partial_inplace */
505 	 0xffff,		/* src_mask */
506 	 0xffff,		/* dst_mask */
507 	 false),		/* pcrel_offset */
508   /* 8 bit offset.  */
509   HOWTO (R_AVR_8,		/* type */
510 	 0,			/* rightshift */
511 	 1,			/* size */
512 	 8,			/* bitsize */
513 	 false,			/* pc_relative */
514 	 0,			/* bitpos */
515 	 complain_overflow_bitfield,/* complain_on_overflow */
516 	 bfd_elf_generic_reloc,	/* special_function */
517 	 "R_AVR_8",		/* name */
518 	 false,			/* partial_inplace */
519 	 0x000000ff,		/* src_mask */
520 	 0x000000ff,		/* dst_mask */
521 	 false),		/* pcrel_offset */
522   /* lo8-part to use in  .byte lo8(sym).  */
523   HOWTO (R_AVR_8_LO8,		/* type */
524 	 0,			/* rightshift */
525 	 1,			/* size */
526 	 8,			/* bitsize */
527 	 false,			/* pc_relative */
528 	 0,			/* bitpos */
529 	 complain_overflow_dont,/* complain_on_overflow */
530 	 bfd_elf_generic_reloc,	/* special_function */
531 	 "R_AVR_8_LO8",		/* name */
532 	 false,			/* partial_inplace */
533 	 0xffffff,		/* src_mask */
534 	 0xffffff,		/* dst_mask */
535 	 false),		/* pcrel_offset */
536   /* hi8-part to use in  .byte hi8(sym).  */
537   HOWTO (R_AVR_8_HI8,		/* type */
538 	 8,			/* rightshift */
539 	 1,			/* size */
540 	 8,			/* bitsize */
541 	 false,			/* pc_relative */
542 	 0,			/* bitpos */
543 	 complain_overflow_dont,/* complain_on_overflow */
544 	 bfd_elf_generic_reloc,	/* special_function */
545 	 "R_AVR_8_HI8",		/* name */
546 	 false,			/* partial_inplace */
547 	 0xffffff,		/* src_mask */
548 	 0xffffff,		/* dst_mask */
549 	 false),		/* pcrel_offset */
550   /* hlo8-part to use in  .byte hlo8(sym).  */
551   HOWTO (R_AVR_8_HLO8,		/* type */
552 	 16,			/* rightshift */
553 	 1,			/* size */
554 	 8,			/* bitsize */
555 	 false,			/* pc_relative */
556 	 0,			/* bitpos */
557 	 complain_overflow_dont,/* complain_on_overflow */
558 	 bfd_elf_generic_reloc,	/* special_function */
559 	 "R_AVR_8_HLO8",	/* name */
560 	 false,			/* partial_inplace */
561 	 0xffffff,		/* src_mask */
562 	 0xffffff,		/* dst_mask */
563 	 false),		/* pcrel_offset */
564   HOWTO (R_AVR_DIFF8,		/* type */
565 	 0,			/* rightshift */
566 	 1,			/* size */
567 	 8,			/* bitsize */
568 	 false,			/* pc_relative */
569 	 0,			/* bitpos */
570 	 complain_overflow_bitfield, /* complain_on_overflow */
571 	 bfd_elf_avr_diff_reloc, /* special_function */
572 	 "R_AVR_DIFF8",		/* name */
573 	 false,			/* partial_inplace */
574 	 0,			/* src_mask */
575 	 0xff,			/* dst_mask */
576 	 false),		/* pcrel_offset */
577   HOWTO (R_AVR_DIFF16,		/* type */
578 	 0,			/* rightshift */
579 	 2,			/* size */
580 	 16,			/* bitsize */
581 	 false,			/* pc_relative */
582 	 0,			/* bitpos */
583 	 complain_overflow_bitfield, /* complain_on_overflow */
584 	 bfd_elf_avr_diff_reloc,/* special_function */
585 	 "R_AVR_DIFF16",	/* name */
586 	 false,			/* partial_inplace */
587 	 0,			/* src_mask */
588 	 0xffff,		/* dst_mask */
589 	 false),		/* pcrel_offset */
590   HOWTO (R_AVR_DIFF32,		/* type */
591 	 0,			/* rightshift */
592 	 4,			/* size */
593 	 32,			/* bitsize */
594 	 false,			/* pc_relative */
595 	 0,			/* bitpos */
596 	 complain_overflow_bitfield, /* complain_on_overflow */
597 	 bfd_elf_avr_diff_reloc,/* special_function */
598 	 "R_AVR_DIFF32",	/* name */
599 	 false,			/* partial_inplace */
600 	 0,			/* src_mask */
601 	 0xffffffff,		/* dst_mask */
602 	 false),		/* pcrel_offset */
603   /* 7 bit immediate for LDS/STS in Tiny core.  */
604   HOWTO (R_AVR_LDS_STS_16,  /* type */
605 	 0,			/* rightshift */
606 	 2,			/* size */
607 	 7,			/* bitsize */
608 	 false,			/* pc_relative */
609 	 0,			/* bitpos */
610 	 complain_overflow_dont,/* complain_on_overflow */
611 	 bfd_elf_generic_reloc, /* special_function */
612 	 "R_AVR_LDS_STS_16",	/* name */
613 	 false,			/* partial_inplace */
614 	 0xffff,		/* src_mask */
615 	 0xffff,		/* dst_mask */
616 	 false),		/* pcrel_offset */
617 
618   HOWTO (R_AVR_PORT6,		/* type */
619 	 0,			/* rightshift */
620 	 1,			/* size */
621 	 6,			/* bitsize */
622 	 false,			/* pc_relative */
623 	 0,			/* bitpos */
624 	 complain_overflow_dont,/* complain_on_overflow */
625 	 bfd_elf_generic_reloc,	/* special_function */
626 	 "R_AVR_PORT6",		/* name */
627 	 false,			/* partial_inplace */
628 	 0xffffff,		/* src_mask */
629 	 0xffffff,		/* dst_mask */
630 	 false),		/* pcrel_offset */
631   HOWTO (R_AVR_PORT5,		/* type */
632 	 0,			/* rightshift */
633 	 1,			/* size */
634 	 5,			/* bitsize */
635 	 false,			/* pc_relative */
636 	 0,			/* bitpos */
637 	 complain_overflow_dont,/* complain_on_overflow */
638 	 bfd_elf_generic_reloc,	/* special_function */
639 	 "R_AVR_PORT5",		/* name */
640 	 false,			/* partial_inplace */
641 	 0xffffff,		/* src_mask */
642 	 0xffffff,		/* dst_mask */
643 	 false),		/* pcrel_offset */
644 
645   /* A 32 bit PC relative relocation.  */
646   HOWTO (R_AVR_32_PCREL,	/* type */
647 	 0,			/* rightshift */
648 	 4,			/* size */
649 	 32,			/* bitsize */
650 	 true,			/* pc_relative */
651 	 0,			/* bitpos */
652 	 complain_overflow_bitfield, /* complain_on_overflow */
653 	 bfd_elf_generic_reloc, /* special_function */
654 	 "R_AVR_32_PCREL",	/* name */
655 	 false,			/* partial_inplace */
656 	 0xffffffff,		/* src_mask */
657 	 0xffffffff,		/* dst_mask */
658 	 true),			/* pcrel_offset */
659 };
660 
661 /* Map BFD reloc types to AVR ELF reloc types.  */
662 
663 struct avr_reloc_map
664 {
665   bfd_reloc_code_real_type bfd_reloc_val;
666   unsigned int elf_reloc_val;
667 };
668 
669 static const struct avr_reloc_map avr_reloc_map[] =
670 {
671   { BFD_RELOC_NONE,		    R_AVR_NONE },
672   { BFD_RELOC_32,		    R_AVR_32 },
673   { BFD_RELOC_AVR_7_PCREL,	    R_AVR_7_PCREL },
674   { BFD_RELOC_AVR_13_PCREL,	    R_AVR_13_PCREL },
675   { BFD_RELOC_16,		    R_AVR_16 },
676   { BFD_RELOC_AVR_16_PM,	    R_AVR_16_PM },
677   { BFD_RELOC_AVR_LO8_LDI,	    R_AVR_LO8_LDI},
678   { BFD_RELOC_AVR_HI8_LDI,	    R_AVR_HI8_LDI },
679   { BFD_RELOC_AVR_HH8_LDI,	    R_AVR_HH8_LDI },
680   { BFD_RELOC_AVR_MS8_LDI,	    R_AVR_MS8_LDI },
681   { BFD_RELOC_AVR_LO8_LDI_NEG,	    R_AVR_LO8_LDI_NEG },
682   { BFD_RELOC_AVR_HI8_LDI_NEG,	    R_AVR_HI8_LDI_NEG },
683   { BFD_RELOC_AVR_HH8_LDI_NEG,	    R_AVR_HH8_LDI_NEG },
684   { BFD_RELOC_AVR_MS8_LDI_NEG,	    R_AVR_MS8_LDI_NEG },
685   { BFD_RELOC_AVR_LO8_LDI_PM,	    R_AVR_LO8_LDI_PM },
686   { BFD_RELOC_AVR_LO8_LDI_GS,	    R_AVR_LO8_LDI_GS },
687   { BFD_RELOC_AVR_HI8_LDI_PM,	    R_AVR_HI8_LDI_PM },
688   { BFD_RELOC_AVR_HI8_LDI_GS,	    R_AVR_HI8_LDI_GS },
689   { BFD_RELOC_AVR_HH8_LDI_PM,	    R_AVR_HH8_LDI_PM },
690   { BFD_RELOC_AVR_LO8_LDI_PM_NEG,   R_AVR_LO8_LDI_PM_NEG },
691   { BFD_RELOC_AVR_HI8_LDI_PM_NEG,   R_AVR_HI8_LDI_PM_NEG },
692   { BFD_RELOC_AVR_HH8_LDI_PM_NEG,   R_AVR_HH8_LDI_PM_NEG },
693   { BFD_RELOC_AVR_CALL,		    R_AVR_CALL },
694   { BFD_RELOC_AVR_LDI,		    R_AVR_LDI  },
695   { BFD_RELOC_AVR_6,		    R_AVR_6    },
696   { BFD_RELOC_AVR_6_ADIW,	    R_AVR_6_ADIW },
697   { BFD_RELOC_8,		    R_AVR_8 },
698   { BFD_RELOC_AVR_8_LO,		    R_AVR_8_LO8 },
699   { BFD_RELOC_AVR_8_HI,		    R_AVR_8_HI8 },
700   { BFD_RELOC_AVR_8_HLO,	    R_AVR_8_HLO8 },
701   { BFD_RELOC_AVR_DIFF8,	    R_AVR_DIFF8 },
702   { BFD_RELOC_AVR_DIFF16,	    R_AVR_DIFF16 },
703   { BFD_RELOC_AVR_DIFF32,	    R_AVR_DIFF32 },
704   { BFD_RELOC_AVR_LDS_STS_16,	    R_AVR_LDS_STS_16},
705   { BFD_RELOC_AVR_PORT6,	    R_AVR_PORT6},
706   { BFD_RELOC_AVR_PORT5,	    R_AVR_PORT5},
707   { BFD_RELOC_32_PCREL,		    R_AVR_32_PCREL}
708 };
709 
710 static const struct bfd_elf_special_section elf_avr_special_sections[] =
711 {
712   { STRING_COMMA_LEN (".noinit"), 0, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
713   { NULL, 0,			  0, 0,		   0 }
714 };
715 
716 /* Meant to be filled one day with the wrap around address for the
717    specific device.  I.e. should get the value 0x4000 for 16k devices,
718    0x8000 for 32k devices and so on.
719 
720    We initialize it here with a value of 0x1000000 resulting in
721    that we will never suggest a wrap-around jump during relaxation.
722    The logic of the source code later on assumes that in
723    avr_pc_wrap_around one single bit is set.  */
724 static bfd_vma avr_pc_wrap_around = 0x10000000;
725 
726 /* If this variable holds a value different from zero, the linker relaxation
727    machine will try to optimize call/ret sequences by a single jump
728    instruction. This option could be switched off by a linker switch.  */
729 static int avr_replace_call_ret_sequences = 1;
730 
731 
732 /* Per-section relaxation related information for avr.  */
733 
734 struct avr_relax_info
735 {
736   /* Track the avr property records that apply to this section.  */
737 
738   struct
739   {
740     /* Number of records in the list.  */
741     unsigned count;
742 
743     /* How many records worth of space have we allocated.  */
744     unsigned allocated;
745 
746     /* The records, only COUNT records are initialised.  */
747     struct avr_property_record *items;
748   } records;
749 };
750 
751 /* Per section data, specialised for avr.  */
752 
753 struct elf_avr_section_data
754 {
755   /* The standard data must appear first.  */
756   struct bfd_elf_section_data elf;
757 
758   /* Relaxation related information.  */
759   struct avr_relax_info relax_info;
760 };
761 
762 /* Possibly initialise avr specific data for new section SEC from ABFD.  */
763 
764 static bool
elf_avr_new_section_hook(bfd * abfd,asection * sec)765 elf_avr_new_section_hook (bfd *abfd, asection *sec)
766 {
767   if (!sec->used_by_bfd)
768     {
769       struct elf_avr_section_data *sdata;
770       size_t amt = sizeof (*sdata);
771 
772       sdata = bfd_zalloc (abfd, amt);
773       if (sdata == NULL)
774 	return false;
775       sec->used_by_bfd = sdata;
776     }
777 
778   return _bfd_elf_new_section_hook (abfd, sec);
779 }
780 
781 /* Return a pointer to the relaxation information for SEC.  */
782 
783 static struct avr_relax_info *
get_avr_relax_info(asection * sec)784 get_avr_relax_info (asection *sec)
785 {
786   struct elf_avr_section_data *section_data;
787 
788   /* No info available if no section or if it is an output section.  */
789   if (!sec || sec == sec->output_section)
790     return NULL;
791 
792   section_data = (struct elf_avr_section_data *) elf_section_data (sec);
793   return &section_data->relax_info;
794 }
795 
796 /* Initialise the per section relaxation information for SEC.  */
797 
798 static void
init_avr_relax_info(asection * sec)799 init_avr_relax_info (asection *sec)
800 {
801   struct avr_relax_info *relax_info = get_avr_relax_info (sec);
802 
803   relax_info->records.count = 0;
804   relax_info->records.allocated = 0;
805   relax_info->records.items = NULL;
806 }
807 
808 /* Initialize an entry in the stub hash table.  */
809 
810 static struct bfd_hash_entry *
stub_hash_newfunc(struct bfd_hash_entry * entry,struct bfd_hash_table * table,const char * string)811 stub_hash_newfunc (struct bfd_hash_entry *entry,
812 		   struct bfd_hash_table *table,
813 		   const char *string)
814 {
815   /* Allocate the structure if it has not already been allocated by a
816      subclass.  */
817   if (entry == NULL)
818     {
819       entry = bfd_hash_allocate (table,
820 				 sizeof (struct elf32_avr_stub_hash_entry));
821       if (entry == NULL)
822 	return entry;
823     }
824 
825   /* Call the allocation method of the superclass.  */
826   entry = bfd_hash_newfunc (entry, table, string);
827   if (entry != NULL)
828     {
829       struct elf32_avr_stub_hash_entry *hsh;
830 
831       /* Initialize the local fields.  */
832       hsh = avr_stub_hash_entry (entry);
833       hsh->stub_offset = 0;
834       hsh->target_value = 0;
835     }
836 
837   return entry;
838 }
839 
840 /* This function is just a straight passthrough to the real
841    function in linker.c.  Its prupose is so that its address
842    can be compared inside the avr_link_hash_table macro.  */
843 
844 static struct bfd_hash_entry *
elf32_avr_link_hash_newfunc(struct bfd_hash_entry * entry,struct bfd_hash_table * table,const char * string)845 elf32_avr_link_hash_newfunc (struct bfd_hash_entry * entry,
846 			     struct bfd_hash_table * table,
847 			     const char * string)
848 {
849   return _bfd_elf_link_hash_newfunc (entry, table, string);
850 }
851 
852 /* Free the derived linker hash table.  */
853 
854 static void
elf32_avr_link_hash_table_free(bfd * obfd)855 elf32_avr_link_hash_table_free (bfd *obfd)
856 {
857   struct elf32_avr_link_hash_table *htab
858     = (struct elf32_avr_link_hash_table *) obfd->link.hash;
859 
860   /* Free the address mapping table.  */
861   free (htab->amt_stub_offsets);
862   free (htab->amt_destination_addr);
863 
864   bfd_hash_table_free (&htab->bstab);
865   _bfd_elf_link_hash_table_free (obfd);
866 }
867 
868 /* Create the derived linker hash table.  The AVR ELF port uses the derived
869    hash table to keep information specific to the AVR ELF linker (without
870    using static variables).  */
871 
872 static struct bfd_link_hash_table *
elf32_avr_link_hash_table_create(bfd * abfd)873 elf32_avr_link_hash_table_create (bfd *abfd)
874 {
875   struct elf32_avr_link_hash_table *htab;
876   size_t amt = sizeof (*htab);
877 
878   htab = bfd_zmalloc (amt);
879   if (htab == NULL)
880     return NULL;
881 
882   if (!_bfd_elf_link_hash_table_init (&htab->etab, abfd,
883 				      elf32_avr_link_hash_newfunc,
884 				      sizeof (struct elf_link_hash_entry),
885 				      AVR_ELF_DATA))
886     {
887       free (htab);
888       return NULL;
889     }
890 
891   /* Init the stub hash table too.  */
892   if (!bfd_hash_table_init (&htab->bstab, stub_hash_newfunc,
893 			    sizeof (struct elf32_avr_stub_hash_entry)))
894     {
895       _bfd_elf_link_hash_table_free (abfd);
896       return NULL;
897     }
898   htab->etab.root.hash_table_free = elf32_avr_link_hash_table_free;
899 
900   return &htab->etab.root;
901 }
902 
903 /* Calculates the effective distance of a pc relative jump/call.  */
904 
905 static int
avr_relative_distance_considering_wrap_around(unsigned int distance)906 avr_relative_distance_considering_wrap_around (unsigned int distance)
907 {
908   unsigned int wrap_around_mask = avr_pc_wrap_around - 1;
909   int dist_with_wrap_around = distance & wrap_around_mask;
910 
911   if (dist_with_wrap_around >= ((int) (avr_pc_wrap_around >> 1)))
912     dist_with_wrap_around -= avr_pc_wrap_around;
913 
914   return dist_with_wrap_around;
915 }
916 
917 
918 static reloc_howto_type *
bfd_elf32_bfd_reloc_type_lookup(bfd * abfd ATTRIBUTE_UNUSED,bfd_reloc_code_real_type code)919 bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
920 				 bfd_reloc_code_real_type code)
921 {
922   unsigned int i;
923 
924   for (i = 0;
925        i < sizeof (avr_reloc_map) / sizeof (struct avr_reloc_map);
926        i++)
927     if (avr_reloc_map[i].bfd_reloc_val == code)
928       return &elf_avr_howto_table[avr_reloc_map[i].elf_reloc_val];
929 
930   return NULL;
931 }
932 
933 static reloc_howto_type *
bfd_elf32_bfd_reloc_name_lookup(bfd * abfd ATTRIBUTE_UNUSED,const char * r_name)934 bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
935 				 const char *r_name)
936 {
937   unsigned int i;
938 
939   for (i = 0;
940        i < sizeof (elf_avr_howto_table) / sizeof (elf_avr_howto_table[0]);
941        i++)
942     if (elf_avr_howto_table[i].name != NULL
943 	&& strcasecmp (elf_avr_howto_table[i].name, r_name) == 0)
944       return &elf_avr_howto_table[i];
945 
946   return NULL;
947 }
948 
949 /* Set the howto pointer for an AVR ELF reloc.  */
950 
951 static bool
avr_info_to_howto_rela(bfd * abfd,arelent * cache_ptr,Elf_Internal_Rela * dst)952 avr_info_to_howto_rela (bfd *abfd,
953 			arelent *cache_ptr,
954 			Elf_Internal_Rela *dst)
955 {
956   unsigned int r_type;
957 
958   r_type = ELF32_R_TYPE (dst->r_info);
959   if (r_type >= (unsigned int) R_AVR_max)
960     {
961       /* xgettext:c-format */
962       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
963 			  abfd, r_type);
964       bfd_set_error (bfd_error_bad_value);
965       return false;
966     }
967   cache_ptr->howto = &elf_avr_howto_table[r_type];
968   return true;
969 }
970 
971 static bool
avr_stub_is_required_for_16_bit_reloc(bfd_vma relocation)972 avr_stub_is_required_for_16_bit_reloc (bfd_vma relocation)
973 {
974   return (relocation >= 0x020000);
975 }
976 
977 /* Returns the address of the corresponding stub if there is one.
978    Returns otherwise an address above 0x020000.  This function
979    could also be used, if there is no knowledge on the section where
980    the destination is found.  */
981 
982 static bfd_vma
avr_get_stub_addr(bfd_vma srel,struct elf32_avr_link_hash_table * htab)983 avr_get_stub_addr (bfd_vma srel,
984 		   struct elf32_avr_link_hash_table *htab)
985 {
986   unsigned int sindex;
987   bfd_vma stub_sec_addr =
988 	      (htab->stub_sec->output_section->vma +
989 	       htab->stub_sec->output_offset);
990 
991   for (sindex = 0; sindex < htab->amt_max_entry_cnt; sindex ++)
992     if (htab->amt_destination_addr[sindex] == srel)
993       return htab->amt_stub_offsets[sindex] + stub_sec_addr;
994 
995   /* Return an address that could not be reached by 16 bit relocs.  */
996   return 0x020000;
997 }
998 
999 /* Perform a diff relocation. Nothing to do, as the difference value is already
1000    written into the section's contents. */
1001 
1002 static bfd_reloc_status_type
bfd_elf_avr_diff_reloc(bfd * abfd ATTRIBUTE_UNUSED,arelent * reloc_entry ATTRIBUTE_UNUSED,asymbol * symbol ATTRIBUTE_UNUSED,void * data ATTRIBUTE_UNUSED,asection * input_section ATTRIBUTE_UNUSED,bfd * output_bfd ATTRIBUTE_UNUSED,char ** error_message ATTRIBUTE_UNUSED)1003 bfd_elf_avr_diff_reloc (bfd *abfd ATTRIBUTE_UNUSED,
1004 		      arelent *reloc_entry ATTRIBUTE_UNUSED,
1005 	      asymbol *symbol ATTRIBUTE_UNUSED,
1006 	      void *data ATTRIBUTE_UNUSED,
1007 	      asection *input_section ATTRIBUTE_UNUSED,
1008 	      bfd *output_bfd ATTRIBUTE_UNUSED,
1009 	      char **error_message ATTRIBUTE_UNUSED)
1010 {
1011   return bfd_reloc_ok;
1012 }
1013 
1014 
1015 /* Perform a single relocation.  By default we use the standard BFD
1016    routines, but a few relocs, we have to do them ourselves.  */
1017 
1018 static bfd_reloc_status_type
avr_final_link_relocate(reloc_howto_type * howto,bfd * input_bfd,asection * input_section,bfd_byte * contents,Elf_Internal_Rela * rel,bfd_vma relocation,struct elf32_avr_link_hash_table * htab)1019 avr_final_link_relocate (reloc_howto_type *		    howto,
1020 			 bfd *				    input_bfd,
1021 			 asection *			    input_section,
1022 			 bfd_byte *			    contents,
1023 			 Elf_Internal_Rela *		    rel,
1024 			 bfd_vma			    relocation,
1025 			 struct elf32_avr_link_hash_table * htab)
1026 {
1027   bfd_reloc_status_type r = bfd_reloc_ok;
1028   bfd_vma x;
1029   bfd_signed_vma srel;
1030   bfd_signed_vma reloc_addr;
1031   bool use_stubs = false;
1032   /* Usually is 0, unless we are generating code for a bootloader.  */
1033   bfd_signed_vma base_addr = htab->vector_base;
1034 
1035   /* Absolute addr of the reloc in the final excecutable.  */
1036   reloc_addr = rel->r_offset + input_section->output_section->vma
1037 	       + input_section->output_offset;
1038 
1039   switch (howto->type)
1040     {
1041     case R_AVR_7_PCREL:
1042       contents += rel->r_offset;
1043       srel = (bfd_signed_vma) relocation;
1044       srel += rel->r_addend;
1045       srel -= rel->r_offset;
1046       srel -= 2;	/* Branch instructions add 2 to the PC...  */
1047       srel -= (input_section->output_section->vma +
1048 	       input_section->output_offset);
1049 
1050       if (srel & 1)
1051 	return bfd_reloc_other;
1052       if (srel > ((1 << 7) - 1) || (srel < - (1 << 7)))
1053 	return bfd_reloc_overflow;
1054       x = bfd_get_16 (input_bfd, contents);
1055       x = (x & 0xfc07) | (((srel >> 1) * 8) & 0x3f8);
1056       bfd_put_16 (input_bfd, x, contents);
1057       break;
1058 
1059     case R_AVR_13_PCREL:
1060       contents   += rel->r_offset;
1061       srel = (bfd_signed_vma) relocation;
1062       srel += rel->r_addend;
1063       srel -= rel->r_offset;
1064       srel -= 2;	/* Branch instructions add 2 to the PC...  */
1065       srel -= (input_section->output_section->vma +
1066 	       input_section->output_offset);
1067 
1068       if (srel & 1)
1069 	return bfd_reloc_other;
1070 
1071       srel = avr_relative_distance_considering_wrap_around (srel);
1072 
1073       /* AVR addresses commands as words.  */
1074       srel >>= 1;
1075 
1076       /* Check for overflow.  */
1077       if (srel < -2048 || srel > 2047)
1078 	{
1079 	  /* Relative distance is too large.  */
1080 
1081 	  /* Always apply WRAPAROUND for avr2, avr25, and avr4.  */
1082 	  switch (bfd_get_mach (input_bfd))
1083 	    {
1084 	    case bfd_mach_avr2:
1085 	    case bfd_mach_avr25:
1086 	    case bfd_mach_avr4:
1087 	      break;
1088 
1089 	    default:
1090 	      return bfd_reloc_overflow;
1091 	    }
1092 	}
1093 
1094       x = bfd_get_16 (input_bfd, contents);
1095       x = (x & 0xf000) | (srel & 0xfff);
1096       bfd_put_16 (input_bfd, x, contents);
1097       break;
1098 
1099     case R_AVR_LO8_LDI:
1100       contents += rel->r_offset;
1101       srel = (bfd_signed_vma) relocation + rel->r_addend;
1102       x = bfd_get_16 (input_bfd, contents);
1103       x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1104       bfd_put_16 (input_bfd, x, contents);
1105       break;
1106 
1107     case R_AVR_LDI:
1108       contents += rel->r_offset;
1109       srel = (bfd_signed_vma) relocation + rel->r_addend;
1110       if (((srel > 0) && (srel & 0xffff) > 255)
1111 	  || ((srel < 0) && ((-srel) & 0xffff) > 128))
1112 	/* Remove offset for data/eeprom section.  */
1113 	return bfd_reloc_overflow;
1114 
1115       x = bfd_get_16 (input_bfd, contents);
1116       x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1117       bfd_put_16 (input_bfd, x, contents);
1118       break;
1119 
1120     case R_AVR_6:
1121       contents += rel->r_offset;
1122       srel = (bfd_signed_vma) relocation + rel->r_addend;
1123       if (((srel & 0xffff) > 63) || (srel < 0))
1124 	/* Remove offset for data/eeprom section.  */
1125 	return bfd_reloc_overflow;
1126       x = bfd_get_16 (input_bfd, contents);
1127       x = (x & 0xd3f8) | ((srel & 7) | ((srel & (3 << 3)) << 7)
1128 		       | ((srel & (1 << 5)) << 8));
1129       bfd_put_16 (input_bfd, x, contents);
1130       break;
1131 
1132     case R_AVR_6_ADIW:
1133       contents += rel->r_offset;
1134       srel = (bfd_signed_vma) relocation + rel->r_addend;
1135       if (((srel & 0xffff) > 63) || (srel < 0))
1136 	/* Remove offset for data/eeprom section.  */
1137 	return bfd_reloc_overflow;
1138       x = bfd_get_16 (input_bfd, contents);
1139       x = (x & 0xff30) | (srel & 0xf) | ((srel & 0x30) << 2);
1140       bfd_put_16 (input_bfd, x, contents);
1141       break;
1142 
1143     case R_AVR_HI8_LDI:
1144       contents += rel->r_offset;
1145       srel = (bfd_signed_vma) relocation + rel->r_addend;
1146       srel = (srel >> 8) & 0xff;
1147       x = bfd_get_16 (input_bfd, contents);
1148       x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1149       bfd_put_16 (input_bfd, x, contents);
1150       break;
1151 
1152     case R_AVR_HH8_LDI:
1153       contents += rel->r_offset;
1154       srel = (bfd_signed_vma) relocation + rel->r_addend;
1155       srel = (srel >> 16) & 0xff;
1156       x = bfd_get_16 (input_bfd, contents);
1157       x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1158       bfd_put_16 (input_bfd, x, contents);
1159       break;
1160 
1161     case R_AVR_MS8_LDI:
1162       contents += rel->r_offset;
1163       srel = (bfd_signed_vma) relocation + rel->r_addend;
1164       srel = (srel >> 24) & 0xff;
1165       x = bfd_get_16 (input_bfd, contents);
1166       x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1167       bfd_put_16 (input_bfd, x, contents);
1168       break;
1169 
1170     case R_AVR_LO8_LDI_NEG:
1171       contents += rel->r_offset;
1172       srel = (bfd_signed_vma) relocation + rel->r_addend;
1173       srel = -srel;
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_HI8_LDI_NEG:
1180       contents += rel->r_offset;
1181       srel = (bfd_signed_vma) relocation + rel->r_addend;
1182       srel = -srel;
1183       srel = (srel >> 8) & 0xff;
1184       x = bfd_get_16 (input_bfd, contents);
1185       x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1186       bfd_put_16 (input_bfd, x, contents);
1187       break;
1188 
1189     case R_AVR_HH8_LDI_NEG:
1190       contents += rel->r_offset;
1191       srel = (bfd_signed_vma) relocation + rel->r_addend;
1192       srel = -srel;
1193       srel = (srel >> 16) & 0xff;
1194       x = bfd_get_16 (input_bfd, contents);
1195       x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1196       bfd_put_16 (input_bfd, x, contents);
1197       break;
1198 
1199     case R_AVR_MS8_LDI_NEG:
1200       contents += rel->r_offset;
1201       srel = (bfd_signed_vma) relocation + rel->r_addend;
1202       srel = -srel;
1203       srel = (srel >> 24) & 0xff;
1204       x = bfd_get_16 (input_bfd, contents);
1205       x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1206       bfd_put_16 (input_bfd, x, contents);
1207       break;
1208 
1209     case R_AVR_LO8_LDI_GS:
1210       use_stubs = (!htab->no_stubs);
1211       /* Fall through.  */
1212     case R_AVR_LO8_LDI_PM:
1213       contents += rel->r_offset;
1214       srel = (bfd_signed_vma) relocation + rel->r_addend;
1215 
1216       if (use_stubs
1217 	  && avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1218 	{
1219 	  bfd_vma old_srel = srel;
1220 
1221 	  /* We need to use the address of the stub instead.  */
1222 	  srel = avr_get_stub_addr (srel, htab);
1223 	  if (debug_stubs)
1224 	    printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1225 		    "reloc at address 0x%x.\n",
1226 		    (unsigned int) srel,
1227 		    (unsigned int) old_srel,
1228 		    (unsigned int) reloc_addr);
1229 
1230 	  if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1231 	    return bfd_reloc_overflow;
1232 	}
1233 
1234       if (srel & 1)
1235 	return bfd_reloc_other;
1236       srel = srel >> 1;
1237       x = bfd_get_16 (input_bfd, contents);
1238       x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1239       bfd_put_16 (input_bfd, x, contents);
1240       break;
1241 
1242     case R_AVR_HI8_LDI_GS:
1243       use_stubs = (!htab->no_stubs);
1244       /* Fall through.  */
1245     case R_AVR_HI8_LDI_PM:
1246       contents += rel->r_offset;
1247       srel = (bfd_signed_vma) relocation + rel->r_addend;
1248 
1249       if (use_stubs
1250 	  && avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1251 	{
1252 	  bfd_vma old_srel = srel;
1253 
1254 	  /* We need to use the address of the stub instead.  */
1255 	  srel = avr_get_stub_addr (srel, htab);
1256 	  if (debug_stubs)
1257 	    printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1258 		    "reloc at address 0x%x.\n",
1259 		    (unsigned int) srel,
1260 		    (unsigned int) old_srel,
1261 		    (unsigned int) reloc_addr);
1262 
1263 	  if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1264 	    return bfd_reloc_overflow;
1265 	}
1266 
1267       if (srel & 1)
1268 	return bfd_reloc_other;
1269       srel = srel >> 1;
1270       srel = (srel >> 8) & 0xff;
1271       x = bfd_get_16 (input_bfd, contents);
1272       x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1273       bfd_put_16 (input_bfd, x, contents);
1274       break;
1275 
1276     case R_AVR_HH8_LDI_PM:
1277       contents += rel->r_offset;
1278       srel = (bfd_signed_vma) relocation + rel->r_addend;
1279       if (srel & 1)
1280 	return bfd_reloc_other;
1281       srel = srel >> 1;
1282       srel = (srel >> 16) & 0xff;
1283       x = bfd_get_16 (input_bfd, contents);
1284       x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1285       bfd_put_16 (input_bfd, x, contents);
1286       break;
1287 
1288     case R_AVR_LO8_LDI_PM_NEG:
1289       contents += rel->r_offset;
1290       srel = (bfd_signed_vma) relocation + rel->r_addend;
1291       srel = -srel;
1292       if (srel & 1)
1293 	return bfd_reloc_other;
1294       srel = srel >> 1;
1295       x = bfd_get_16 (input_bfd, contents);
1296       x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1297       bfd_put_16 (input_bfd, x, contents);
1298       break;
1299 
1300     case R_AVR_HI8_LDI_PM_NEG:
1301       contents += rel->r_offset;
1302       srel = (bfd_signed_vma) relocation + rel->r_addend;
1303       srel = -srel;
1304       if (srel & 1)
1305 	return bfd_reloc_other;
1306       srel = srel >> 1;
1307       srel = (srel >> 8) & 0xff;
1308       x = bfd_get_16 (input_bfd, contents);
1309       x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1310       bfd_put_16 (input_bfd, x, contents);
1311       break;
1312 
1313     case R_AVR_HH8_LDI_PM_NEG:
1314       contents += rel->r_offset;
1315       srel = (bfd_signed_vma) relocation + rel->r_addend;
1316       srel = -srel;
1317       if (srel & 1)
1318 	return bfd_reloc_other;
1319       srel = srel >> 1;
1320       srel = (srel >> 16) & 0xff;
1321       x = bfd_get_16 (input_bfd, contents);
1322       x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1323       bfd_put_16 (input_bfd, x, contents);
1324       break;
1325 
1326     case R_AVR_CALL:
1327       contents += rel->r_offset;
1328       srel = (bfd_signed_vma) relocation + rel->r_addend;
1329       if (srel & 1)
1330 	return bfd_reloc_other;
1331       srel = srel >> 1;
1332       x = bfd_get_16 (input_bfd, contents);
1333       x |= ((srel & 0x10000) | ((srel << 3) & 0x1f00000)) >> 16;
1334       bfd_put_16 (input_bfd, x, contents);
1335       bfd_put_16 (input_bfd, (bfd_vma) srel & 0xffff, contents+2);
1336       break;
1337 
1338     case R_AVR_16_PM:
1339       use_stubs = (!htab->no_stubs);
1340       contents += rel->r_offset;
1341       srel = (bfd_signed_vma) relocation + rel->r_addend;
1342 
1343       if (use_stubs
1344 	  && avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1345 	{
1346 	  bfd_vma old_srel = srel;
1347 
1348 	  /* We need to use the address of the stub instead.  */
1349 	  srel = avr_get_stub_addr (srel,htab);
1350 	  if (debug_stubs)
1351 	    printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1352 		    "reloc at address 0x%x.\n",
1353 		    (unsigned int) srel,
1354 		    (unsigned int) old_srel,
1355 		    (unsigned int) reloc_addr);
1356 
1357 	  if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1358 	    return bfd_reloc_overflow;
1359 	}
1360 
1361       if (srel & 1)
1362 	return bfd_reloc_other;
1363       srel = srel >> 1;
1364       bfd_put_16 (input_bfd, (bfd_vma) srel &0x00ffff, contents);
1365       break;
1366 
1367     case R_AVR_DIFF8:
1368     case R_AVR_DIFF16:
1369     case R_AVR_DIFF32:
1370       /* Nothing to do here, as contents already contains the diff value. */
1371       r = bfd_reloc_ok;
1372       break;
1373 
1374    case R_AVR_LDS_STS_16:
1375       contents += rel->r_offset;
1376       srel = (bfd_signed_vma) relocation + rel->r_addend;
1377       if ((srel & 0xFFFF) < 0x40 || (srel & 0xFFFF) > 0xbf)
1378 	return bfd_reloc_overflow;
1379       srel = srel & 0x7f;
1380       x = bfd_get_16 (input_bfd, contents);
1381       x |= (srel & 0x0f) | ((srel & 0x30) << 5) | ((srel & 0x40) << 2);
1382       bfd_put_16 (input_bfd, x, contents);
1383       break;
1384 
1385     case R_AVR_PORT6:
1386       contents += rel->r_offset;
1387       srel = (bfd_signed_vma) relocation + rel->r_addend;
1388       if ((srel & 0xffff) > 0x3f)
1389 	return bfd_reloc_overflow;
1390       x = bfd_get_16 (input_bfd, contents);
1391       x = (x & 0xf9f0) | ((srel & 0x30) << 5) | (srel & 0x0f);
1392       bfd_put_16 (input_bfd, x, contents);
1393       break;
1394 
1395     case R_AVR_PORT5:
1396       contents += rel->r_offset;
1397       srel = (bfd_signed_vma) relocation + rel->r_addend;
1398       if ((srel & 0xffff) > 0x1f)
1399 	return bfd_reloc_overflow;
1400       x = bfd_get_16 (input_bfd, contents);
1401       x = (x & 0xff07) | ((srel & 0x1f) << 3);
1402       bfd_put_16 (input_bfd, x, contents);
1403       break;
1404 
1405     default:
1406       r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1407 				    contents, rel->r_offset,
1408 				    relocation, rel->r_addend);
1409     }
1410 
1411   return r;
1412 }
1413 
1414 /* Relocate an AVR ELF section.  */
1415 
1416 static int
elf32_avr_relocate_section(bfd * output_bfd ATTRIBUTE_UNUSED,struct bfd_link_info * info,bfd * input_bfd,asection * input_section,bfd_byte * contents,Elf_Internal_Rela * relocs,Elf_Internal_Sym * local_syms,asection ** local_sections)1417 elf32_avr_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
1418 			    struct bfd_link_info *info,
1419 			    bfd *input_bfd,
1420 			    asection *input_section,
1421 			    bfd_byte *contents,
1422 			    Elf_Internal_Rela *relocs,
1423 			    Elf_Internal_Sym *local_syms,
1424 			    asection **local_sections)
1425 {
1426   Elf_Internal_Shdr *		symtab_hdr;
1427   struct elf_link_hash_entry ** sym_hashes;
1428   Elf_Internal_Rela *		rel;
1429   Elf_Internal_Rela *		relend;
1430   struct elf32_avr_link_hash_table * htab = avr_link_hash_table (info);
1431 
1432   if (htab == NULL)
1433     return false;
1434 
1435   symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1436   sym_hashes = elf_sym_hashes (input_bfd);
1437   relend     = relocs + input_section->reloc_count;
1438 
1439   for (rel = relocs; rel < relend; rel ++)
1440     {
1441       reloc_howto_type *	   howto;
1442       unsigned long		   r_symndx;
1443       Elf_Internal_Sym *	   sym;
1444       asection *		   sec;
1445       struct elf_link_hash_entry * h;
1446       bfd_vma			   relocation;
1447       bfd_reloc_status_type	   r;
1448       const char *		   name;
1449       int			   r_type;
1450 
1451       r_type = ELF32_R_TYPE (rel->r_info);
1452       r_symndx = ELF32_R_SYM (rel->r_info);
1453       howto  = elf_avr_howto_table + r_type;
1454       h      = NULL;
1455       sym    = NULL;
1456       sec    = NULL;
1457 
1458       if (r_symndx < symtab_hdr->sh_info)
1459 	{
1460 	  sym = local_syms + r_symndx;
1461 	  sec = local_sections [r_symndx];
1462 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1463 
1464 	  name = bfd_elf_string_from_elf_section
1465 	    (input_bfd, symtab_hdr->sh_link, sym->st_name);
1466 	  name = name == NULL ? bfd_section_name (sec) : name;
1467 	}
1468       else
1469 	{
1470 	  bool unresolved_reloc, warned, ignored;
1471 
1472 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1473 				   r_symndx, symtab_hdr, sym_hashes,
1474 				   h, sec, relocation,
1475 				   unresolved_reloc, warned, ignored);
1476 
1477 	  name = h->root.root.string;
1478 	}
1479 
1480       if (sec != NULL && discarded_section (sec))
1481 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1482 					 rel, 1, relend, howto, 0, contents);
1483 
1484       if (bfd_link_relocatable (info))
1485 	continue;
1486 
1487       r = avr_final_link_relocate (howto, input_bfd, input_section,
1488 				   contents, rel, relocation, htab);
1489 
1490       if (r != bfd_reloc_ok)
1491 	{
1492 	  switch (r)
1493 	    {
1494 	    case bfd_reloc_overflow:
1495 	      (*info->callbacks->reloc_overflow)
1496 		(info, (h ? &h->root : NULL), name, howto->name,
1497 		 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
1498 	      break;
1499 
1500 	    case bfd_reloc_undefined:
1501 	      (*info->callbacks->undefined_symbol)
1502 		(info, name, input_bfd, input_section, rel->r_offset, true);
1503 	      break;
1504 
1505 	    case bfd_reloc_outofrange:
1506 	      /* xgettext:c-format */
1507 	      (*info->callbacks->einfo)
1508 		(_("%X%H: %s against `%s':"
1509 		   " error: relocation applies outside section\n"),
1510 		 input_bfd, input_section, rel->r_offset, howto->name, name);
1511 	      break;
1512 
1513 	    case bfd_reloc_other:
1514 	      /* xgettext:c-format */
1515 	      (*info->callbacks->einfo)
1516 		(_("%X%H: %s against `%s':"
1517 		   " error: relocation target address is odd\n"),
1518 		 input_bfd, input_section, rel->r_offset, howto->name, name);
1519 	      break;
1520 
1521 	    default:
1522 	      /* xgettext:c-format */
1523 	      (*info->callbacks->einfo)
1524 		(_("%X%H: %s against `%s':"
1525 		   " internal error: unexpected relocation result %d\n"),
1526 		 input_bfd, input_section, rel->r_offset, howto->name, name, r);
1527 	      break;
1528 	    }
1529 	}
1530     }
1531 
1532   return true;
1533 }
1534 
1535 /* The final processing done just before writing out a AVR ELF object
1536    file.  This gets the AVR architecture right based on the machine
1537    number.  */
1538 
1539 static bool
bfd_elf_avr_final_write_processing(bfd * abfd)1540 bfd_elf_avr_final_write_processing (bfd *abfd)
1541 {
1542   unsigned long val;
1543 
1544   switch (bfd_get_mach (abfd))
1545     {
1546     default:
1547     case bfd_mach_avr2:
1548       val = E_AVR_MACH_AVR2;
1549       break;
1550 
1551     case bfd_mach_avr1:
1552       val = E_AVR_MACH_AVR1;
1553       break;
1554 
1555     case bfd_mach_avr25:
1556       val = E_AVR_MACH_AVR25;
1557       break;
1558 
1559     case bfd_mach_avr3:
1560       val = E_AVR_MACH_AVR3;
1561       break;
1562 
1563     case bfd_mach_avr31:
1564       val = E_AVR_MACH_AVR31;
1565       break;
1566 
1567     case bfd_mach_avr35:
1568       val = E_AVR_MACH_AVR35;
1569       break;
1570 
1571     case bfd_mach_avr4:
1572       val = E_AVR_MACH_AVR4;
1573       break;
1574 
1575     case bfd_mach_avr5:
1576       val = E_AVR_MACH_AVR5;
1577       break;
1578 
1579     case bfd_mach_avr51:
1580       val = E_AVR_MACH_AVR51;
1581       break;
1582 
1583     case bfd_mach_avr6:
1584       val = E_AVR_MACH_AVR6;
1585       break;
1586 
1587     case bfd_mach_avrxmega1:
1588       val = E_AVR_MACH_XMEGA1;
1589       break;
1590 
1591     case bfd_mach_avrxmega2:
1592       val = E_AVR_MACH_XMEGA2;
1593       break;
1594 
1595     case bfd_mach_avrxmega3:
1596       val = E_AVR_MACH_XMEGA3;
1597       break;
1598 
1599     case bfd_mach_avrxmega4:
1600       val = E_AVR_MACH_XMEGA4;
1601       break;
1602 
1603     case bfd_mach_avrxmega5:
1604       val = E_AVR_MACH_XMEGA5;
1605       break;
1606 
1607     case bfd_mach_avrxmega6:
1608       val = E_AVR_MACH_XMEGA6;
1609       break;
1610 
1611     case bfd_mach_avrxmega7:
1612       val = E_AVR_MACH_XMEGA7;
1613       break;
1614 
1615    case bfd_mach_avrtiny:
1616       val = E_AVR_MACH_AVRTINY;
1617       break;
1618     }
1619 
1620   elf_elfheader (abfd)->e_machine = EM_AVR;
1621   elf_elfheader (abfd)->e_flags &= ~ EF_AVR_MACH;
1622   elf_elfheader (abfd)->e_flags |= val;
1623   return _bfd_elf_final_write_processing (abfd);
1624 }
1625 
1626 /* Set the right machine number.  */
1627 
1628 static bool
elf32_avr_object_p(bfd * abfd)1629 elf32_avr_object_p (bfd *abfd)
1630 {
1631   unsigned int e_set = bfd_mach_avr2;
1632 
1633   if (elf_elfheader (abfd)->e_machine == EM_AVR
1634       || elf_elfheader (abfd)->e_machine == EM_AVR_OLD)
1635     {
1636       int e_mach = elf_elfheader (abfd)->e_flags & EF_AVR_MACH;
1637 
1638       switch (e_mach)
1639 	{
1640 	default:
1641 	case E_AVR_MACH_AVR2:
1642 	  e_set = bfd_mach_avr2;
1643 	  break;
1644 
1645 	case E_AVR_MACH_AVR1:
1646 	  e_set = bfd_mach_avr1;
1647 	  break;
1648 
1649 	case E_AVR_MACH_AVR25:
1650 	  e_set = bfd_mach_avr25;
1651 	  break;
1652 
1653 	case E_AVR_MACH_AVR3:
1654 	  e_set = bfd_mach_avr3;
1655 	  break;
1656 
1657 	case E_AVR_MACH_AVR31:
1658 	  e_set = bfd_mach_avr31;
1659 	  break;
1660 
1661 	case E_AVR_MACH_AVR35:
1662 	  e_set = bfd_mach_avr35;
1663 	  break;
1664 
1665 	case E_AVR_MACH_AVR4:
1666 	  e_set = bfd_mach_avr4;
1667 	  break;
1668 
1669 	case E_AVR_MACH_AVR5:
1670 	  e_set = bfd_mach_avr5;
1671 	  break;
1672 
1673 	case E_AVR_MACH_AVR51:
1674 	  e_set = bfd_mach_avr51;
1675 	  break;
1676 
1677 	case E_AVR_MACH_AVR6:
1678 	  e_set = bfd_mach_avr6;
1679 	  break;
1680 
1681 	case E_AVR_MACH_XMEGA1:
1682 	  e_set = bfd_mach_avrxmega1;
1683 	  break;
1684 
1685 	case E_AVR_MACH_XMEGA2:
1686 	  e_set = bfd_mach_avrxmega2;
1687 	  break;
1688 
1689 	case E_AVR_MACH_XMEGA3:
1690 	  e_set = bfd_mach_avrxmega3;
1691 	  break;
1692 
1693 	case E_AVR_MACH_XMEGA4:
1694 	  e_set = bfd_mach_avrxmega4;
1695 	  break;
1696 
1697 	case E_AVR_MACH_XMEGA5:
1698 	  e_set = bfd_mach_avrxmega5;
1699 	  break;
1700 
1701 	case E_AVR_MACH_XMEGA6:
1702 	  e_set = bfd_mach_avrxmega6;
1703 	  break;
1704 
1705 	case E_AVR_MACH_XMEGA7:
1706 	  e_set = bfd_mach_avrxmega7;
1707 	  break;
1708 
1709     case E_AVR_MACH_AVRTINY:
1710       e_set = bfd_mach_avrtiny;
1711       break;
1712 	}
1713     }
1714   return bfd_default_set_arch_mach (abfd, bfd_arch_avr,
1715 				    e_set);
1716 }
1717 
1718 /* Returns whether the relocation type passed is a diff reloc. */
1719 
1720 static bool
elf32_avr_is_diff_reloc(Elf_Internal_Rela * irel)1721 elf32_avr_is_diff_reloc (Elf_Internal_Rela *irel)
1722 {
1723   return (ELF32_R_TYPE (irel->r_info) == R_AVR_DIFF8
1724 	  ||ELF32_R_TYPE (irel->r_info) == R_AVR_DIFF16
1725 	  || ELF32_R_TYPE (irel->r_info) == R_AVR_DIFF32);
1726 }
1727 
1728 /* Reduce the diff value written in the section by count if the shrinked
1729    insn address happens to fall between the two symbols for which this
1730    diff reloc was emitted.  */
1731 
1732 static void
elf32_avr_adjust_diff_reloc_value(bfd * abfd,struct bfd_section * isec,Elf_Internal_Rela * irel,bfd_vma symval,bfd_vma shrinked_insn_address,int count)1733 elf32_avr_adjust_diff_reloc_value (bfd *abfd,
1734 				   struct bfd_section *isec,
1735 				   Elf_Internal_Rela *irel,
1736 				   bfd_vma symval,
1737 				   bfd_vma shrinked_insn_address,
1738 				   int count)
1739 {
1740   unsigned char *reloc_contents = NULL;
1741   unsigned char *isec_contents = elf_section_data (isec)->this_hdr.contents;
1742   if (isec_contents == NULL)
1743   {
1744     if (! bfd_malloc_and_get_section (abfd, isec, &isec_contents))
1745       return;
1746 
1747     elf_section_data (isec)->this_hdr.contents = isec_contents;
1748   }
1749 
1750   reloc_contents = isec_contents + irel->r_offset;
1751 
1752   /* Read value written in object file. */
1753   bfd_signed_vma x = 0;
1754   switch (ELF32_R_TYPE (irel->r_info))
1755   {
1756   case R_AVR_DIFF8:
1757     {
1758       x = bfd_get_signed_8 (abfd, reloc_contents);
1759       break;
1760     }
1761   case R_AVR_DIFF16:
1762     {
1763       x = bfd_get_signed_16 (abfd, reloc_contents);
1764       break;
1765     }
1766   case R_AVR_DIFF32:
1767     {
1768       x = bfd_get_signed_32 (abfd, reloc_contents);
1769       break;
1770     }
1771   default:
1772     {
1773       BFD_FAIL();
1774     }
1775   }
1776 
1777   /* For a diff reloc sym1 - sym2 the diff at assembly time (x) is written
1778      into the object file at the reloc offset. sym2's logical value is
1779      symval (<start_of_section>) + reloc addend. Compute the start and end
1780      addresses and check if the shrinked insn falls between sym1 and sym2. */
1781 
1782   bfd_vma sym2_address = symval + irel->r_addend;
1783   bfd_vma sym1_address = sym2_address - x;
1784 
1785   /* Don't assume sym2 is bigger than sym1 - the difference
1786      could be negative. Compute start and end addresses, and
1787      use those to see if they span shrinked_insn_address. */
1788 
1789   bfd_vma start_address = sym1_address < sym2_address
1790     ? sym1_address : sym2_address;
1791   bfd_vma end_address = sym1_address > sym2_address
1792     ? sym1_address : sym2_address;
1793 
1794 
1795   if (shrinked_insn_address >= start_address
1796       && shrinked_insn_address < end_address)
1797   {
1798     /* Reduce the diff value by count bytes and write it back into section
1799        contents. */
1800     bfd_signed_vma new_diff = x < 0 ? x + count : x - count;
1801 
1802     if (sym2_address > shrinked_insn_address)
1803       irel->r_addend -= count;
1804 
1805     switch (ELF32_R_TYPE (irel->r_info))
1806     {
1807     case R_AVR_DIFF8:
1808       {
1809 	bfd_put_signed_8 (abfd, new_diff, reloc_contents);
1810 	break;
1811       }
1812     case R_AVR_DIFF16:
1813       {
1814 	bfd_put_signed_16 (abfd, new_diff & 0xFFFF, reloc_contents);
1815 	break;
1816       }
1817     case R_AVR_DIFF32:
1818       {
1819 	bfd_put_signed_32 (abfd, new_diff & 0xFFFFFFFF, reloc_contents);
1820 	break;
1821       }
1822     default:
1823       {
1824 	BFD_FAIL();
1825       }
1826     }
1827 
1828   }
1829 }
1830 
1831 static void
elf32_avr_adjust_reloc_if_spans_insn(bfd * abfd,asection * isec,Elf_Internal_Rela * irel,bfd_vma symval,bfd_vma shrinked_insn_address,bfd_vma shrink_boundary,int count)1832 elf32_avr_adjust_reloc_if_spans_insn (bfd *abfd,
1833 				      asection *isec,
1834 				      Elf_Internal_Rela *irel,  bfd_vma symval,
1835 				      bfd_vma shrinked_insn_address,
1836 				      bfd_vma shrink_boundary,
1837 				      int count)
1838 {
1839 
1840   if (elf32_avr_is_diff_reloc (irel))
1841     {
1842       elf32_avr_adjust_diff_reloc_value (abfd, isec, irel,
1843 					 symval,
1844 					 shrinked_insn_address,
1845 					 count);
1846     }
1847   else
1848     {
1849       bfd_vma reloc_value = symval + irel->r_addend;
1850       bool addend_within_shrink_boundary = reloc_value <= shrink_boundary;
1851 
1852       bool reloc_spans_insn =
1853 	(symval <= shrinked_insn_address
1854 	 && reloc_value > shrinked_insn_address
1855 	 && addend_within_shrink_boundary);
1856 
1857       if (! reloc_spans_insn)
1858 	return;
1859 
1860       irel->r_addend -= count;
1861 
1862       if (debug_relax)
1863 	printf ("Relocation's addend needed to be fixed \n");
1864     }
1865 }
1866 
1867 static bool
avr_should_move_sym(symvalue symval,bfd_vma start,bfd_vma end,bool did_pad)1868 avr_should_move_sym (symvalue symval,
1869 		     bfd_vma start,
1870 		     bfd_vma end,
1871 		     bool did_pad)
1872 {
1873   bool sym_within_boundary = did_pad ? symval < end : symval <= end;
1874   return (symval > start && sym_within_boundary);
1875 }
1876 
1877 static bool
avr_should_reduce_sym_size(symvalue symval,symvalue symend,bfd_vma start,bfd_vma end,bool did_pad)1878 avr_should_reduce_sym_size (symvalue symval,
1879 			    symvalue symend,
1880 			    bfd_vma start,
1881 			    bfd_vma end,
1882 			    bool did_pad)
1883 {
1884   bool sym_end_within_boundary = did_pad ? symend < end : symend <= end;
1885   return (symval <= start && symend > start && sym_end_within_boundary);
1886 }
1887 
1888 static bool
avr_should_increase_sym_size(symvalue symval,symvalue symend,bfd_vma start,bfd_vma end,bool did_pad)1889 avr_should_increase_sym_size (symvalue symval,
1890 			      symvalue symend,
1891 			      bfd_vma start,
1892 			      bfd_vma end,
1893 			      bool did_pad)
1894 {
1895   return (avr_should_move_sym (symval, start, end, did_pad)
1896 	  && symend >= end && did_pad);
1897 }
1898 
1899 /* Delete some bytes from a section while changing the size of an instruction.
1900    The parameter "addr" denotes the section-relative offset pointing just
1901    behind the shrinked instruction. "addr+count" point at the first
1902    byte just behind the original unshrinked instruction. If delete_shrinks_insn
1903    is FALSE, we are deleting redundant padding bytes from relax_info prop
1904    record handling. In that case, addr is section-relative offset of start
1905    of padding, and count is the number of padding bytes to delete. */
1906 
1907 static bool
elf32_avr_relax_delete_bytes(bfd * abfd,asection * sec,bfd_vma addr,int count,bool delete_shrinks_insn)1908 elf32_avr_relax_delete_bytes (bfd *abfd,
1909 			      asection *sec,
1910 			      bfd_vma addr,
1911 			      int count,
1912 			      bool delete_shrinks_insn)
1913 {
1914   Elf_Internal_Shdr *symtab_hdr;
1915   unsigned int sec_shndx;
1916   bfd_byte *contents;
1917   Elf_Internal_Rela *irel, *irelend;
1918   Elf_Internal_Sym *isym;
1919   Elf_Internal_Sym *isymbuf = NULL;
1920   bfd_vma toaddr;
1921   struct elf_link_hash_entry **sym_hashes;
1922   struct elf_link_hash_entry **end_hashes;
1923   unsigned int symcount;
1924   struct avr_relax_info *relax_info;
1925   struct avr_property_record *prop_record = NULL;
1926   bool did_shrink = false;
1927   bool did_pad = false;
1928 
1929   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1930   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1931   contents = elf_section_data (sec)->this_hdr.contents;
1932   relax_info = get_avr_relax_info (sec);
1933 
1934   toaddr = sec->size;
1935 
1936   if (relax_info->records.count > 0)
1937     {
1938       /* There should be no property record within the range of deleted
1939 	 bytes, however, there might be a property record for ADDR, this is
1940 	 how we handle alignment directives.
1941 	 Find the next (if any) property record after the deleted bytes.  */
1942       unsigned int i;
1943 
1944       for (i = 0; i < relax_info->records.count; ++i)
1945 	{
1946 	  bfd_vma offset = relax_info->records.items [i].offset;
1947 
1948 	  BFD_ASSERT (offset <= addr || offset >= (addr + count));
1949 	  if (offset >= (addr + count))
1950 	    {
1951 	      prop_record = &relax_info->records.items [i];
1952 	      toaddr = offset;
1953 	      break;
1954 	    }
1955 	}
1956     }
1957 
1958   irel = elf_section_data (sec)->relocs;
1959   irelend = irel + sec->reloc_count;
1960 
1961   /* Actually delete the bytes.  */
1962   if (toaddr - addr - count > 0)
1963     {
1964       memmove (contents + addr, contents + addr + count,
1965 	       (size_t) (toaddr - addr - count));
1966       did_shrink = true;
1967     }
1968   if (prop_record == NULL)
1969     {
1970       sec->size -= count;
1971       did_shrink = true;
1972     }
1973   else
1974     {
1975       /* Use the property record to fill in the bytes we've opened up.  */
1976       int fill = 0;
1977       switch (prop_record->type)
1978 	{
1979 	case RECORD_ORG_AND_FILL:
1980 	  fill = prop_record->data.org.fill;
1981 	  /* Fall through.  */
1982 	case RECORD_ORG:
1983 	  break;
1984 	case RECORD_ALIGN_AND_FILL:
1985 	  fill = prop_record->data.align.fill;
1986 	  /* Fall through.  */
1987 	case RECORD_ALIGN:
1988 	  prop_record->data.align.preceding_deleted += count;
1989 	  break;
1990 	};
1991       /* If toaddr == (addr + count), then we didn't delete anything, yet
1992 	 we fill count bytes backwards from toaddr. This is still ok - we
1993 	 end up overwriting the bytes we would have deleted. We just need
1994 	 to remember we didn't delete anything i.e. don't set did_shrink,
1995 	 so that we don't corrupt reloc offsets or symbol values.*/
1996       memset (contents + toaddr - count, fill, count);
1997       did_pad = true;
1998     }
1999 
2000   if (!did_shrink)
2001     return true;
2002 
2003   /* Adjust all the reloc addresses.  */
2004   for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
2005     {
2006       bfd_vma old_reloc_address;
2007 
2008       old_reloc_address = (sec->output_section->vma
2009 			   + sec->output_offset + irel->r_offset);
2010 
2011       /* Get the new reloc address.  */
2012       if ((irel->r_offset > addr
2013 	   && irel->r_offset < toaddr))
2014 	{
2015 	  if (debug_relax)
2016 	    printf ("Relocation at address 0x%x needs to be moved.\n"
2017 		    "Old section offset: 0x%x, New section offset: 0x%x \n",
2018 		    (unsigned int) old_reloc_address,
2019 		    (unsigned int) irel->r_offset,
2020 		    (unsigned int) ((irel->r_offset) - count));
2021 
2022 	  irel->r_offset -= count;
2023 	}
2024 
2025     }
2026 
2027    /* The reloc's own addresses are now ok. However, we need to readjust
2028       the reloc's addend, i.e. the reloc's value if two conditions are met:
2029       1.) the reloc is relative to a symbol in this section that
2030 	  is located in front of the shrinked instruction
2031       2.) symbol plus addend end up behind the shrinked instruction.
2032 
2033       The most common case where this happens are relocs relative to
2034       the section-start symbol.
2035 
2036       This step needs to be done for all of the sections of the bfd.  */
2037 
2038   {
2039     struct bfd_section *isec;
2040 
2041     for (isec = abfd->sections; isec; isec = isec->next)
2042      {
2043        bfd_vma symval;
2044        bfd_vma shrinked_insn_address;
2045 
2046        if (isec->reloc_count == 0)
2047 	 continue;
2048 
2049        shrinked_insn_address = (sec->output_section->vma
2050 				+ sec->output_offset + addr);
2051        if (delete_shrinks_insn)
2052 	 shrinked_insn_address -= count;
2053 
2054        irel = elf_section_data (isec)->relocs;
2055        /* PR 12161: Read in the relocs for this section if necessary.  */
2056        if (irel == NULL)
2057 	 irel = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL, true);
2058 
2059        for (irelend = irel + isec->reloc_count;
2060 	    irel < irelend;
2061 	    irel++)
2062 	 {
2063 	   /* Read this BFD's local symbols if we haven't done
2064 	      so already.  */
2065 	   if (isymbuf == NULL && symtab_hdr->sh_info != 0)
2066 	     {
2067 	       isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
2068 	       if (isymbuf == NULL)
2069 		 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
2070 						 symtab_hdr->sh_info, 0,
2071 						 NULL, NULL, NULL);
2072 	       if (isymbuf == NULL)
2073 		 return false;
2074 	     }
2075 
2076 	   /* Get the value of the symbol referred to by the reloc.  */
2077 	   if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
2078 	     {
2079 	       /* A local symbol.  */
2080 	       asection *sym_sec;
2081 
2082 	       isym = isymbuf + ELF32_R_SYM (irel->r_info);
2083 	       sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
2084 	       symval = isym->st_value;
2085 	       /* If the reloc is absolute, it will not have
2086 		  a symbol or section associated with it.  */
2087 	       if (sym_sec == sec)
2088 		 {
2089 		   /* If there is an alignment boundary, we only need to
2090 		      adjust addends that end up below the boundary. */
2091 		   bfd_vma shrink_boundary = (toaddr
2092 					      + sec->output_section->vma
2093 					      + sec->output_offset);
2094 
2095 		   symval += sym_sec->output_section->vma
2096 			     + sym_sec->output_offset;
2097 
2098 		   if (debug_relax)
2099 		     printf ("Checking if the relocation's "
2100 			     "addend needs corrections.\n"
2101 			     "Address of anchor symbol: 0x%x \n"
2102 			     "Address of relocation target: 0x%x \n"
2103 			     "Address of relaxed insn: 0x%x \n",
2104 			     (unsigned int) symval,
2105 			     (unsigned int) (symval + irel->r_addend),
2106 			     (unsigned int) shrinked_insn_address);
2107 
2108 		   elf32_avr_adjust_reloc_if_spans_insn (abfd, isec, irel,
2109 							 symval,
2110 							 shrinked_insn_address,
2111 							 shrink_boundary,
2112 							 count);
2113 		 }
2114 	       /* else...Reference symbol is absolute.  No adjustment needed.  */
2115 	     }
2116 	   /* else...Reference symbol is extern.  No need for adjusting
2117 	      the addend.  */
2118 	 }
2119      }
2120   }
2121 
2122   /* Adjust the local symbols defined in this section.  */
2123   isym = (Elf_Internal_Sym *) symtab_hdr->contents;
2124   /* Fix PR 9841, there may be no local symbols.  */
2125   if (isym != NULL)
2126     {
2127       Elf_Internal_Sym *isymend;
2128 
2129       isymend = isym + symtab_hdr->sh_info;
2130       for (; isym < isymend; isym++)
2131 	{
2132 	  if (isym->st_shndx == sec_shndx)
2133 	    {
2134 	      symvalue symval = isym->st_value;
2135 	      symvalue symend = symval + isym->st_size;
2136 	      if (avr_should_reduce_sym_size (symval, symend,
2137 				      addr, toaddr, did_pad))
2138 		{
2139 		  /* If this assert fires then we have a symbol that ends
2140 		     part way through an instruction.  Does that make
2141 		     sense?  */
2142 		  BFD_ASSERT (isym->st_value + isym->st_size >= addr + count);
2143 		  isym->st_size -= count;
2144 		}
2145 	      else if (avr_should_increase_sym_size (symval, symend,
2146 				      addr, toaddr, did_pad))
2147 		isym->st_size += count;
2148 
2149 	      if (avr_should_move_sym (symval, addr, toaddr, did_pad))
2150 		isym->st_value -= count;
2151 	    }
2152 	}
2153     }
2154 
2155   /* Now adjust the global symbols defined in this section.  */
2156   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2157 	      - symtab_hdr->sh_info);
2158   sym_hashes = elf_sym_hashes (abfd);
2159   end_hashes = sym_hashes + symcount;
2160   for (; sym_hashes < end_hashes; sym_hashes++)
2161     {
2162       struct elf_link_hash_entry *sym_hash = *sym_hashes;
2163       if ((sym_hash->root.type == bfd_link_hash_defined
2164 	   || sym_hash->root.type == bfd_link_hash_defweak)
2165 	  && sym_hash->root.u.def.section == sec)
2166 	{
2167 	  symvalue symval = sym_hash->root.u.def.value;
2168 	  symvalue symend = symval + sym_hash->size;
2169 
2170 	  if (avr_should_reduce_sym_size (symval, symend,
2171 				  addr, toaddr, did_pad))
2172 	    {
2173 	      /* If this assert fires then we have a symbol that ends
2174 		 part way through an instruction.  Does that make
2175 		 sense?  */
2176 	      BFD_ASSERT (symend >= addr + count);
2177 	      sym_hash->size -= count;
2178 	    }
2179 	  else if (avr_should_increase_sym_size (symval, symend,
2180 				  addr, toaddr, did_pad))
2181 	      sym_hash->size += count;
2182 
2183 	  if (avr_should_move_sym (symval, addr, toaddr, did_pad))
2184 	    sym_hash->root.u.def.value -= count;
2185 	}
2186     }
2187 
2188   return true;
2189 }
2190 
2191 static Elf_Internal_Sym *
retrieve_local_syms(bfd * input_bfd)2192 retrieve_local_syms (bfd *input_bfd)
2193 {
2194   Elf_Internal_Shdr *symtab_hdr;
2195   Elf_Internal_Sym *isymbuf;
2196   size_t locsymcount;
2197 
2198   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2199   locsymcount = symtab_hdr->sh_info;
2200 
2201   isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
2202   if (isymbuf == NULL && locsymcount != 0)
2203     isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr, locsymcount, 0,
2204 				    NULL, NULL, NULL);
2205 
2206   /* Save the symbols for this input file so they won't be read again.  */
2207   if (isymbuf && isymbuf != (Elf_Internal_Sym *) symtab_hdr->contents)
2208     symtab_hdr->contents = (unsigned char *) isymbuf;
2209 
2210   return isymbuf;
2211 }
2212 
2213 /* Get the input section for a given symbol index.
2214    If the symbol is:
2215    . a section symbol, return the section;
2216    . a common symbol, return the common section;
2217    . an undefined symbol, return the undefined section;
2218    . an indirect symbol, follow the links;
2219    . an absolute value, return the absolute section.  */
2220 
2221 static asection *
get_elf_r_symndx_section(bfd * abfd,unsigned long r_symndx)2222 get_elf_r_symndx_section (bfd *abfd, unsigned long r_symndx)
2223 {
2224   Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2225   asection *target_sec = NULL;
2226   if (r_symndx < symtab_hdr->sh_info)
2227     {
2228       Elf_Internal_Sym *isymbuf;
2229       unsigned int section_index;
2230 
2231       isymbuf = retrieve_local_syms (abfd);
2232       section_index = isymbuf[r_symndx].st_shndx;
2233 
2234       if (section_index == SHN_UNDEF)
2235 	target_sec = bfd_und_section_ptr;
2236       else if (section_index == SHN_ABS)
2237 	target_sec = bfd_abs_section_ptr;
2238       else if (section_index == SHN_COMMON)
2239 	target_sec = bfd_com_section_ptr;
2240       else
2241 	target_sec = bfd_section_from_elf_index (abfd, section_index);
2242     }
2243   else
2244     {
2245       unsigned long indx = r_symndx - symtab_hdr->sh_info;
2246       struct elf_link_hash_entry *h = elf_sym_hashes (abfd)[indx];
2247 
2248       while (h->root.type == bfd_link_hash_indirect
2249 	     || h->root.type == bfd_link_hash_warning)
2250 	h = (struct elf_link_hash_entry *) h->root.u.i.link;
2251 
2252       switch (h->root.type)
2253 	{
2254 	case bfd_link_hash_defined:
2255 	case  bfd_link_hash_defweak:
2256 	  target_sec = h->root.u.def.section;
2257 	  break;
2258 	case bfd_link_hash_common:
2259 	  target_sec = bfd_com_section_ptr;
2260 	  break;
2261 	case bfd_link_hash_undefined:
2262 	case bfd_link_hash_undefweak:
2263 	  target_sec = bfd_und_section_ptr;
2264 	  break;
2265 	default: /* New indirect warning.  */
2266 	  target_sec = bfd_und_section_ptr;
2267 	  break;
2268 	}
2269     }
2270   return target_sec;
2271 }
2272 
2273 /* Get the section-relative offset for a symbol number.  */
2274 
2275 static bfd_vma
get_elf_r_symndx_offset(bfd * abfd,unsigned long r_symndx)2276 get_elf_r_symndx_offset (bfd *abfd, unsigned long r_symndx)
2277 {
2278   Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2279   bfd_vma offset = 0;
2280 
2281   if (r_symndx < symtab_hdr->sh_info)
2282     {
2283       Elf_Internal_Sym *isymbuf;
2284       isymbuf = retrieve_local_syms (abfd);
2285       offset = isymbuf[r_symndx].st_value;
2286     }
2287   else
2288     {
2289       unsigned long indx = r_symndx - symtab_hdr->sh_info;
2290       struct elf_link_hash_entry *h =
2291 	elf_sym_hashes (abfd)[indx];
2292 
2293       while (h->root.type == bfd_link_hash_indirect
2294 	     || h->root.type == bfd_link_hash_warning)
2295 	h = (struct elf_link_hash_entry *) h->root.u.i.link;
2296       if (h->root.type == bfd_link_hash_defined
2297 	  || h->root.type == bfd_link_hash_defweak)
2298 	offset = h->root.u.def.value;
2299     }
2300   return offset;
2301 }
2302 
2303 /* Iterate over the property records in R_LIST, and copy each record into
2304    the list of records within the relaxation information for the section to
2305    which the record applies.  */
2306 
2307 static void
avr_elf32_assign_records_to_sections(struct avr_property_record_list * r_list)2308 avr_elf32_assign_records_to_sections (struct avr_property_record_list *r_list)
2309 {
2310   unsigned int i;
2311 
2312   for (i = 0; i < r_list->record_count; ++i)
2313     {
2314       struct avr_relax_info *relax_info;
2315 
2316       relax_info = get_avr_relax_info (r_list->records [i].section);
2317       BFD_ASSERT (relax_info != NULL);
2318 
2319       if (relax_info->records.count
2320 	  == relax_info->records.allocated)
2321 	{
2322 	  /* Allocate more space.  */
2323 	  bfd_size_type size;
2324 
2325 	  relax_info->records.allocated += 10;
2326 	  size = (sizeof (struct avr_property_record)
2327 		  * relax_info->records.allocated);
2328 	  relax_info->records.items
2329 	    = bfd_realloc (relax_info->records.items, size);
2330 	}
2331 
2332       memcpy (&relax_info->records.items [relax_info->records.count],
2333 	      &r_list->records [i],
2334 	      sizeof (struct avr_property_record));
2335       relax_info->records.count++;
2336     }
2337 }
2338 
2339 /* Compare two STRUCT AVR_PROPERTY_RECORD in AP and BP, used as the
2340    ordering callback from QSORT.  */
2341 
2342 static int
avr_property_record_compare(const void * ap,const void * bp)2343 avr_property_record_compare (const void *ap, const void *bp)
2344 {
2345   const struct avr_property_record *a
2346     = (struct avr_property_record *) ap;
2347   const struct avr_property_record *b
2348     = (struct avr_property_record *) bp;
2349 
2350   if (a->offset != b->offset)
2351     return (a->offset - b->offset);
2352 
2353   if (a->section != b->section)
2354     return bfd_section_vma (a->section) - bfd_section_vma (b->section);
2355 
2356   return (a->type - b->type);
2357 }
2358 
2359 /* Load all of the avr property sections from all of the bfd objects
2360    referenced from LINK_INFO.  All of the records within each property
2361    section are assigned to the STRUCT AVR_RELAX_INFO within the section
2362    specific data of the appropriate section.  */
2363 
2364 static void
avr_load_all_property_sections(struct bfd_link_info * link_info)2365 avr_load_all_property_sections (struct bfd_link_info *link_info)
2366 {
2367   bfd *abfd;
2368   asection *sec;
2369 
2370   /* Initialize the per-section relaxation info.  */
2371   for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
2372     for (sec = abfd->sections; sec != NULL; sec = sec->next)
2373       {
2374 	init_avr_relax_info (sec);
2375       }
2376 
2377   /* Load the descriptor tables from .avr.prop sections.  */
2378   for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
2379     {
2380       struct avr_property_record_list *r_list;
2381 
2382       r_list = avr_elf32_load_property_records (abfd);
2383       if (r_list != NULL)
2384 	avr_elf32_assign_records_to_sections (r_list);
2385 
2386       free (r_list);
2387     }
2388 
2389   /* Now, for every section, ensure that the descriptor list in the
2390      relaxation data is sorted by ascending offset within the section.  */
2391   for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
2392     for (sec = abfd->sections; sec != NULL; sec = sec->next)
2393       {
2394 	struct avr_relax_info *relax_info = get_avr_relax_info (sec);
2395 	if (relax_info && relax_info->records.count > 0)
2396 	  {
2397 	    unsigned int i;
2398 
2399 	    qsort (relax_info->records.items,
2400 		   relax_info->records.count,
2401 		   sizeof (struct avr_property_record),
2402 		   avr_property_record_compare);
2403 
2404 	    /* For debug purposes, list all the descriptors.  */
2405 	    for (i = 0; i < relax_info->records.count; ++i)
2406 	      {
2407 		switch (relax_info->records.items [i].type)
2408 		  {
2409 		  case RECORD_ORG:
2410 		    break;
2411 		  case RECORD_ORG_AND_FILL:
2412 		    break;
2413 		  case RECORD_ALIGN:
2414 		    break;
2415 		  case RECORD_ALIGN_AND_FILL:
2416 		    break;
2417 		  };
2418 	      }
2419 	  }
2420       }
2421 }
2422 
2423 /* This function handles relaxing for the avr.
2424    Many important relaxing opportunities within functions are already
2425    realized by the compiler itself.
2426    Here we try to replace  call (4 bytes) ->  rcall (2 bytes)
2427    and jump -> rjmp (safes also 2 bytes).
2428    As well we now optimize seqences of
2429      - call/rcall function
2430      - ret
2431    to yield
2432      - jmp/rjmp function
2433      - ret
2434    . In case that within a sequence
2435      - jmp/rjmp label
2436      - ret
2437    the ret could no longer be reached it is optimized away. In order
2438    to check if the ret is no longer needed, it is checked that the ret's address
2439    is not the target of a branch or jump within the same section, it is checked
2440    that there is no skip instruction before the jmp/rjmp and that there
2441    is no local or global label place at the address of the ret.
2442 
2443    We refrain from relaxing within sections ".vectors" and
2444    ".jumptables" in order to maintain the position of the instructions.
2445    There, however, we substitute jmp/call by a sequence rjmp,nop/rcall,nop
2446    if possible. (In future one could possibly use the space of the nop
2447    for the first instruction of the irq service function.
2448 
2449    The .jumptables sections is meant to be used for a future tablejump variant
2450    for the devices with 3-byte program counter where the table itself
2451    contains 4-byte jump instructions whose relative offset must not
2452    be changed.  */
2453 
2454 static bool
elf32_avr_relax_section(bfd * abfd,asection * sec,struct bfd_link_info * link_info,bool * again)2455 elf32_avr_relax_section (bfd *abfd,
2456 			 asection *sec,
2457 			 struct bfd_link_info *link_info,
2458 			 bool *again)
2459 {
2460   Elf_Internal_Shdr *symtab_hdr;
2461   Elf_Internal_Rela *internal_relocs;
2462   Elf_Internal_Rela *irel, *irelend;
2463   bfd_byte *contents = NULL;
2464   Elf_Internal_Sym *isymbuf = NULL;
2465   struct elf32_avr_link_hash_table *htab;
2466   static bool relaxation_initialised = false;
2467 
2468   if (!relaxation_initialised)
2469     {
2470       relaxation_initialised = true;
2471 
2472       /* Load entries from the .avr.prop sections.  */
2473       avr_load_all_property_sections (link_info);
2474     }
2475 
2476   /* If 'shrinkable' is FALSE, do not shrink by deleting bytes while
2477      relaxing. Such shrinking can cause issues for the sections such
2478      as .vectors and .jumptables. Instead the unused bytes should be
2479      filled with nop instructions. */
2480   bool shrinkable = true;
2481 
2482   if (!strcmp (sec->name,".vectors")
2483       || !strcmp (sec->name,".jumptables"))
2484     shrinkable = false;
2485 
2486   if (bfd_link_relocatable (link_info))
2487     (*link_info->callbacks->einfo)
2488       (_("%P%F: --relax and -r may not be used together\n"));
2489 
2490   htab = avr_link_hash_table (link_info);
2491   if (htab == NULL)
2492     return false;
2493 
2494   /* Assume nothing changes.  */
2495   *again = false;
2496 
2497   if ((!htab->no_stubs) && (sec == htab->stub_sec))
2498     {
2499       /* We are just relaxing the stub section.
2500 	 Let's calculate the size needed again.  */
2501       bfd_size_type last_estimated_stub_section_size = htab->stub_sec->size;
2502 
2503       if (debug_relax)
2504 	printf ("Relaxing the stub section. Size prior to this pass: %i\n",
2505 		(int) last_estimated_stub_section_size);
2506 
2507       elf32_avr_size_stubs (htab->stub_sec->output_section->owner,
2508 			    link_info, false);
2509 
2510       /* Check if the number of trampolines changed.  */
2511       if (last_estimated_stub_section_size != htab->stub_sec->size)
2512 	*again = true;
2513 
2514       if (debug_relax)
2515 	printf ("Size of stub section after this pass: %i\n",
2516 		(int) htab->stub_sec->size);
2517 
2518       return true;
2519     }
2520 
2521   /* We don't have to do anything for a relocatable link, if
2522      this section does not have relocs, or if this is not a
2523      code section.  */
2524   if (bfd_link_relocatable (link_info)
2525       || sec->reloc_count == 0
2526       || (sec->flags & SEC_RELOC) == 0
2527       || (sec->flags & SEC_HAS_CONTENTS) == 0
2528       || (sec->flags & SEC_CODE) == 0)
2529     return true;
2530 
2531   /* Check if the object file to relax uses internal symbols so that we
2532      could fix up the relocations.  */
2533   if (!(elf_elfheader (abfd)->e_flags & EF_AVR_LINKRELAX_PREPARED))
2534     return true;
2535 
2536   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2537 
2538   /* Get a copy of the native relocations.  */
2539   internal_relocs = (_bfd_elf_link_read_relocs
2540 		     (abfd, sec, NULL, NULL, link_info->keep_memory));
2541   if (internal_relocs == NULL)
2542     goto error_return;
2543 
2544   /* Walk through the relocs looking for relaxing opportunities.  */
2545   irelend = internal_relocs + sec->reloc_count;
2546   for (irel = internal_relocs; irel < irelend; irel++)
2547     {
2548       bfd_vma symval;
2549 
2550       if (   ELF32_R_TYPE (irel->r_info) != R_AVR_13_PCREL
2551 	  && ELF32_R_TYPE (irel->r_info) != R_AVR_7_PCREL
2552 	  && ELF32_R_TYPE (irel->r_info) != R_AVR_CALL)
2553 	continue;
2554 
2555       /* Get the section contents if we haven't done so already.  */
2556       if (contents == NULL)
2557 	{
2558 	  /* Get cached copy if it exists.  */
2559 	  if (elf_section_data (sec)->this_hdr.contents != NULL)
2560 	    contents = elf_section_data (sec)->this_hdr.contents;
2561 	  else
2562 	    {
2563 	      /* Go get them off disk.  */
2564 	      if (! bfd_malloc_and_get_section (abfd, sec, &contents))
2565 		goto error_return;
2566 	    }
2567 	}
2568 
2569       /* Read this BFD's local symbols if we haven't done so already.  */
2570       if (isymbuf == NULL && symtab_hdr->sh_info != 0)
2571 	{
2572 	  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
2573 	  if (isymbuf == NULL)
2574 	    isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
2575 					    symtab_hdr->sh_info, 0,
2576 					    NULL, NULL, NULL);
2577 	  if (isymbuf == NULL)
2578 	    goto error_return;
2579 	}
2580 
2581 
2582       /* Get the value of the symbol referred to by the reloc.  */
2583       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
2584 	{
2585 	  /* A local symbol.  */
2586 	  Elf_Internal_Sym *isym;
2587 	  asection *sym_sec;
2588 
2589 	  isym = isymbuf + ELF32_R_SYM (irel->r_info);
2590 	  sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
2591 	  symval = isym->st_value;
2592 	  /* If the reloc is absolute, it will not have
2593 	     a symbol or section associated with it.  */
2594 	  if (sym_sec)
2595 	    symval += sym_sec->output_section->vma
2596 	      + sym_sec->output_offset;
2597 	}
2598       else
2599 	{
2600 	  unsigned long indx;
2601 	  struct elf_link_hash_entry *h;
2602 
2603 	  /* An external symbol.  */
2604 	  indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
2605 	  h = elf_sym_hashes (abfd)[indx];
2606 	  BFD_ASSERT (h != NULL);
2607 	  if (h->root.type != bfd_link_hash_defined
2608 	      && h->root.type != bfd_link_hash_defweak)
2609 	    /* This appears to be a reference to an undefined
2610 	       symbol.  Just ignore it--it will be caught by the
2611 	       regular reloc processing.  */
2612 	    continue;
2613 
2614 	  symval = (h->root.u.def.value
2615 		    + h->root.u.def.section->output_section->vma
2616 		    + h->root.u.def.section->output_offset);
2617 	}
2618 
2619       /* For simplicity of coding, we are going to modify the section
2620 	 contents, the section relocs, and the BFD symbol table.  We
2621 	 must tell the rest of the code not to free up this
2622 	 information.  It would be possible to instead create a table
2623 	 of changes which have to be made, as is done in coff-mips.c;
2624 	 that would be more work, but would require less memory when
2625 	 the linker is run.  */
2626       switch (ELF32_R_TYPE (irel->r_info))
2627 	{
2628 	  /* Try to turn a 22-bit absolute call/jump into an 13-bit
2629 	     pc-relative rcall/rjmp.  */
2630 	case R_AVR_CALL:
2631 	  {
2632 	    bfd_vma value = symval + irel->r_addend;
2633 	    bfd_vma dot, gap;
2634 	    int distance_short_enough = 0;
2635 
2636 	    /* Get the address of this instruction.  */
2637 	    dot = (sec->output_section->vma
2638 		   + sec->output_offset + irel->r_offset);
2639 
2640 	    /* Compute the distance from this insn to the branch target.  */
2641 	    gap = value - dot;
2642 
2643 	    /* The ISA manual states that addressable range is PC - 2k + 1 to
2644 	       PC + 2k. In bytes, that would be -4094 <= PC <= 4096. The range
2645 	       is shifted one word to the right, because pc-relative instructions
2646 	       implicitly add one word i.e. rjmp 0 jumps to next insn, not the
2647 	       current one.
2648 	       Therefore, for the !shrinkable case, the range is as above.
2649 	       If shrinkable, then the current code only deletes bytes 3 and
2650 	       4 of the absolute call/jmp, so the forward jump range increases
2651 	       by 2 bytes, but the backward (negative) jump range remains
2652 	       the same. */
2653 
2654 
2655 	    /* Check if the gap falls in the range that can be accommodated
2656 	       in 13bits signed (It is 12bits when encoded, as we deal with
2657 	       word addressing). */
2658 	    if (!shrinkable && ((int) gap >= -4094 && (int) gap <= 4096))
2659 	      distance_short_enough = 1;
2660 	    /* If shrinkable, then we can check for a range of distance which
2661 	       is two bytes farther on the positive direction because the call
2662 	       or jump target will be closer by two bytes after the
2663 	       relaxation. */
2664 	    else if (shrinkable && ((int) gap >= -4094 && (int) gap <= 4098))
2665 	      distance_short_enough = 1;
2666 
2667 	    /* Here we handle the wrap-around case.  E.g. for a 16k device
2668 	       we could use a rjmp to jump from address 0x100 to 0x3d00!
2669 	       In order to make this work properly, we need to fill the
2670 	       vaiable avr_pc_wrap_around with the appropriate value.
2671 	       I.e. 0x4000 for a 16k device.  */
2672 	    {
2673 	      /* Shrinking the code size makes the gaps larger in the
2674 		 case of wrap-arounds.  So we use a heuristical safety
2675 		 margin to avoid that during relax the distance gets
2676 		 again too large for the short jumps.  Let's assume
2677 		 a typical code-size reduction due to relax for a
2678 		 16k device of 600 bytes.  So let's use twice the
2679 		 typical value as safety margin.  */
2680 	      int rgap;
2681 	      int safety_margin;
2682 
2683 	      int assumed_shrink = 600;
2684 	      if (avr_pc_wrap_around > 0x4000)
2685 		assumed_shrink = 900;
2686 
2687 	      safety_margin = 2 * assumed_shrink;
2688 
2689 	      rgap = avr_relative_distance_considering_wrap_around (gap);
2690 
2691 	      if (rgap >= (-4092 + safety_margin)
2692 		  && rgap <= (4094 - safety_margin))
2693 		distance_short_enough = 1;
2694 	    }
2695 
2696 	    if (distance_short_enough)
2697 	      {
2698 		unsigned char code_msb;
2699 		unsigned char code_lsb;
2700 
2701 		if (debug_relax)
2702 		  printf ("shrinking jump/call instruction at address 0x%x"
2703 			  " in section %s\n\n",
2704 			  (int) dot, sec->name);
2705 
2706 		/* Note that we've changed the relocs, section contents,
2707 		   etc.  */
2708 		elf_section_data (sec)->relocs = internal_relocs;
2709 		elf_section_data (sec)->this_hdr.contents = contents;
2710 		symtab_hdr->contents = (unsigned char *) isymbuf;
2711 
2712 		/* Get the instruction code for relaxing.  */
2713 		code_lsb = bfd_get_8 (abfd, contents + irel->r_offset);
2714 		code_msb = bfd_get_8 (abfd, contents + irel->r_offset + 1);
2715 
2716 		/* Mask out the relocation bits.  */
2717 		code_msb &= 0x94;
2718 		code_lsb &= 0x0E;
2719 		if (code_msb == 0x94 && code_lsb == 0x0E)
2720 		  {
2721 		    /* we are changing call -> rcall .  */
2722 		    bfd_put_8 (abfd, 0x00, contents + irel->r_offset);
2723 		    bfd_put_8 (abfd, 0xD0, contents + irel->r_offset + 1);
2724 		  }
2725 		else if (code_msb == 0x94 && code_lsb == 0x0C)
2726 		  {
2727 		    /* we are changeing jump -> rjmp.  */
2728 		    bfd_put_8 (abfd, 0x00, contents + irel->r_offset);
2729 		    bfd_put_8 (abfd, 0xC0, contents + irel->r_offset + 1);
2730 		  }
2731 		else
2732 		  abort ();
2733 
2734 		/* Fix the relocation's type.  */
2735 		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2736 					     R_AVR_13_PCREL);
2737 
2738 		/* We should not modify the ordering if 'shrinkable' is
2739 		   FALSE. */
2740 		if (!shrinkable)
2741 		  {
2742 		    /* Let's insert a nop.  */
2743 		    bfd_put_8 (abfd, 0x00, contents + irel->r_offset + 2);
2744 		    bfd_put_8 (abfd, 0x00, contents + irel->r_offset + 3);
2745 		  }
2746 		else
2747 		  {
2748 		    /* Delete two bytes of data.  */
2749 		    if (!elf32_avr_relax_delete_bytes (abfd, sec,
2750 						       irel->r_offset + 2, 2,
2751 						       true))
2752 		      goto error_return;
2753 
2754 		    /* That will change things, so, we should relax again.
2755 		       Note that this is not required, and it may be slow.  */
2756 		    *again = true;
2757 		  }
2758 	      }
2759 	  }
2760 	  /* Fall through.  */
2761 
2762 	default:
2763 	  {
2764 	    unsigned char code_msb;
2765 	    unsigned char code_lsb;
2766 	    bfd_vma dot;
2767 
2768 	    code_msb = bfd_get_8 (abfd, contents + irel->r_offset + 1);
2769 	    code_lsb = bfd_get_8 (abfd, contents + irel->r_offset + 0);
2770 
2771 	    /* Get the address of this instruction.  */
2772 	    dot = (sec->output_section->vma
2773 		   + sec->output_offset + irel->r_offset);
2774 
2775 	    /* Here we look for rcall/ret or call/ret sequences that could be
2776 	       safely replaced by rjmp/ret or jmp/ret.  */
2777 	    if (((code_msb & 0xf0) == 0xd0)
2778 		&& avr_replace_call_ret_sequences)
2779 	      {
2780 		/* This insn is a rcall.  */
2781 		unsigned char next_insn_msb = 0;
2782 		unsigned char next_insn_lsb = 0;
2783 
2784 		if (irel->r_offset + 3 < sec->size)
2785 		  {
2786 		    next_insn_msb =
2787 		      bfd_get_8 (abfd, contents + irel->r_offset + 3);
2788 		    next_insn_lsb =
2789 		      bfd_get_8 (abfd, contents + irel->r_offset + 2);
2790 		  }
2791 
2792 		if ((0x95 == next_insn_msb) && (0x08 == next_insn_lsb))
2793 		  {
2794 		    /* The next insn is a ret. We now convert the rcall insn
2795 		       into a rjmp instruction.  */
2796 		    code_msb &= 0xef;
2797 		    bfd_put_8 (abfd, code_msb, contents + irel->r_offset + 1);
2798 		    if (debug_relax)
2799 		      printf ("converted rcall/ret sequence at address 0x%x"
2800 			      " into rjmp/ret sequence. Section is %s\n\n",
2801 			      (int) dot, sec->name);
2802 		    *again = true;
2803 		    break;
2804 		  }
2805 	      }
2806 	    else if ((0x94 == (code_msb & 0xfe))
2807 		     && (0x0e == (code_lsb & 0x0e))
2808 		     && avr_replace_call_ret_sequences)
2809 	      {
2810 		/* This insn is a call.  */
2811 		unsigned char next_insn_msb = 0;
2812 		unsigned char next_insn_lsb = 0;
2813 
2814 		if (irel->r_offset + 5 < sec->size)
2815 		  {
2816 		    next_insn_msb =
2817 		      bfd_get_8 (abfd, contents + irel->r_offset + 5);
2818 		    next_insn_lsb =
2819 		      bfd_get_8 (abfd, contents + irel->r_offset + 4);
2820 		  }
2821 
2822 		if ((0x95 == next_insn_msb) && (0x08 == next_insn_lsb))
2823 		  {
2824 		    /* The next insn is a ret. We now convert the call insn
2825 		       into a jmp instruction.  */
2826 
2827 		    code_lsb &= 0xfd;
2828 		    bfd_put_8 (abfd, code_lsb, contents + irel->r_offset);
2829 		    if (debug_relax)
2830 		      printf ("converted call/ret sequence at address 0x%x"
2831 			      " into jmp/ret sequence. Section is %s\n\n",
2832 			      (int) dot, sec->name);
2833 		    *again = true;
2834 		    break;
2835 		  }
2836 	      }
2837 	    else if ((0xc0 == (code_msb & 0xf0))
2838 		     || ((0x94 == (code_msb & 0xfe))
2839 			 && (0x0c == (code_lsb & 0x0e))))
2840 	      {
2841 		/* This insn is a rjmp or a jmp.  */
2842 		unsigned char next_insn_msb = 0;
2843 		unsigned char next_insn_lsb = 0;
2844 		int insn_size;
2845 
2846 		if (0xc0 == (code_msb & 0xf0))
2847 		  insn_size = 2; /* rjmp insn */
2848 		else
2849 		  insn_size = 4; /* jmp insn */
2850 
2851 		if (irel->r_offset + insn_size + 1 < sec->size)
2852 		  {
2853 		    next_insn_msb =
2854 		      bfd_get_8 (abfd, contents + irel->r_offset
2855 				 + insn_size + 1);
2856 		    next_insn_lsb =
2857 		      bfd_get_8 (abfd, contents + irel->r_offset
2858 				 + insn_size);
2859 		  }
2860 
2861 		if ((0x95 == next_insn_msb) && (0x08 == next_insn_lsb))
2862 		  {
2863 		    /* The next insn is a ret. We possibly could delete
2864 		       this ret. First we need to check for preceding
2865 		       sbis/sbic/sbrs or cpse "skip" instructions.  */
2866 
2867 		    int there_is_preceding_non_skip_insn = 1;
2868 		    bfd_vma address_of_ret;
2869 
2870 		    address_of_ret = dot + insn_size;
2871 
2872 		    if (debug_relax && (insn_size == 2))
2873 		      printf ("found rjmp / ret sequence at address 0x%x\n",
2874 			      (int) dot);
2875 		    if (debug_relax && (insn_size == 4))
2876 		      printf ("found jmp / ret sequence at address 0x%x\n",
2877 			      (int) dot);
2878 
2879 		    /* We have to make sure that there is a preceding insn.  */
2880 		    if (irel->r_offset >= 2)
2881 		      {
2882 			unsigned char preceding_msb;
2883 			unsigned char preceding_lsb;
2884 
2885 			preceding_msb =
2886 			  bfd_get_8 (abfd, contents + irel->r_offset - 1);
2887 			preceding_lsb =
2888 			  bfd_get_8 (abfd, contents + irel->r_offset - 2);
2889 
2890 			/* sbic.  */
2891 			if (0x99 == preceding_msb)
2892 			  there_is_preceding_non_skip_insn = 0;
2893 
2894 			/* sbis.  */
2895 			if (0x9b == preceding_msb)
2896 			  there_is_preceding_non_skip_insn = 0;
2897 
2898 			/* sbrc */
2899 			if ((0xfc == (preceding_msb & 0xfe)
2900 			     && (0x00 == (preceding_lsb & 0x08))))
2901 			  there_is_preceding_non_skip_insn = 0;
2902 
2903 			/* sbrs */
2904 			if ((0xfe == (preceding_msb & 0xfe)
2905 			     && (0x00 == (preceding_lsb & 0x08))))
2906 			  there_is_preceding_non_skip_insn = 0;
2907 
2908 			/* cpse */
2909 			if (0x10 == (preceding_msb & 0xfc))
2910 			  there_is_preceding_non_skip_insn = 0;
2911 
2912 			if (there_is_preceding_non_skip_insn == 0)
2913 			  if (debug_relax)
2914 			    printf ("preceding skip insn prevents deletion of"
2915 				    " ret insn at Addy 0x%x in section %s\n",
2916 				    (int) dot + 2, sec->name);
2917 		      }
2918 		    else
2919 		      {
2920 			/* There is no previous instruction.  */
2921 			there_is_preceding_non_skip_insn = 0;
2922 		      }
2923 
2924 		    if (there_is_preceding_non_skip_insn)
2925 		      {
2926 			/* We now only have to make sure that there is no
2927 			   local label defined at the address of the ret
2928 			   instruction and that there is no local relocation
2929 			   in this section pointing to the ret.  */
2930 
2931 			int deleting_ret_is_safe = 1;
2932 			unsigned int section_offset_of_ret_insn =
2933 			  irel->r_offset + insn_size;
2934 			Elf_Internal_Sym *isym, *isymend;
2935 			unsigned int sec_shndx;
2936 			struct bfd_section *isec;
2937 
2938 			sec_shndx =
2939 			  _bfd_elf_section_from_bfd_section (abfd, sec);
2940 
2941 			/* Check for local symbols.  */
2942 			isym = (Elf_Internal_Sym *) symtab_hdr->contents;
2943 			isymend = isym + symtab_hdr->sh_info;
2944 			/* PR 6019: There may not be any local symbols.  */
2945 			for (; isym != NULL && isym < isymend; isym++)
2946 			  {
2947 			    if (isym->st_value == section_offset_of_ret_insn
2948 				&& isym->st_shndx == sec_shndx)
2949 			      {
2950 				deleting_ret_is_safe = 0;
2951 				if (debug_relax)
2952 				  printf ("local label prevents deletion of ret "
2953 					  "insn at address 0x%x\n",
2954 					  (int) dot + insn_size);
2955 			      }
2956 			  }
2957 
2958 			/* Now check for global symbols.  */
2959 			{
2960 			  int symcount;
2961 			  struct elf_link_hash_entry **sym_hashes;
2962 			  struct elf_link_hash_entry **end_hashes;
2963 
2964 			  symcount = (symtab_hdr->sh_size
2965 				      / sizeof (Elf32_External_Sym)
2966 				      - symtab_hdr->sh_info);
2967 			  sym_hashes = elf_sym_hashes (abfd);
2968 			  end_hashes = sym_hashes + symcount;
2969 			  for (; sym_hashes < end_hashes; sym_hashes++)
2970 			    {
2971 			      struct elf_link_hash_entry *sym_hash =
2972 				*sym_hashes;
2973 			      if ((sym_hash->root.type == bfd_link_hash_defined
2974 				   || sym_hash->root.type ==
2975 				   bfd_link_hash_defweak)
2976 				  && sym_hash->root.u.def.section == sec
2977 				  && sym_hash->root.u.def.value == section_offset_of_ret_insn)
2978 				{
2979 				  deleting_ret_is_safe = 0;
2980 				  if (debug_relax)
2981 				    printf ("global label prevents deletion of "
2982 					    "ret insn at address 0x%x\n",
2983 					    (int) dot + insn_size);
2984 				}
2985 			    }
2986 			}
2987 
2988 			/* Now we check for relocations pointing to ret.  */
2989 			for (isec = abfd->sections; isec && deleting_ret_is_safe; isec = isec->next)
2990 			  {
2991 			    Elf_Internal_Rela *rel;
2992 			    Elf_Internal_Rela *relend;
2993 
2994 			    rel = elf_section_data (isec)->relocs;
2995 			    if (rel == NULL)
2996 			      rel = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL, true);
2997 
2998 			    relend = rel + isec->reloc_count;
2999 
3000 			    for (; rel && rel < relend; rel++)
3001 			      {
3002 				bfd_vma reloc_target = 0;
3003 
3004 				/* Read this BFD's local symbols if we haven't
3005 				   done so already.  */
3006 				if (isymbuf == NULL && symtab_hdr->sh_info != 0)
3007 				  {
3008 				    isymbuf = (Elf_Internal_Sym *)
3009 				      symtab_hdr->contents;
3010 				    if (isymbuf == NULL)
3011 				      isymbuf = bfd_elf_get_elf_syms
3012 					(abfd,
3013 					 symtab_hdr,
3014 					 symtab_hdr->sh_info, 0,
3015 					 NULL, NULL, NULL);
3016 				    if (isymbuf == NULL)
3017 				      break;
3018 				  }
3019 
3020 				/* Get the value of the symbol referred to
3021 				   by the reloc.  */
3022 				if (ELF32_R_SYM (rel->r_info)
3023 				    < symtab_hdr->sh_info)
3024 				  {
3025 				    /* A local symbol.  */
3026 				    asection *sym_sec;
3027 
3028 				    isym = isymbuf
3029 				      + ELF32_R_SYM (rel->r_info);
3030 				    sym_sec = bfd_section_from_elf_index
3031 				      (abfd, isym->st_shndx);
3032 				    symval = isym->st_value;
3033 
3034 				    /* If the reloc is absolute, it will not
3035 				       have a symbol or section associated
3036 				       with it.  */
3037 
3038 				    if (sym_sec)
3039 				      {
3040 					symval +=
3041 					  sym_sec->output_section->vma
3042 					  + sym_sec->output_offset;
3043 					reloc_target = symval + rel->r_addend;
3044 				      }
3045 				    else
3046 				      {
3047 					reloc_target = symval + rel->r_addend;
3048 					/* Reference symbol is absolute.  */
3049 				      }
3050 				  }
3051 				/* else ... reference symbol is extern.  */
3052 
3053 				if (address_of_ret == reloc_target)
3054 				  {
3055 				    deleting_ret_is_safe = 0;
3056 				    if (debug_relax)
3057 				      printf ("ret from "
3058 					      "rjmp/jmp ret sequence at address"
3059 					      " 0x%x could not be deleted. ret"
3060 					      " is target of a relocation.\n",
3061 					      (int) address_of_ret);
3062 				    break;
3063 				  }
3064 			      }
3065 			  }
3066 
3067 			if (deleting_ret_is_safe)
3068 			  {
3069 			    if (debug_relax)
3070 			      printf ("unreachable ret instruction "
3071 				      "at address 0x%x deleted.\n",
3072 				      (int) dot + insn_size);
3073 
3074 			    elf_section_data (sec)->relocs = internal_relocs;
3075 			    elf_section_data (sec)->this_hdr.contents = contents;
3076 			    symtab_hdr->contents = (unsigned char *) isymbuf;
3077 
3078 			    /* Delete two bytes of data.  */
3079 			    if (!elf32_avr_relax_delete_bytes (abfd, sec,
3080 							       irel->r_offset + insn_size, 2,
3081 							       true))
3082 			      goto error_return;
3083 
3084 			    /* That will change things, so, we should relax
3085 			       again. Note that this is not required, and it
3086 			       may be slow.  */
3087 			    *again = true;
3088 			    break;
3089 			  }
3090 		      }
3091 		  }
3092 	      }
3093 	    break;
3094 	  }
3095 	}
3096     }
3097 
3098   if (!*again)
3099     {
3100       /* Look through all the property records in this section to see if
3101 	 there's any alignment records that can be moved.  */
3102       struct avr_relax_info *relax_info;
3103 
3104       relax_info = get_avr_relax_info (sec);
3105       if (relax_info->records.count > 0)
3106 	{
3107 	  unsigned int i;
3108 
3109 	  for (i = 0; i < relax_info->records.count; ++i)
3110 	    {
3111 	      switch (relax_info->records.items [i].type)
3112 		{
3113 		case RECORD_ORG:
3114 		case RECORD_ORG_AND_FILL:
3115 		  break;
3116 		case RECORD_ALIGN:
3117 		case RECORD_ALIGN_AND_FILL:
3118 		  {
3119 		    struct avr_property_record *record;
3120 		    unsigned long bytes_to_align;
3121 		    int count = 0;
3122 
3123 		    /* Look for alignment directives that have had enough
3124 		       bytes deleted before them, such that the directive
3125 		       can be moved backwards and still maintain the
3126 		       required alignment.  */
3127 		    record = &relax_info->records.items [i];
3128 		    bytes_to_align
3129 		      = (unsigned long) (1 << record->data.align.bytes);
3130 		    while (record->data.align.preceding_deleted >=
3131 			   bytes_to_align)
3132 		      {
3133 			record->data.align.preceding_deleted
3134 			  -= bytes_to_align;
3135 			count += bytes_to_align;
3136 		      }
3137 
3138 		    if (count > 0)
3139 		      {
3140 			bfd_vma addr = record->offset;
3141 
3142 			/* We can delete COUNT bytes and this alignment
3143 			   directive will still be correctly aligned.
3144 			   First move the alignment directive, then delete
3145 			   the bytes.  */
3146 			record->offset -= count;
3147 			elf32_avr_relax_delete_bytes (abfd, sec,
3148 						      addr - count,
3149 						      count, false);
3150 			*again = true;
3151 		      }
3152 		  }
3153 		  break;
3154 		}
3155 	    }
3156 	}
3157     }
3158 
3159   if (contents != NULL
3160       && elf_section_data (sec)->this_hdr.contents != contents)
3161     {
3162       if (! link_info->keep_memory)
3163 	free (contents);
3164       else
3165 	{
3166 	  /* Cache the section contents for elf_link_input_bfd.  */
3167 	  elf_section_data (sec)->this_hdr.contents = contents;
3168 	}
3169     }
3170 
3171   if (elf_section_data (sec)->relocs != internal_relocs)
3172     free (internal_relocs);
3173 
3174   return true;
3175 
3176  error_return:
3177   if (symtab_hdr->contents != (unsigned char *) isymbuf)
3178     free (isymbuf);
3179   if (elf_section_data (sec)->this_hdr.contents != contents)
3180     free (contents);
3181   if (elf_section_data (sec)->relocs != internal_relocs)
3182     free (internal_relocs);
3183 
3184   return false;
3185 }
3186 
3187 /* This is a version of bfd_generic_get_relocated_section_contents
3188    which uses elf32_avr_relocate_section.
3189 
3190    For avr it's essentially a cut and paste taken from the H8300 port.
3191    The author of the relaxation support patch for avr had absolutely no
3192    clue what is happening here but found out that this part of the code
3193    seems to be important.  */
3194 
3195 static bfd_byte *
elf32_avr_get_relocated_section_contents(bfd * output_bfd,struct bfd_link_info * link_info,struct bfd_link_order * link_order,bfd_byte * data,bool relocatable,asymbol ** symbols)3196 elf32_avr_get_relocated_section_contents (bfd *output_bfd,
3197 					  struct bfd_link_info *link_info,
3198 					  struct bfd_link_order *link_order,
3199 					  bfd_byte *data,
3200 					  bool relocatable,
3201 					  asymbol **symbols)
3202 {
3203   Elf_Internal_Shdr *symtab_hdr;
3204   asection *input_section = link_order->u.indirect.section;
3205   bfd *input_bfd = input_section->owner;
3206   asection **sections = NULL;
3207   Elf_Internal_Rela *internal_relocs = NULL;
3208   Elf_Internal_Sym *isymbuf = NULL;
3209 
3210   /* We only need to handle the case of relaxing, or of having a
3211      particular set of section contents, specially.  */
3212   if (relocatable
3213       || elf_section_data (input_section)->this_hdr.contents == NULL)
3214     return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
3215 						       link_order, data,
3216 						       relocatable,
3217 						       symbols);
3218   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3219 
3220   bfd_byte *orig_data = data;
3221   if (data == NULL)
3222     {
3223       data = bfd_malloc (input_section->size);
3224       if (data == NULL)
3225 	return NULL;
3226     }
3227   memcpy (data, elf_section_data (input_section)->this_hdr.contents,
3228 	  (size_t) input_section->size);
3229 
3230   if ((input_section->flags & SEC_RELOC) != 0
3231       && input_section->reloc_count > 0)
3232     {
3233       asection **secpp;
3234       Elf_Internal_Sym *isym, *isymend;
3235       bfd_size_type amt;
3236 
3237       internal_relocs = (_bfd_elf_link_read_relocs
3238 			 (input_bfd, input_section, NULL, NULL, false));
3239       if (internal_relocs == NULL)
3240 	goto error_return;
3241 
3242       if (symtab_hdr->sh_info != 0)
3243 	{
3244 	  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
3245 	  if (isymbuf == NULL)
3246 	    isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
3247 					    symtab_hdr->sh_info, 0,
3248 					    NULL, NULL, NULL);
3249 	  if (isymbuf == NULL)
3250 	    goto error_return;
3251 	}
3252 
3253       amt = symtab_hdr->sh_info;
3254       amt *= sizeof (asection *);
3255       sections = bfd_malloc (amt);
3256       if (sections == NULL && amt != 0)
3257 	goto error_return;
3258 
3259       isymend = isymbuf + symtab_hdr->sh_info;
3260       for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
3261 	{
3262 	  asection *isec;
3263 
3264 	  if (isym->st_shndx == SHN_UNDEF)
3265 	    isec = bfd_und_section_ptr;
3266 	  else if (isym->st_shndx == SHN_ABS)
3267 	    isec = bfd_abs_section_ptr;
3268 	  else if (isym->st_shndx == SHN_COMMON)
3269 	    isec = bfd_com_section_ptr;
3270 	  else
3271 	    isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
3272 
3273 	  *secpp = isec;
3274 	}
3275 
3276       if (! elf32_avr_relocate_section (output_bfd, link_info, input_bfd,
3277 					input_section, data, internal_relocs,
3278 					isymbuf, sections))
3279 	goto error_return;
3280 
3281       free (sections);
3282       if (symtab_hdr->contents != (unsigned char *) isymbuf)
3283 	free (isymbuf);
3284       if (elf_section_data (input_section)->relocs != internal_relocs)
3285 	free (internal_relocs);
3286     }
3287 
3288   return data;
3289 
3290  error_return:
3291   free (sections);
3292   if (symtab_hdr->contents != (unsigned char *) isymbuf)
3293     free (isymbuf);
3294   if (elf_section_data (input_section)->relocs != internal_relocs)
3295     free (internal_relocs);
3296   if (orig_data == NULL)
3297     free (data);
3298   return NULL;
3299 }
3300 
3301 
3302 /* Determines the hash entry name for a particular reloc. It consists of
3303    the identifier of the symbol section and the added reloc addend and
3304    symbol offset relative to the section the symbol is attached to.  */
3305 
3306 static char *
avr_stub_name(const asection * symbol_section,const bfd_vma symbol_offset,const Elf_Internal_Rela * rela)3307 avr_stub_name (const asection *symbol_section,
3308 	       const bfd_vma symbol_offset,
3309 	       const Elf_Internal_Rela *rela)
3310 {
3311   char *stub_name;
3312   bfd_size_type len;
3313 
3314   len = 8 + 1 + 8 + 1 + 1;
3315   stub_name = bfd_malloc (len);
3316   if (stub_name != NULL)
3317     sprintf (stub_name, "%08x+%08x",
3318 	     symbol_section->id & 0xffffffff,
3319 	     (unsigned int) ((rela->r_addend & 0xffffffff) + symbol_offset));
3320 
3321   return stub_name;
3322 }
3323 
3324 
3325 /* Add a new stub entry to the stub hash.  Not all fields of the new
3326    stub entry are initialised.  */
3327 
3328 static struct elf32_avr_stub_hash_entry *
avr_add_stub(const char * stub_name,struct elf32_avr_link_hash_table * htab)3329 avr_add_stub (const char *stub_name,
3330 	      struct elf32_avr_link_hash_table *htab)
3331 {
3332   struct elf32_avr_stub_hash_entry *hsh;
3333 
3334   /* Enter this entry into the linker stub hash table.  */
3335   hsh = avr_stub_hash_lookup (&htab->bstab, stub_name, true, false);
3336 
3337   if (hsh == NULL)
3338     {
3339       /* xgettext:c-format */
3340       _bfd_error_handler (_("cannot create stub entry %s"), stub_name);
3341       return NULL;
3342     }
3343 
3344   hsh->stub_offset = 0;
3345   return hsh;
3346 }
3347 
3348 /* We assume that there is already space allocated for the stub section
3349    contents and that before building the stubs the section size is
3350    initialized to 0.  We assume that within the stub hash table entry,
3351    the absolute position of the jmp target has been written in the
3352    target_value field.  We write here the offset of the generated jmp insn
3353    relative to the trampoline section start to the stub_offset entry in
3354    the stub hash table entry.  */
3355 
3356 static  bool
avr_build_one_stub(struct bfd_hash_entry * bh,void * in_arg)3357 avr_build_one_stub (struct bfd_hash_entry *bh, void *in_arg)
3358 {
3359   struct elf32_avr_stub_hash_entry *hsh;
3360   struct bfd_link_info *info;
3361   struct elf32_avr_link_hash_table *htab;
3362   bfd *stub_bfd;
3363   bfd_byte *loc;
3364   bfd_vma target;
3365   bfd_vma starget;
3366 
3367   /* Basic opcode */
3368   bfd_vma jmp_insn = 0x0000940c;
3369 
3370   /* Massage our args to the form they really have.  */
3371   hsh = avr_stub_hash_entry (bh);
3372 
3373   if (!hsh->is_actually_needed)
3374     return true;
3375 
3376   info = (struct bfd_link_info *) in_arg;
3377 
3378   htab = avr_link_hash_table (info);
3379   if (htab == NULL)
3380     return false;
3381 
3382   target = hsh->target_value;
3383 
3384   /* Make a note of the offset within the stubs for this entry.  */
3385   hsh->stub_offset = htab->stub_sec->size;
3386   loc = htab->stub_sec->contents + hsh->stub_offset;
3387 
3388   stub_bfd = htab->stub_sec->owner;
3389 
3390   if (debug_stubs)
3391     printf ("Building one Stub. Address: 0x%x, Offset: 0x%x\n",
3392 	     (unsigned int) target,
3393 	     (unsigned int) hsh->stub_offset);
3394 
3395   /* We now have to add the information on the jump target to the bare
3396      opcode bits already set in jmp_insn.  */
3397 
3398   /* Check for the alignment of the address.  */
3399   if (target & 1)
3400      return false;
3401 
3402   starget = target >> 1;
3403   jmp_insn |= ((starget & 0x10000) | ((starget << 3) & 0x1f00000)) >> 16;
3404   bfd_put_16 (stub_bfd, jmp_insn, loc);
3405   bfd_put_16 (stub_bfd, (bfd_vma) starget & 0xffff, loc + 2);
3406 
3407   htab->stub_sec->size += 4;
3408 
3409   /* Now add the entries in the address mapping table if there is still
3410      space left.  */
3411   {
3412     unsigned int nr;
3413 
3414     nr = htab->amt_entry_cnt + 1;
3415     if (nr <= htab->amt_max_entry_cnt)
3416       {
3417 	htab->amt_entry_cnt = nr;
3418 
3419 	htab->amt_stub_offsets[nr - 1] = hsh->stub_offset;
3420 	htab->amt_destination_addr[nr - 1] = target;
3421       }
3422   }
3423 
3424   return true;
3425 }
3426 
3427 static bool
avr_mark_stub_not_to_be_necessary(struct bfd_hash_entry * bh,void * in_arg ATTRIBUTE_UNUSED)3428 avr_mark_stub_not_to_be_necessary (struct bfd_hash_entry *bh,
3429 				   void *in_arg ATTRIBUTE_UNUSED)
3430 {
3431   struct elf32_avr_stub_hash_entry *hsh;
3432 
3433   hsh = avr_stub_hash_entry (bh);
3434   hsh->is_actually_needed = false;
3435 
3436   return true;
3437 }
3438 
3439 static bool
avr_size_one_stub(struct bfd_hash_entry * bh,void * in_arg)3440 avr_size_one_stub (struct bfd_hash_entry *bh, void *in_arg)
3441 {
3442   struct elf32_avr_stub_hash_entry *hsh;
3443   struct elf32_avr_link_hash_table *htab;
3444   int size;
3445 
3446   /* Massage our args to the form they really have.  */
3447   hsh = avr_stub_hash_entry (bh);
3448   htab = in_arg;
3449 
3450   if (hsh->is_actually_needed)
3451     size = 4;
3452   else
3453     size = 0;
3454 
3455   htab->stub_sec->size += size;
3456   return true;
3457 }
3458 
3459 void
elf32_avr_setup_params(struct bfd_link_info * info,bfd * avr_stub_bfd,asection * avr_stub_section,bool no_stubs,bool deb_stubs,bool deb_relax,bfd_vma pc_wrap_around,bool call_ret_replacement)3460 elf32_avr_setup_params (struct bfd_link_info *info,
3461 			bfd *avr_stub_bfd,
3462 			asection *avr_stub_section,
3463 			bool no_stubs,
3464 			bool deb_stubs,
3465 			bool deb_relax,
3466 			bfd_vma pc_wrap_around,
3467 			bool call_ret_replacement)
3468 {
3469   struct elf32_avr_link_hash_table *htab = avr_link_hash_table (info);
3470 
3471   if (htab == NULL)
3472     return;
3473   htab->stub_sec = avr_stub_section;
3474   htab->stub_bfd = avr_stub_bfd;
3475   htab->no_stubs = no_stubs;
3476 
3477   debug_relax = deb_relax;
3478   debug_stubs = deb_stubs;
3479   avr_pc_wrap_around = pc_wrap_around;
3480   avr_replace_call_ret_sequences = call_ret_replacement;
3481 }
3482 
3483 
3484 /* Set up various things so that we can make a list of input sections
3485    for each output section included in the link.  Returns -1 on error,
3486    0 when no stubs will be needed, and 1 on success.  It also sets
3487    information on the stubs bfd and the stub section in the info
3488    struct.  */
3489 
3490 int
elf32_avr_setup_section_lists(bfd * output_bfd,struct bfd_link_info * info)3491 elf32_avr_setup_section_lists (bfd *output_bfd,
3492 			       struct bfd_link_info *info)
3493 {
3494   bfd *input_bfd;
3495   unsigned int bfd_count;
3496   unsigned int top_id, top_index;
3497   asection *section;
3498   asection **input_list, **list;
3499   size_t amt;
3500   struct elf32_avr_link_hash_table *htab = avr_link_hash_table (info);
3501 
3502   if (htab == NULL || htab->no_stubs)
3503     return 0;
3504 
3505   /* Count the number of input BFDs and find the top input section id.  */
3506   for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
3507        input_bfd != NULL;
3508        input_bfd = input_bfd->link.next)
3509     {
3510       bfd_count += 1;
3511       for (section = input_bfd->sections;
3512 	   section != NULL;
3513 	   section = section->next)
3514 	if (top_id < section->id)
3515 	  top_id = section->id;
3516     }
3517 
3518   htab->bfd_count = bfd_count;
3519 
3520   /* We can't use output_bfd->section_count here to find the top output
3521      section index as some sections may have been removed, and
3522      strip_excluded_output_sections doesn't renumber the indices.  */
3523   for (section = output_bfd->sections, top_index = 0;
3524        section != NULL;
3525        section = section->next)
3526     if (top_index < section->index)
3527       top_index = section->index;
3528 
3529   htab->top_index = top_index;
3530   amt = sizeof (asection *) * (top_index + 1);
3531   input_list = bfd_malloc (amt);
3532   htab->input_list = input_list;
3533   if (input_list == NULL)
3534     return -1;
3535 
3536   /* For sections we aren't interested in, mark their entries with a
3537      value we can check later.  */
3538   list = input_list + top_index;
3539   do
3540     *list = bfd_abs_section_ptr;
3541   while (list-- != input_list);
3542 
3543   for (section = output_bfd->sections;
3544        section != NULL;
3545        section = section->next)
3546     if ((section->flags & SEC_CODE) != 0)
3547       input_list[section->index] = NULL;
3548 
3549   return 1;
3550 }
3551 
3552 
3553 /* Read in all local syms for all input bfds, and create hash entries
3554    for export stubs if we are building a multi-subspace shared lib.
3555    Returns -1 on error, 0 otherwise.  */
3556 
3557 static int
get_local_syms(bfd * input_bfd,struct bfd_link_info * info)3558 get_local_syms (bfd *input_bfd, struct bfd_link_info *info)
3559 {
3560   unsigned int bfd_indx;
3561   Elf_Internal_Sym *local_syms, **all_local_syms;
3562   struct elf32_avr_link_hash_table *htab = avr_link_hash_table (info);
3563   size_t amt;
3564 
3565   if (htab == NULL)
3566     return -1;
3567 
3568   /* We want to read in symbol extension records only once.  To do this
3569      we need to read in the local symbols in parallel and save them for
3570      later use; so hold pointers to the local symbols in an array.  */
3571   amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
3572   all_local_syms = bfd_zmalloc (amt);
3573   htab->all_local_syms = all_local_syms;
3574   if (all_local_syms == NULL)
3575     return -1;
3576 
3577   /* Walk over all the input BFDs, swapping in local symbols.
3578      If we are creating a shared library, create hash entries for the
3579      export stubs.  */
3580   for (bfd_indx = 0;
3581        input_bfd != NULL;
3582        input_bfd = input_bfd->link.next, bfd_indx++)
3583     {
3584       Elf_Internal_Shdr *symtab_hdr;
3585 
3586       /* We'll need the symbol table in a second.  */
3587       symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3588       if (symtab_hdr->sh_info == 0)
3589 	continue;
3590 
3591       /* We need an array of the local symbols attached to the input bfd.  */
3592       local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
3593       if (local_syms == NULL)
3594 	{
3595 	  local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
3596 					     symtab_hdr->sh_info, 0,
3597 					     NULL, NULL, NULL);
3598 	  /* Cache them for elf_link_input_bfd.  */
3599 	  symtab_hdr->contents = (unsigned char *) local_syms;
3600 	}
3601       if (local_syms == NULL)
3602 	return -1;
3603 
3604       all_local_syms[bfd_indx] = local_syms;
3605     }
3606 
3607   return 0;
3608 }
3609 
3610 #define ADD_DUMMY_STUBS_FOR_DEBUGGING 0
3611 
3612 bool
elf32_avr_size_stubs(bfd * output_bfd,struct bfd_link_info * info,bool is_prealloc_run)3613 elf32_avr_size_stubs (bfd *output_bfd,
3614 		      struct bfd_link_info *info,
3615 		      bool is_prealloc_run)
3616 {
3617   struct elf32_avr_link_hash_table *htab;
3618   int stub_changed = 0;
3619 
3620   htab = avr_link_hash_table (info);
3621   if (htab == NULL)
3622     return false;
3623 
3624   /* At this point we initialize htab->vector_base
3625      To the start of the text output section.  */
3626   htab->vector_base = htab->stub_sec->output_section->vma;
3627 
3628   if (get_local_syms (info->input_bfds, info))
3629     {
3630       if (htab->all_local_syms)
3631 	goto error_ret_free_local;
3632       return false;
3633     }
3634 
3635   if (ADD_DUMMY_STUBS_FOR_DEBUGGING)
3636     {
3637       struct elf32_avr_stub_hash_entry *test;
3638 
3639       test = avr_add_stub ("Hugo",htab);
3640       test->target_value = 0x123456;
3641       test->stub_offset = 13;
3642 
3643       test = avr_add_stub ("Hugo2",htab);
3644       test->target_value = 0x84210;
3645       test->stub_offset = 14;
3646     }
3647 
3648   while (1)
3649     {
3650       bfd *input_bfd;
3651       unsigned int bfd_indx;
3652 
3653       /* We will have to re-generate the stub hash table each time anything
3654 	 in memory has changed.  */
3655 
3656       bfd_hash_traverse (&htab->bstab, avr_mark_stub_not_to_be_necessary, htab);
3657       for (input_bfd = info->input_bfds, bfd_indx = 0;
3658 	   input_bfd != NULL;
3659 	   input_bfd = input_bfd->link.next, bfd_indx++)
3660 	{
3661 	  Elf_Internal_Shdr *symtab_hdr;
3662 	  asection *section;
3663 	  Elf_Internal_Sym *local_syms;
3664 
3665 	  /* We'll need the symbol table in a second.  */
3666 	  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3667 	  if (symtab_hdr->sh_info == 0)
3668 	    continue;
3669 
3670 	  local_syms = htab->all_local_syms[bfd_indx];
3671 
3672 	  /* Walk over each section attached to the input bfd.  */
3673 	  for (section = input_bfd->sections;
3674 	       section != NULL;
3675 	       section = section->next)
3676 	    {
3677 	      Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
3678 
3679 	      /* If there aren't any relocs, then there's nothing more
3680 		 to do.  */
3681 	      if ((section->flags & SEC_RELOC) == 0
3682 		  || section->reloc_count == 0)
3683 		continue;
3684 
3685 	      /* If this section is a link-once section that will be
3686 		 discarded, then don't create any stubs.  */
3687 	      if (section->output_section == NULL
3688 		  || section->output_section->owner != output_bfd)
3689 		continue;
3690 
3691 	      /* Get the relocs.  */
3692 	      internal_relocs
3693 		= _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
3694 					     info->keep_memory);
3695 	      if (internal_relocs == NULL)
3696 		goto error_ret_free_local;
3697 
3698 	      /* Now examine each relocation.  */
3699 	      irela = internal_relocs;
3700 	      irelaend = irela + section->reloc_count;
3701 	      for (; irela < irelaend; irela++)
3702 		{
3703 		  unsigned int r_type, r_indx;
3704 		  struct elf32_avr_stub_hash_entry *hsh;
3705 		  asection *sym_sec;
3706 		  bfd_vma sym_value;
3707 		  bfd_vma destination;
3708 		  struct elf_link_hash_entry *hh;
3709 		  char *stub_name;
3710 
3711 		  r_type = ELF32_R_TYPE (irela->r_info);
3712 		  r_indx = ELF32_R_SYM (irela->r_info);
3713 
3714 		  /* Only look for 16 bit GS relocs. No other reloc will need a
3715 		     stub.  */
3716 		  if (!((r_type == R_AVR_16_PM)
3717 			|| (r_type == R_AVR_LO8_LDI_GS)
3718 			|| (r_type == R_AVR_HI8_LDI_GS)))
3719 		    continue;
3720 
3721 		  /* Now determine the call target, its name, value,
3722 		     section.  */
3723 		  sym_sec = NULL;
3724 		  sym_value = 0;
3725 		  destination = 0;
3726 		  hh = NULL;
3727 		  if (r_indx < symtab_hdr->sh_info)
3728 		    {
3729 		      /* It's a local symbol.  */
3730 		      Elf_Internal_Sym *sym;
3731 		      Elf_Internal_Shdr *hdr;
3732 		      unsigned int shndx;
3733 
3734 		      sym = local_syms + r_indx;
3735 		      if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
3736 			sym_value = sym->st_value;
3737 		      shndx = sym->st_shndx;
3738 		      if (shndx < elf_numsections (input_bfd))
3739 			{
3740 			  hdr = elf_elfsections (input_bfd)[shndx];
3741 			  sym_sec = hdr->bfd_section;
3742 			  destination = (sym_value + irela->r_addend
3743 					 + sym_sec->output_offset
3744 					 + sym_sec->output_section->vma);
3745 			}
3746 		    }
3747 		  else
3748 		    {
3749 		      /* It's an external symbol.  */
3750 		      int e_indx;
3751 
3752 		      e_indx = r_indx - symtab_hdr->sh_info;
3753 		      hh = elf_sym_hashes (input_bfd)[e_indx];
3754 
3755 		      while (hh->root.type == bfd_link_hash_indirect
3756 			     || hh->root.type == bfd_link_hash_warning)
3757 			hh = (struct elf_link_hash_entry *)
3758 			      (hh->root.u.i.link);
3759 
3760 		      if (hh->root.type == bfd_link_hash_defined
3761 			  || hh->root.type == bfd_link_hash_defweak)
3762 			{
3763 			  sym_sec = hh->root.u.def.section;
3764 			  sym_value = hh->root.u.def.value;
3765 			  if (sym_sec->output_section != NULL)
3766 			  destination = (sym_value + irela->r_addend
3767 					 + sym_sec->output_offset
3768 					 + sym_sec->output_section->vma);
3769 			}
3770 		      else if (hh->root.type == bfd_link_hash_undefweak)
3771 			{
3772 			  if (! bfd_link_pic (info))
3773 			    continue;
3774 			}
3775 		      else if (hh->root.type == bfd_link_hash_undefined)
3776 			{
3777 			  if (! (info->unresolved_syms_in_objects == RM_IGNORE
3778 				 && (ELF_ST_VISIBILITY (hh->other)
3779 				     == STV_DEFAULT)))
3780 			     continue;
3781 			}
3782 		      else
3783 			{
3784 			  bfd_set_error (bfd_error_bad_value);
3785 
3786 			  error_ret_free_internal:
3787 			  if (elf_section_data (section)->relocs == NULL)
3788 			    free (internal_relocs);
3789 			  goto error_ret_free_local;
3790 			}
3791 		    }
3792 
3793 		  if (! avr_stub_is_required_for_16_bit_reloc
3794 		      (destination - htab->vector_base))
3795 		    {
3796 		      if (!is_prealloc_run)
3797 			/* We are having a reloc that does't need a stub.  */
3798 			continue;
3799 
3800 		      /* We don't right now know if a stub will be needed.
3801 			 Let's rather be on the safe side.  */
3802 		    }
3803 
3804 		  /* Get the name of this stub.  */
3805 		  stub_name = avr_stub_name (sym_sec, sym_value, irela);
3806 
3807 		  if (!stub_name)
3808 		    goto error_ret_free_internal;
3809 
3810 
3811 		  hsh = avr_stub_hash_lookup (&htab->bstab,
3812 					      stub_name,
3813 					      false, false);
3814 		  if (hsh != NULL)
3815 		    {
3816 		      /* The proper stub has already been created.  Mark it
3817 			 to be used and write the possibly changed destination
3818 			 value.  */
3819 		      hsh->is_actually_needed = true;
3820 		      hsh->target_value = destination;
3821 		      free (stub_name);
3822 		      continue;
3823 		    }
3824 
3825 		  hsh = avr_add_stub (stub_name, htab);
3826 		  if (hsh == NULL)
3827 		    {
3828 		      free (stub_name);
3829 		      goto error_ret_free_internal;
3830 		    }
3831 
3832 		  hsh->is_actually_needed = true;
3833 		  hsh->target_value = destination;
3834 
3835 		  if (debug_stubs)
3836 		    printf ("Adding stub with destination 0x%x to the"
3837 			    " hash table.\n", (unsigned int) destination);
3838 		  if (debug_stubs)
3839 		    printf ("(Pre-Alloc run: %i)\n", is_prealloc_run);
3840 
3841 		  stub_changed = true;
3842 		}
3843 
3844 	      /* We're done with the internal relocs, free them.  */
3845 	      if (elf_section_data (section)->relocs == NULL)
3846 		free (internal_relocs);
3847 	    }
3848 	}
3849 
3850       /* Re-Calculate the number of needed stubs.  */
3851       htab->stub_sec->size = 0;
3852       bfd_hash_traverse (&htab->bstab, avr_size_one_stub, htab);
3853 
3854       if (!stub_changed)
3855 	break;
3856 
3857       stub_changed = false;
3858     }
3859 
3860   free (htab->all_local_syms);
3861   return true;
3862 
3863  error_ret_free_local:
3864   free (htab->all_local_syms);
3865   return false;
3866 }
3867 
3868 
3869 /* Build all the stubs associated with the current output file.  The
3870    stubs are kept in a hash table attached to the main linker hash
3871    table.  We also set up the .plt entries for statically linked PIC
3872    functions here.  This function is called via hppaelf_finish in the
3873    linker.  */
3874 
3875 bool
elf32_avr_build_stubs(struct bfd_link_info * info)3876 elf32_avr_build_stubs (struct bfd_link_info *info)
3877 {
3878   asection *stub_sec;
3879   struct bfd_hash_table *table;
3880   struct elf32_avr_link_hash_table *htab;
3881   bfd_size_type total_size = 0;
3882 
3883   htab = avr_link_hash_table (info);
3884   if (htab == NULL)
3885     return false;
3886 
3887   /* In case that there were several stub sections:  */
3888   for (stub_sec = htab->stub_bfd->sections;
3889        stub_sec != NULL;
3890        stub_sec = stub_sec->next)
3891     {
3892       bfd_size_type size;
3893 
3894       /* Allocate memory to hold the linker stubs.  */
3895       size = stub_sec->size;
3896       total_size += size;
3897 
3898       stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
3899       if (stub_sec->contents == NULL && size != 0)
3900 	return false;
3901       stub_sec->size = 0;
3902     }
3903 
3904   /* Allocate memory for the adress mapping table.  */
3905   htab->amt_entry_cnt = 0;
3906   htab->amt_max_entry_cnt = total_size / 4;
3907   htab->amt_stub_offsets = bfd_malloc (sizeof (bfd_vma)
3908 				       * htab->amt_max_entry_cnt);
3909   htab->amt_destination_addr = bfd_malloc (sizeof (bfd_vma)
3910 					   * htab->amt_max_entry_cnt );
3911 
3912   if (debug_stubs)
3913     printf ("Allocating %i entries in the AMT\n", htab->amt_max_entry_cnt);
3914 
3915   /* Build the stubs as directed by the stub hash table.  */
3916   table = &htab->bstab;
3917   bfd_hash_traverse (table, avr_build_one_stub, info);
3918 
3919   if (debug_stubs)
3920     printf ("Final Stub section Size: %i\n", (int) htab->stub_sec->size);
3921 
3922   return true;
3923 }
3924 
3925 /* Callback used by QSORT to order relocations AP and BP.  */
3926 
3927 static int
internal_reloc_compare(const void * ap,const void * bp)3928 internal_reloc_compare (const void *ap, const void *bp)
3929 {
3930   const Elf_Internal_Rela *a = (const Elf_Internal_Rela *) ap;
3931   const Elf_Internal_Rela *b = (const Elf_Internal_Rela *) bp;
3932 
3933   if (a->r_offset != b->r_offset)
3934     return (a->r_offset - b->r_offset);
3935 
3936   /* We don't need to sort on these criteria for correctness,
3937      but enforcing a more strict ordering prevents unstable qsort
3938      from behaving differently with different implementations.
3939      Without the code below we get correct but different results
3940      on Solaris 2.7 and 2.8.  We would like to always produce the
3941      same results no matter the host.  */
3942 
3943   if (a->r_info != b->r_info)
3944     return (a->r_info - b->r_info);
3945 
3946   return (a->r_addend - b->r_addend);
3947 }
3948 
3949 /* Return true if ADDRESS is within the vma range of SECTION from ABFD.  */
3950 
3951 static bool
avr_is_section_for_address(asection * section,bfd_vma address)3952 avr_is_section_for_address (asection *section, bfd_vma address)
3953 {
3954   bfd_vma vma;
3955   bfd_size_type size;
3956 
3957   vma = bfd_section_vma (section);
3958   if (address < vma)
3959     return false;
3960 
3961   size = section->size;
3962   if (address >= vma + size)
3963     return false;
3964 
3965   return true;
3966 }
3967 
3968 /* Data structure used by AVR_FIND_SECTION_FOR_ADDRESS.  */
3969 
3970 struct avr_find_section_data
3971 {
3972   /* The address we're looking for.  */
3973   bfd_vma address;
3974 
3975   /* The section we've found.  */
3976   asection *section;
3977 };
3978 
3979 /* Helper function to locate the section holding a certain virtual memory
3980    address.  This is called via bfd_map_over_sections.  The DATA is an
3981    instance of STRUCT AVR_FIND_SECTION_DATA, the address field of which
3982    has been set to the address to search for, and the section field has
3983    been set to NULL.  If SECTION from ABFD contains ADDRESS then the
3984    section field in DATA will be set to SECTION.  As an optimisation, if
3985    the section field is already non-null then this function does not
3986    perform any checks, and just returns.  */
3987 
3988 static void
avr_find_section_for_address(bfd * abfd ATTRIBUTE_UNUSED,asection * section,void * data)3989 avr_find_section_for_address (bfd *abfd ATTRIBUTE_UNUSED,
3990 			      asection *section, void *data)
3991 {
3992   struct avr_find_section_data *fs_data
3993     = (struct avr_find_section_data *) data;
3994 
3995   /* Return if already found.  */
3996   if (fs_data->section != NULL)
3997     return;
3998 
3999   /* If this section isn't part of the addressable code content, skip it.  */
4000   if ((bfd_section_flags (section) & SEC_ALLOC) == 0
4001       && (bfd_section_flags (section) & SEC_CODE) == 0)
4002     return;
4003 
4004   if (avr_is_section_for_address (section, fs_data->address))
4005     fs_data->section = section;
4006 }
4007 
4008 /* Load all of the property records from SEC, a section from ABFD.  Return
4009    a STRUCT AVR_PROPERTY_RECORD_LIST containing all the records.  The
4010    memory for the returned structure, and all of the records pointed too by
4011    the structure are allocated with a single call to malloc, so, only the
4012    pointer returned needs to be free'd.  */
4013 
4014 static struct avr_property_record_list *
avr_elf32_load_records_from_section(bfd * abfd,asection * sec)4015 avr_elf32_load_records_from_section (bfd *abfd, asection *sec)
4016 {
4017   bfd_byte *contents, *ptr;
4018   bfd_size_type size, mem_size;
4019   bfd_byte version, flags;
4020   uint16_t record_count, i;
4021   struct avr_property_record_list *r_list = NULL;
4022   Elf_Internal_Rela *internal_relocs = NULL, *rel, *rel_end;
4023   struct avr_find_section_data fs_data;
4024 
4025   fs_data.section = NULL;
4026 
4027   if (!bfd_malloc_and_get_section (abfd, sec, &contents))
4028     goto load_failed;
4029   ptr = contents;
4030 
4031   /* Load the relocations for the '.avr.prop' section if there are any, and
4032      sort them.  */
4033   internal_relocs = (_bfd_elf_link_read_relocs
4034 		     (abfd, sec, NULL, NULL, false));
4035   if (internal_relocs)
4036     qsort (internal_relocs, sec->reloc_count,
4037 	   sizeof (Elf_Internal_Rela), internal_reloc_compare);
4038 
4039   /* There is a header at the start of the property record section SEC, the
4040      format of this header is:
4041        uint8_t  : version number
4042        uint8_t  : flags
4043        uint16_t : record counter
4044   */
4045 
4046   /* Check we have at least got a headers worth of bytes.  */
4047   size = bfd_section_size (sec);
4048   if (size < AVR_PROPERTY_SECTION_HEADER_SIZE)
4049     goto load_failed;
4050 
4051   version = *ptr;
4052   ptr++;
4053   flags = *ptr;
4054   ptr++;
4055   record_count = bfd_get_16 (abfd, ptr);
4056   ptr += 2;
4057   BFD_ASSERT (ptr - contents == AVR_PROPERTY_SECTION_HEADER_SIZE);
4058 
4059   /* Now allocate space for the list structure, and all of the list
4060      elements in a single block.  */
4061   mem_size = sizeof (struct avr_property_record_list)
4062     + sizeof (struct avr_property_record) * record_count;
4063   r_list = bfd_malloc (mem_size);
4064   if (r_list == NULL)
4065     goto load_failed;
4066 
4067   r_list->version = version;
4068   r_list->flags = flags;
4069   r_list->section = sec;
4070   r_list->record_count = record_count;
4071   r_list->records = (struct avr_property_record *) (&r_list [1]);
4072   size -= AVR_PROPERTY_SECTION_HEADER_SIZE;
4073 
4074   /* Check that we understand the version number.  There is only one
4075      version number right now, anything else is an error.  */
4076   if (r_list->version != AVR_PROPERTY_RECORDS_VERSION)
4077     goto load_failed;
4078 
4079   rel = internal_relocs;
4080   rel_end = rel + sec->reloc_count;
4081   for (i = 0; i < record_count; ++i)
4082     {
4083       bfd_vma address;
4084 
4085       /* Each entry is a 32-bit address, followed by a single byte type.
4086 	 After that is the type specific data.  We must take care to
4087 	 ensure that we don't read beyond the end of the section data.  */
4088       if (size < 5)
4089 	goto load_failed;
4090 
4091       r_list->records [i].section = NULL;
4092       r_list->records [i].offset = 0;
4093 
4094       if (rel)
4095 	{
4096 	  /* The offset of the address within the .avr.prop section.  */
4097 	  size_t offset = ptr - contents;
4098 
4099 	  while (rel < rel_end && rel->r_offset < offset)
4100 	    ++rel;
4101 
4102 	  if (rel == rel_end)
4103 	    rel = NULL;
4104 	  else if (rel->r_offset == offset)
4105 	    {
4106 	      /* Find section and section offset.  */
4107 	      unsigned long r_symndx;
4108 
4109 	      asection * rel_sec;
4110 	      bfd_vma sec_offset;
4111 
4112 	      r_symndx = ELF32_R_SYM (rel->r_info);
4113 	      rel_sec = get_elf_r_symndx_section (abfd, r_symndx);
4114 	      sec_offset = get_elf_r_symndx_offset (abfd, r_symndx)
4115 		+ rel->r_addend;
4116 
4117 	      r_list->records [i].section = rel_sec;
4118 	      r_list->records [i].offset = sec_offset;
4119 	    }
4120 	}
4121 
4122       address = bfd_get_32 (abfd, ptr);
4123       ptr += 4;
4124       size -= 4;
4125 
4126       if (r_list->records [i].section == NULL)
4127 	{
4128 	  /* Try to find section and offset from address.  */
4129 	  if (fs_data.section != NULL
4130 	      && !avr_is_section_for_address (fs_data.section, address))
4131 	    fs_data.section = NULL;
4132 
4133 	  if (fs_data.section == NULL)
4134 	    {
4135 	      fs_data.address = address;
4136 	      bfd_map_over_sections (abfd, avr_find_section_for_address,
4137 				     &fs_data);
4138 	    }
4139 
4140 	  if (fs_data.section == NULL)
4141 	    {
4142 	      fprintf (stderr, "Failed to find matching section.\n");
4143 	      goto load_failed;
4144 	    }
4145 
4146 	  r_list->records [i].section = fs_data.section;
4147 	  r_list->records [i].offset
4148 	    = address - bfd_section_vma (fs_data.section);
4149 	}
4150 
4151       r_list->records [i].type = *ptr;
4152       ptr += 1;
4153       size -= 1;
4154 
4155       switch (r_list->records [i].type)
4156 	{
4157 	case RECORD_ORG:
4158 	  /* Nothing else to load.  */
4159 	  break;
4160 	case RECORD_ORG_AND_FILL:
4161 	  /* Just a 4-byte fill to load.  */
4162 	  if (size < 4)
4163 	    goto load_failed;
4164 	  r_list->records [i].data.org.fill = bfd_get_32 (abfd, ptr);
4165 	  ptr += 4;
4166 	  size -= 4;
4167 	  break;
4168 	case RECORD_ALIGN:
4169 	  /* Just a 4-byte alignment to load.  */
4170 	  if (size < 4)
4171 	    goto load_failed;
4172 	  r_list->records [i].data.align.bytes = bfd_get_32 (abfd, ptr);
4173 	  ptr += 4;
4174 	  size -= 4;
4175 	  /* Just initialise PRECEDING_DELETED field, this field is
4176 	     used during linker relaxation.  */
4177 	  r_list->records [i].data.align.preceding_deleted = 0;
4178 	  break;
4179 	case RECORD_ALIGN_AND_FILL:
4180 	  /* A 4-byte alignment, and a 4-byte fill to load.  */
4181 	  if (size < 8)
4182 	    goto load_failed;
4183 	  r_list->records [i].data.align.bytes = bfd_get_32 (abfd, ptr);
4184 	  ptr += 4;
4185 	  r_list->records [i].data.align.fill = bfd_get_32 (abfd, ptr);
4186 	  ptr += 4;
4187 	  size -= 8;
4188 	  /* Just initialise PRECEDING_DELETED field, this field is
4189 	     used during linker relaxation.  */
4190 	  r_list->records [i].data.align.preceding_deleted = 0;
4191 	  break;
4192 	default:
4193 	  goto load_failed;
4194 	}
4195     }
4196 
4197   free (contents);
4198   if (elf_section_data (sec)->relocs != internal_relocs)
4199     free (internal_relocs);
4200   return r_list;
4201 
4202  load_failed:
4203   if (elf_section_data (sec)->relocs != internal_relocs)
4204     free (internal_relocs);
4205   free (contents);
4206   free (r_list);
4207   return NULL;
4208 }
4209 
4210 /* Load all of the property records from ABFD.  See
4211    AVR_ELF32_LOAD_RECORDS_FROM_SECTION for details of the return value.  */
4212 
4213 struct avr_property_record_list *
avr_elf32_load_property_records(bfd * abfd)4214 avr_elf32_load_property_records (bfd *abfd)
4215 {
4216   asection *sec;
4217 
4218   /* Find the '.avr.prop' section and load the contents into memory.  */
4219   sec = bfd_get_section_by_name (abfd, AVR_PROPERTY_RECORD_SECTION_NAME);
4220   if (sec == NULL || (sec->flags & SEC_HAS_CONTENTS) == 0)
4221     return NULL;
4222   return avr_elf32_load_records_from_section (abfd, sec);
4223 }
4224 
4225 const char *
avr_elf32_property_record_name(struct avr_property_record * rec)4226 avr_elf32_property_record_name (struct avr_property_record *rec)
4227 {
4228   const char *str;
4229 
4230   switch (rec->type)
4231     {
4232     case RECORD_ORG:
4233       str = "ORG";
4234       break;
4235     case RECORD_ORG_AND_FILL:
4236       str = "ORG+FILL";
4237       break;
4238     case RECORD_ALIGN:
4239       str = "ALIGN";
4240       break;
4241     case RECORD_ALIGN_AND_FILL:
4242       str = "ALIGN+FILL";
4243       break;
4244     default:
4245       str = "unknown";
4246     }
4247 
4248   return str;
4249 }
4250 
4251 
4252 #define ELF_ARCH		bfd_arch_avr
4253 #define ELF_TARGET_ID		AVR_ELF_DATA
4254 #define ELF_MACHINE_CODE	EM_AVR
4255 #define ELF_MACHINE_ALT1	EM_AVR_OLD
4256 #define ELF_MAXPAGESIZE		1
4257 
4258 #define TARGET_LITTLE_SYM	avr_elf32_vec
4259 #define TARGET_LITTLE_NAME	"elf32-avr"
4260 
4261 #define bfd_elf32_bfd_link_hash_table_create elf32_avr_link_hash_table_create
4262 
4263 #define elf_info_to_howto		     avr_info_to_howto_rela
4264 #define elf_info_to_howto_rel		     NULL
4265 #define elf_backend_relocate_section	     elf32_avr_relocate_section
4266 #define elf_backend_can_gc_sections	     1
4267 #define elf_backend_rela_normal		     1
4268 #define elf_backend_final_write_processing \
4269 					bfd_elf_avr_final_write_processing
4270 #define elf_backend_object_p		elf32_avr_object_p
4271 
4272 #define bfd_elf32_bfd_relax_section elf32_avr_relax_section
4273 #define bfd_elf32_bfd_get_relocated_section_contents \
4274 					elf32_avr_get_relocated_section_contents
4275 #define bfd_elf32_new_section_hook	elf_avr_new_section_hook
4276 #define elf_backend_special_sections	elf_avr_special_sections
4277 
4278 #include "elf32-target.h"
4279