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