OSDN Git Service

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