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