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