Coverage Report

Created: 2023-08-28 06:26

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