Apply Dmitry Diky's patches to add relaxation to msp430.
[deliverable/binutils-gdb.git] / bfd / elf32-msp430.c
1 /* MSP430-specific support for 32-bit ELF
2 Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
3 Contributed by Dmitry Diky <diwil@mail.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 2 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
21 #include "bfd.h"
22 #include "sysdep.h"
23 #include "libiberty.h"
24 #include "libbfd.h"
25 #include "elf-bfd.h"
26 #include "elf/msp430.h"
27
28 /* Use RELA instead of REL. */
29 #undef USE_REL
30
31 static reloc_howto_type elf_msp430_howto_table[] =
32 {
33 HOWTO (R_MSP430_NONE, /* type */
34 0, /* rightshift */
35 2, /* size (0 = byte, 1 = short, 2 = long) */
36 32, /* bitsize */
37 FALSE, /* pc_relative */
38 0, /* bitpos */
39 complain_overflow_bitfield,/* complain_on_overflow */
40 bfd_elf_generic_reloc, /* special_function */
41 "R_MSP430_NONE", /* name */
42 FALSE, /* partial_inplace */
43 0, /* src_mask */
44 0, /* dst_mask */
45 FALSE), /* pcrel_offset */
46
47 HOWTO (R_MSP430_32, /* type */
48 0, /* rightshift */
49 2, /* size (0 = byte, 1 = short, 2 = long) */
50 32, /* bitsize */
51 FALSE, /* pc_relative */
52 0, /* bitpos */
53 complain_overflow_bitfield,/* complain_on_overflow */
54 bfd_elf_generic_reloc, /* special_function */
55 "R_MSP430_32", /* name */
56 FALSE, /* partial_inplace */
57 0xffffffff, /* src_mask */
58 0xffffffff, /* dst_mask */
59 FALSE), /* pcrel_offset */
60
61 /* A 13 bit PC relative relocation. */
62 HOWTO (R_MSP430_10_PCREL, /* type */
63 1, /* rightshift */
64 1, /* size (0 = byte, 1 = short, 2 = long) */
65 10, /* bitsize */
66 TRUE, /* pc_relative */
67 0, /* bitpos */
68 complain_overflow_bitfield,/* complain_on_overflow */
69 bfd_elf_generic_reloc, /* special_function */
70 "R_MSP430_13_PCREL", /* name */
71 FALSE, /* partial_inplace */
72 0xfff, /* src_mask */
73 0xfff, /* dst_mask */
74 TRUE), /* pcrel_offset */
75
76 /* A 16 bit absolute relocation. */
77 HOWTO (R_MSP430_16, /* type */
78 0, /* rightshift */
79 1, /* size (0 = byte, 1 = short, 2 = long) */
80 16, /* bitsize */
81 FALSE, /* pc_relative */
82 0, /* bitpos */
83 complain_overflow_dont,/* complain_on_overflow */
84 bfd_elf_generic_reloc, /* special_function */
85 "R_MSP430_16", /* name */
86 FALSE, /* partial_inplace */
87 0, /* src_mask */
88 0xffff, /* dst_mask */
89 FALSE), /* pcrel_offset */
90
91 /* A 16 bit absolute relocation for command address. */
92 HOWTO (R_MSP430_16_PCREL, /* type */
93 1, /* rightshift */
94 1, /* size (0 = byte, 1 = short, 2 = long) */
95 16, /* bitsize */
96 TRUE, /* pc_relative */
97 0, /* bitpos */
98 complain_overflow_dont,/* complain_on_overflow */
99 bfd_elf_generic_reloc, /* special_function */
100 "R_MSP430_16_PCREL", /* name */
101 FALSE, /* partial_inplace */
102 0, /* src_mask */
103 0xffff, /* dst_mask */
104 TRUE), /* pcrel_offset */
105
106 /* A 16 bit absolute relocation, byte operations. */
107 HOWTO (R_MSP430_16_BYTE, /* type */
108 0, /* rightshift */
109 1, /* size (0 = byte, 1 = short, 2 = long) */
110 16, /* bitsize */
111 FALSE, /* pc_relative */
112 0, /* bitpos */
113 complain_overflow_dont,/* complain_on_overflow */
114 bfd_elf_generic_reloc, /* special_function */
115 "R_MSP430_16_BYTE", /* name */
116 FALSE, /* partial_inplace */
117 0xffff, /* src_mask */
118 0xffff, /* dst_mask */
119 FALSE), /* pcrel_offset */
120
121 /* A 16 bit absolute relocation for command address. */
122 HOWTO (R_MSP430_16_PCREL_BYTE,/* type */
123 1, /* rightshift */
124 1, /* size (0 = byte, 1 = short, 2 = long) */
125 16, /* bitsize */
126 TRUE, /* pc_relative */
127 0, /* bitpos */
128 complain_overflow_dont,/* complain_on_overflow */
129 bfd_elf_generic_reloc, /* special_function */
130 "R_MSP430_16_PCREL_BYTE",/* name */
131 FALSE, /* partial_inplace */
132 0xffff, /* src_mask */
133 0xffff, /* dst_mask */
134 TRUE), /* pcrel_offset */
135
136 /* A 13 bit PC relative relocation for complicated polymorphs. */
137 HOWTO (R_MSP430_2X_PCREL, /* type */
138 1, /* rightshift */
139 2, /* size (0 = byte, 1 = short, 2 = long) */
140 10, /* bitsize */
141 TRUE, /* pc_relative */
142 0, /* bitpos */
143 complain_overflow_bitfield,/* complain_on_overflow */
144 bfd_elf_generic_reloc, /* special_function */
145 "R_MSP430_2X_PCREL", /* name */
146 FALSE, /* partial_inplace */
147 0xfff, /* src_mask */
148 0xfff, /* dst_mask */
149 TRUE), /* pcrel_offset */
150
151 /* A 16 bit relaxable relocation for command address. */
152 HOWTO (R_MSP430_RL_PCREL, /* type */
153 1, /* rightshift */
154 1, /* size (0 = byte, 1 = short, 2 = long) */
155 16, /* bitsize */
156 TRUE, /* pc_relative */
157 0, /* bitpos */
158 complain_overflow_dont,/* complain_on_overflow */
159 bfd_elf_generic_reloc, /* special_function */
160 "R_MSP430_RL_PCREL", /* name */
161 FALSE, /* partial_inplace */
162 0, /* src_mask */
163 0xffff, /* dst_mask */
164 TRUE) /* pcrel_offset */
165 };
166
167 /* Map BFD reloc types to MSP430 ELF reloc types. */
168
169 struct msp430_reloc_map
170 {
171 bfd_reloc_code_real_type bfd_reloc_val;
172 unsigned int elf_reloc_val;
173 };
174
175 static const struct msp430_reloc_map msp430_reloc_map[] =
176 {
177 {BFD_RELOC_NONE, R_MSP430_NONE},
178 {BFD_RELOC_32, R_MSP430_32},
179 {BFD_RELOC_MSP430_10_PCREL, R_MSP430_10_PCREL},
180 {BFD_RELOC_16, R_MSP430_16_BYTE},
181 {BFD_RELOC_MSP430_16_PCREL, R_MSP430_16_PCREL},
182 {BFD_RELOC_MSP430_16, R_MSP430_16},
183 {BFD_RELOC_MSP430_16_PCREL_BYTE, R_MSP430_16_PCREL_BYTE},
184 {BFD_RELOC_MSP430_16_BYTE, R_MSP430_16_BYTE},
185 {BFD_RELOC_MSP430_2X_PCREL, R_MSP430_2X_PCREL},
186 {BFD_RELOC_MSP430_RL_PCREL, R_MSP430_RL_PCREL}
187 };
188
189 static reloc_howto_type *
190 bfd_elf32_bfd_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
191 bfd_reloc_code_real_type code)
192 {
193 unsigned int i;
194
195 for (i = 0; i < ARRAY_SIZE (msp430_reloc_map); i++)
196 if (msp430_reloc_map[i].bfd_reloc_val == code)
197 return &elf_msp430_howto_table[msp430_reloc_map[i].elf_reloc_val];
198
199 return NULL;
200 }
201
202 /* Set the howto pointer for an MSP430 ELF reloc. */
203
204 static void
205 msp430_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED,
206 arelent * cache_ptr,
207 Elf_Internal_Rela * dst)
208 {
209 unsigned int r_type;
210
211 r_type = ELF32_R_TYPE (dst->r_info);
212 BFD_ASSERT (r_type < (unsigned int) R_MSP430_max);
213 cache_ptr->howto = &elf_msp430_howto_table[r_type];
214 }
215
216 static asection *
217 elf32_msp430_gc_mark_hook (asection * sec,
218 struct bfd_link_info * info ATTRIBUTE_UNUSED,
219 Elf_Internal_Rela * rel,
220 struct elf_link_hash_entry * h,
221 Elf_Internal_Sym * sym)
222 {
223 if (h != NULL)
224 {
225 switch (ELF32_R_TYPE (rel->r_info))
226 {
227 default:
228 switch (h->root.type)
229 {
230 case bfd_link_hash_defined:
231 case bfd_link_hash_defweak:
232 return h->root.u.def.section;
233
234 case bfd_link_hash_common:
235 return h->root.u.c.p->section;
236
237 default:
238 break;
239 }
240 }
241 }
242 else
243 return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
244
245 return NULL;
246 }
247
248 static bfd_boolean
249 elf32_msp430_gc_sweep_hook (bfd * abfd ATTRIBUTE_UNUSED,
250 struct bfd_link_info * info ATTRIBUTE_UNUSED,
251 asection * sec ATTRIBUTE_UNUSED,
252 const Elf_Internal_Rela * relocs ATTRIBUTE_UNUSED)
253 {
254 /* We don't use got and plt entries for msp430. */
255 return TRUE;
256 }
257
258 /* Look through the relocs for a section during the first phase.
259 Since we don't do .gots or .plts, we just need to consider the
260 virtual table relocs for gc. */
261
262 static bfd_boolean
263 elf32_msp430_check_relocs (bfd * abfd, struct bfd_link_info * info,
264 asection * sec, const Elf_Internal_Rela * relocs)
265 {
266 Elf_Internal_Shdr *symtab_hdr;
267 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
268 const Elf_Internal_Rela *rel;
269 const Elf_Internal_Rela *rel_end;
270
271 if (info->relocatable)
272 return TRUE;
273
274 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
275 sym_hashes = elf_sym_hashes (abfd);
276 sym_hashes_end =
277 sym_hashes + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
278 if (!elf_bad_symtab (abfd))
279 sym_hashes_end -= symtab_hdr->sh_info;
280
281 rel_end = relocs + sec->reloc_count;
282 for (rel = relocs; rel < rel_end; rel++)
283 {
284 struct elf_link_hash_entry *h;
285 unsigned long r_symndx;
286
287 r_symndx = ELF32_R_SYM (rel->r_info);
288 if (r_symndx < symtab_hdr->sh_info)
289 h = NULL;
290 else
291 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
292 }
293
294 return TRUE;
295 }
296
297 /* Perform a single relocation. By default we use the standard BFD
298 routines, but a few relocs, we have to do them ourselves. */
299
300 static bfd_reloc_status_type
301 msp430_final_link_relocate (reloc_howto_type * howto, bfd * input_bfd,
302 asection * input_section, bfd_byte * contents,
303 Elf_Internal_Rela * rel, bfd_vma relocation)
304 {
305 bfd_reloc_status_type r = bfd_reloc_ok;
306 bfd_vma x;
307 bfd_signed_vma srel;
308
309 switch (howto->type)
310 {
311 case R_MSP430_10_PCREL:
312 contents += rel->r_offset;
313 srel = (bfd_signed_vma) relocation;
314 srel += rel->r_addend;
315 srel -= rel->r_offset;
316 srel -= 2; /* Branch instructions add 2 to the PC... */
317 srel -= (input_section->output_section->vma +
318 input_section->output_offset);
319
320 if (srel & 1)
321 return bfd_reloc_outofrange;
322
323 /* MSP430 addresses commands as words. */
324 srel >>= 1;
325
326 /* Check for an overflow. */
327 if (srel < -512 || srel > 511)
328 return bfd_reloc_overflow;
329
330 x = bfd_get_16 (input_bfd, contents);
331 x = (x & 0xfc00) | (srel & 0x3ff);
332 bfd_put_16 (input_bfd, x, contents);
333 break;
334
335 case R_MSP430_2X_PCREL:
336 contents += rel->r_offset;
337 srel = (bfd_signed_vma) relocation;
338 srel += rel->r_addend;
339 srel -= rel->r_offset;
340 srel -= 2; /* Branch instructions add 2 to the PC... */
341 srel -= (input_section->output_section->vma +
342 input_section->output_offset);
343
344 if (srel & 1)
345 return bfd_reloc_outofrange;
346
347 /* MSP430 addresses commands as words. */
348 srel >>= 1;
349
350 /* Check for an overflow. */
351 if (srel < -512 || srel > 511)
352 return bfd_reloc_overflow;
353
354 x = bfd_get_16 (input_bfd, contents);
355 x = (x & 0xfc00) | (srel & 0x3ff);
356 bfd_put_16 (input_bfd, x, contents);
357 /* Handle second jump instruction. */
358 x = bfd_get_16 (input_bfd, contents - 2);
359 srel += 1;
360 x = (x & 0xfc00) | (srel & 0x3ff);
361 bfd_put_16 (input_bfd, x, contents - 2);
362 break;
363
364 case R_MSP430_16_PCREL:
365 case R_MSP430_RL_PCREL:
366 contents += rel->r_offset;
367 srel = (bfd_signed_vma) relocation;
368 srel += rel->r_addend;
369 srel -= rel->r_offset;
370 /* Only branch instructions add 2 to the PC... */
371 srel -= (input_section->output_section->vma +
372 input_section->output_offset);
373
374 if (srel & 1)
375 return bfd_reloc_outofrange;
376
377 bfd_put_16 (input_bfd, srel & 0xffff, contents);
378 break;
379
380 case R_MSP430_16_PCREL_BYTE:
381 contents += rel->r_offset;
382 srel = (bfd_signed_vma) relocation;
383 srel += rel->r_addend;
384 srel -= rel->r_offset;
385 /* Only branch instructions add 2 to the PC... */
386 srel -= (input_section->output_section->vma +
387 input_section->output_offset);
388
389 bfd_put_16 (input_bfd, srel & 0xffff, contents);
390 break;
391
392 case R_MSP430_16_BYTE:
393 contents += rel->r_offset;
394 srel = (bfd_signed_vma) relocation;
395 srel += rel->r_addend;
396 bfd_put_16 (input_bfd, srel & 0xffff, contents);
397 break;
398
399 case R_MSP430_16:
400 contents += rel->r_offset;
401 srel = (bfd_signed_vma) relocation;
402 srel += rel->r_addend;
403
404 if (srel & 1)
405 return bfd_reloc_notsupported;
406
407 bfd_put_16 (input_bfd, srel & 0xffff, contents);
408 break;
409
410 default:
411 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
412 contents, rel->r_offset,
413 relocation, rel->r_addend);
414 }
415
416 return r;
417 }
418
419 /* Relocate an MSP430 ELF section. */
420
421 static bfd_boolean
422 elf32_msp430_relocate_section (bfd * output_bfd ATTRIBUTE_UNUSED,
423 struct bfd_link_info * info,
424 bfd * input_bfd,
425 asection * input_section,
426 bfd_byte * contents,
427 Elf_Internal_Rela * relocs,
428 Elf_Internal_Sym * local_syms,
429 asection ** local_sections)
430 {
431 Elf_Internal_Shdr *symtab_hdr;
432 struct elf_link_hash_entry **sym_hashes;
433 Elf_Internal_Rela *rel;
434 Elf_Internal_Rela *relend;
435
436 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
437 sym_hashes = elf_sym_hashes (input_bfd);
438 relend = relocs + input_section->reloc_count;
439
440 for (rel = relocs; rel < relend; rel++)
441 {
442 reloc_howto_type *howto;
443 unsigned long r_symndx;
444 Elf_Internal_Sym *sym;
445 asection *sec;
446 struct elf_link_hash_entry *h;
447 bfd_vma relocation;
448 bfd_reloc_status_type r;
449 const char *name = NULL;
450 int r_type;
451
452 /* This is a final link. */
453
454 r_type = ELF32_R_TYPE (rel->r_info);
455 r_symndx = ELF32_R_SYM (rel->r_info);
456 howto = elf_msp430_howto_table + ELF32_R_TYPE (rel->r_info);
457 h = NULL;
458 sym = NULL;
459 sec = NULL;
460
461 if (r_symndx < symtab_hdr->sh_info)
462 {
463 sym = local_syms + r_symndx;
464 sec = local_sections[r_symndx];
465 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
466
467 name = bfd_elf_string_from_elf_section
468 (input_bfd, symtab_hdr->sh_link, sym->st_name);
469 name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
470 }
471 else
472 {
473 bfd_boolean unresolved_reloc, warned;
474
475 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
476 r_symndx, symtab_hdr, sym_hashes,
477 h, sec, relocation,
478 unresolved_reloc, warned);
479 }
480
481 r = msp430_final_link_relocate (howto, input_bfd, input_section,
482 contents, rel, relocation);
483
484 if (r != bfd_reloc_ok)
485 {
486 const char *msg = (const char *) NULL;
487
488 switch (r)
489 {
490 case bfd_reloc_overflow:
491 r = info->callbacks->reloc_overflow
492 (info, name, howto->name, (bfd_vma) 0,
493 input_bfd, input_section, rel->r_offset);
494 break;
495
496 case bfd_reloc_undefined:
497 r = info->callbacks->undefined_symbol
498 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
499 break;
500
501 case bfd_reloc_outofrange:
502 msg = _("internal error: out of range error");
503 break;
504
505 case bfd_reloc_notsupported:
506 msg = _("internal error: unsupported relocation error");
507 break;
508
509 case bfd_reloc_dangerous:
510 msg = _("internal error: dangerous relocation");
511 break;
512
513 default:
514 msg = _("internal error: unknown error");
515 break;
516 }
517
518 if (msg)
519 r = info->callbacks->warning
520 (info, msg, name, input_bfd, input_section, rel->r_offset);
521
522 if (!r)
523 return FALSE;
524 }
525
526 }
527
528 return TRUE;
529 }
530
531 /* The final processing done just before writing out a MSP430 ELF object
532 file. This gets the MSP430 architecture right based on the machine
533 number. */
534
535 static void
536 bfd_elf_msp430_final_write_processing (bfd * abfd,
537 bfd_boolean linker ATTRIBUTE_UNUSED)
538 {
539 unsigned long val;
540
541 switch (bfd_get_mach (abfd))
542 {
543 default:
544 case bfd_mach_msp110:
545 val = E_MSP430_MACH_MSP430x11x1;
546 break;
547
548 case bfd_mach_msp11:
549 val = E_MSP430_MACH_MSP430x11;
550 break;
551
552 case bfd_mach_msp12:
553 val = E_MSP430_MACH_MSP430x12;
554 break;
555
556 case bfd_mach_msp13:
557 val = E_MSP430_MACH_MSP430x13;
558 break;
559
560 case bfd_mach_msp14:
561 val = E_MSP430_MACH_MSP430x14;
562 break;
563
564 case bfd_mach_msp15:
565 val = E_MSP430_MACH_MSP430x15;
566 break;
567
568 case bfd_mach_msp16:
569 val = E_MSP430_MACH_MSP430x16;
570 break;
571
572 case bfd_mach_msp31:
573 val = E_MSP430_MACH_MSP430x31;
574 break;
575
576 case bfd_mach_msp32:
577 val = E_MSP430_MACH_MSP430x32;
578 break;
579
580 case bfd_mach_msp33:
581 val = E_MSP430_MACH_MSP430x33;
582 break;
583
584 case bfd_mach_msp41:
585 val = E_MSP430_MACH_MSP430x41;
586 break;
587
588 case bfd_mach_msp42:
589 val = E_MSP430_MACH_MSP430x42;
590 break;
591
592 case bfd_mach_msp43:
593 val = E_MSP430_MACH_MSP430x43;
594 break;
595
596 case bfd_mach_msp44:
597 val = E_MSP430_MACH_MSP430x44;
598 break;
599 }
600
601 elf_elfheader (abfd)->e_machine = EM_MSP430;
602 elf_elfheader (abfd)->e_flags &= ~EF_MSP430_MACH;
603 elf_elfheader (abfd)->e_flags |= val;
604 }
605
606 /* Set the right machine number. */
607
608 static bfd_boolean
609 elf32_msp430_object_p (bfd * abfd)
610 {
611 int e_set = bfd_mach_msp14;
612
613 if (elf_elfheader (abfd)->e_machine == EM_MSP430
614 || elf_elfheader (abfd)->e_machine == EM_MSP430_OLD)
615 {
616 int e_mach = elf_elfheader (abfd)->e_flags & EF_MSP430_MACH;
617
618 switch (e_mach)
619 {
620 default:
621 case E_MSP430_MACH_MSP430x11:
622 e_set = bfd_mach_msp11;
623 break;
624
625 case E_MSP430_MACH_MSP430x11x1:
626 e_set = bfd_mach_msp110;
627 break;
628
629 case E_MSP430_MACH_MSP430x12:
630 e_set = bfd_mach_msp12;
631 break;
632
633 case E_MSP430_MACH_MSP430x13:
634 e_set = bfd_mach_msp13;
635 break;
636
637 case E_MSP430_MACH_MSP430x14:
638 e_set = bfd_mach_msp14;
639 break;
640
641 case E_MSP430_MACH_MSP430x15:
642 e_set = bfd_mach_msp15;
643 break;
644
645 case E_MSP430_MACH_MSP430x16:
646 e_set = bfd_mach_msp16;
647 break;
648
649 case E_MSP430_MACH_MSP430x31:
650 e_set = bfd_mach_msp31;
651 break;
652
653 case E_MSP430_MACH_MSP430x32:
654 e_set = bfd_mach_msp32;
655 break;
656
657 case E_MSP430_MACH_MSP430x33:
658 e_set = bfd_mach_msp33;
659 break;
660
661 case E_MSP430_MACH_MSP430x41:
662 e_set = bfd_mach_msp41;
663 break;
664
665 case E_MSP430_MACH_MSP430x42:
666 e_set = bfd_mach_msp42;
667 break;
668
669 case E_MSP430_MACH_MSP430x43:
670 e_set = bfd_mach_msp43;
671 break;
672
673 case E_MSP430_MACH_MSP430x44:
674 e_set = bfd_mach_msp44;
675 break;
676 }
677 }
678
679 return bfd_default_set_arch_mach (abfd, bfd_arch_msp430, e_set);
680 }
681
682 static void
683 elf32_msp430_post_process_headers (bfd * abfd,
684 struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
685 {
686 Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form. */
687
688 i_ehdrp = elf_elfheader (abfd);
689
690 #ifndef ELFOSABI_STANDALONE
691 #define ELFOSABI_STANDALONE 255
692 #endif
693
694 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_STANDALONE;
695 }
696
697 /* These functions handle relaxing for the msp430.
698 Relaxation required only in two cases:
699 - Bad hand coding like jumps from one section to another or
700 from file to file.
701 - Sibling calls. This will affect onlu 'jump label' polymorph. Without
702 relaxing this enlarges code by 2 bytes. Sibcalls implemented but
703 do not work in gcc's port by the reason I do not know.
704 Anyway, if a relaxation required, user should pass -relax option to the
705 linker.
706
707 There are quite a few relaxing opportunities available on the msp430:
708
709 ================================================================
710
711 1. 3 words -> 1 word
712
713 eq == jeq label jne +4; br lab
714 ne != jne label jeq +4; br lab
715 lt < jl label jge +4; br lab
716 ltu < jlo label lhs +4; br lab
717 ge >= jge label jl +4; br lab
718 geu >= jhs label jlo +4; br lab
719
720 2. 4 words -> 1 word
721
722 ltn < jn jn +2; jmp +4; br lab
723
724 3. 4 words -> 2 words
725
726 gt > jeq +2; jge label jeq +6; jl +4; br label
727 gtu > jeq +2; jhs label jeq +6; jlo +4; br label
728
729 4. 4 words -> 2 words and 2 labels
730
731 leu <= jeq label; jlo label jeq +2; jhs +4; br label
732 le <= jeq label; jl label jeq +2; jge +4; br label
733 =================================================================
734
735 codemap for first cases is (labels masked ):
736 eq: 0x2002,0x4010,0x0000 -> 0x2400
737 ne: 0x2402,0x4010,0x0000 -> 0x2000
738 lt: 0x3402,0x4010,0x0000 -> 0x3800
739 ltu: 0x2c02,0x4010,0x0000 -> 0x2800
740 ge: 0x3802,0x4010,0x0000 -> 0x3400
741 geu: 0x2802,0x4010,0x0000 -> 0x2c00
742
743 second case:
744 ltn: 0x3001,0x3c02,0x4010,0x0000 -> 0x3000
745
746 third case:
747 gt: 0x2403,0x3802,0x4010,0x0000 -> 0x2401,0x3400
748 gtu: 0x2403,0x2802,0x4010,0x0000 -> 0x2401,0x2c00
749
750 fourth case:
751 leu: 0x2401,0x2c02,0x4010,0x0000 -> 0x2400,0x2800
752 le: 0x2401,0x3402,0x4010,0x0000 -> 0x2400,0x3800
753
754 Unspecified case :)
755 jump: 0x4010,0x0000 -> 0x3c00. */
756
757 #define NUMB_RELAX_CODES 12
758 static struct rcodes_s
759 {
760 int f0, f1; /* From code. */
761 int t0, t1; /* To code. */
762 int labels; /* Position of labels: 1 - one label at first
763 word, 2 - one at second word, 3 - two
764 labels at both. */
765 int cdx; /* Words to match. */
766 int bs; /* Shrink bytes. */
767 int off; /* Offset from old label for new code. */
768 int ncl; /* New code length. */
769 } rcode[] =
770 {/* lab,cdx,bs,off,ncl */
771 { 0x0000, 0x0000, 0x3c00, 0x0000, 1, 0, 2, 2, 2}, /* jump */
772 { 0x0000, 0x2002, 0x2400, 0x0000, 1, 1, 4, 4, 2}, /* eq */
773 { 0x0000, 0x2402, 0x2000, 0x0000, 1, 1, 4, 4, 2}, /* ne */
774 { 0x0000, 0x3402, 0x3800, 0x0000, 1, 1, 4, 4, 2}, /* lt */
775 { 0x0000, 0x2c02, 0x2800, 0x0000, 1, 1, 4, 4, 2}, /* ltu */
776 { 0x0000, 0x3802, 0x3400, 0x0000, 1, 1, 4, 4, 2}, /* ge */
777 { 0x0000, 0x2802, 0x2c00, 0x0000, 1, 1, 4, 4, 2}, /* geu */
778 { 0x3001, 0x3c02, 0x3000, 0x0000, 1, 2, 6, 6, 2}, /* ltn */
779 { 0x2403, 0x3802, 0x2401, 0x3400, 2, 2, 4, 6, 4}, /* gt */
780 { 0x2403, 0x2802, 0x2401, 0x2c00, 2, 2, 4, 6, 4}, /* gtu */
781 { 0x2401, 0x2c02, 0x2400, 0x2800, 3, 2, 4, 6, 4}, /* leu , 2 labels */
782 { 0x2401, 0x2c02, 0x2400, 0x2800, 3, 2, 4, 6, 4}, /* le , 2 labels */
783 { 0, 0, 0, 0, 0, 0, 0, 0, 0}
784 };
785
786 /* Return TRUE if a symbol exists at the given address. */
787
788 static bfd_boolean
789 msp430_elf_symbol_address_p (bfd * abfd,
790 asection * sec,
791 Elf_Internal_Sym * isym,
792 bfd_vma addr)
793 {
794 Elf_Internal_Shdr *symtab_hdr;
795 unsigned int sec_shndx;
796 Elf_Internal_Sym *isymend;
797 struct elf_link_hash_entry **sym_hashes;
798 struct elf_link_hash_entry **end_hashes;
799 unsigned int symcount;
800
801 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
802
803 /* Examine all the local symbols. */
804 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
805 for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
806 if (isym->st_shndx == sec_shndx && isym->st_value == addr)
807 return TRUE;
808
809 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
810 - symtab_hdr->sh_info);
811 sym_hashes = elf_sym_hashes (abfd);
812 end_hashes = sym_hashes + symcount;
813 for (; sym_hashes < end_hashes; sym_hashes++)
814 {
815 struct elf_link_hash_entry *sym_hash = *sym_hashes;
816
817 if ((sym_hash->root.type == bfd_link_hash_defined
818 || sym_hash->root.type == bfd_link_hash_defweak)
819 && sym_hash->root.u.def.section == sec
820 && sym_hash->root.u.def.value == addr)
821 return TRUE;
822 }
823
824 return FALSE;
825 }
826
827 /* Delete some bytes from a section while relaxing. */
828
829 static bfd_boolean
830 msp430_elf_relax_delete_bytes (bfd * abfd, asection * sec, bfd_vma addr,
831 int count)
832 {
833 Elf_Internal_Shdr *symtab_hdr;
834 unsigned int sec_shndx;
835 bfd_byte *contents;
836 Elf_Internal_Rela *irel;
837 Elf_Internal_Rela *irelend;
838 Elf_Internal_Rela *irelalign;
839 bfd_vma toaddr;
840 Elf_Internal_Sym *isym;
841 Elf_Internal_Sym *isymend;
842 struct elf_link_hash_entry **sym_hashes;
843 struct elf_link_hash_entry **end_hashes;
844 unsigned int symcount;
845
846 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
847
848 contents = elf_section_data (sec)->this_hdr.contents;
849
850 /* The deletion must stop at the next ALIGN reloc for an aligment
851 power larger than the number of bytes we are deleting. */
852
853 irelalign = NULL;
854 toaddr = sec->size;
855
856 irel = elf_section_data (sec)->relocs;
857 irelend = irel + sec->reloc_count;
858
859 /* Actually delete the bytes. */
860 memmove (contents + addr, contents + addr + count,
861 (size_t) (toaddr - addr - count));
862 sec->size -= count;
863
864 /* Adjust all the relocs. */
865 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
866 /* Get the new reloc address. */
867 if ((irel->r_offset > addr && irel->r_offset < toaddr))
868 irel->r_offset -= count;
869
870 /* Adjust the local symbols defined in this section. */
871 symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
872 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
873 for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
874 if (isym->st_shndx == sec_shndx
875 && isym->st_value > addr && isym->st_value < toaddr)
876 isym->st_value -= count;
877
878 /* Now adjust the global symbols defined in this section. */
879 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
880 - symtab_hdr->sh_info);
881 sym_hashes = elf_sym_hashes (abfd);
882 end_hashes = sym_hashes + symcount;
883 for (; sym_hashes < end_hashes; sym_hashes++)
884 {
885 struct elf_link_hash_entry *sym_hash = *sym_hashes;
886
887 if ((sym_hash->root.type == bfd_link_hash_defined
888 || sym_hash->root.type == bfd_link_hash_defweak)
889 && sym_hash->root.u.def.section == sec
890 && sym_hash->root.u.def.value > addr
891 && sym_hash->root.u.def.value < toaddr)
892 sym_hash->root.u.def.value -= count;
893 }
894
895 return TRUE;
896 }
897
898
899 static bfd_boolean
900 msp430_elf_relax_section (bfd * abfd, asection * sec,
901 struct bfd_link_info * link_info,
902 bfd_boolean * again)
903 {
904 Elf_Internal_Shdr * symtab_hdr;
905 Elf_Internal_Rela * internal_relocs;
906 Elf_Internal_Rela * irel;
907 Elf_Internal_Rela * irelend;
908 bfd_byte * contents = NULL;
909 Elf_Internal_Sym * isymbuf = NULL;
910
911 /* Assume nothing changes. */
912 *again = FALSE;
913
914 /* We don't have to do anything for a relocatable link, if
915 this section does not have relocs, or if this is not a
916 code section. */
917 if (link_info->relocatable
918 || (sec->flags & SEC_RELOC) == 0
919 || sec->reloc_count == 0 || (sec->flags & SEC_CODE) == 0)
920 return TRUE;
921
922 symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
923
924 /* Get a copy of the native relocations. */
925 internal_relocs =
926 _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, link_info->keep_memory);
927 if (internal_relocs == NULL)
928 goto error_return;
929
930 /* Walk through them looking for relaxing opportunities. */
931 irelend = internal_relocs + sec->reloc_count;
932 for (irel = internal_relocs; irel < irelend; irel++)
933 {
934 bfd_vma symval;
935
936 /* If this isn't something that can be relaxed, then ignore
937 this reloc. */
938 if (ELF32_R_TYPE (irel->r_info) != (int) R_MSP430_RL_PCREL)
939 continue;
940
941 /* Get the section contents if we haven't done so already. */
942 if (contents == NULL)
943 {
944 /* Get cached copy if it exists. */
945 if (elf_section_data (sec)->this_hdr.contents != NULL)
946 contents = elf_section_data (sec)->this_hdr.contents;
947 else if (! bfd_malloc_and_get_section (abfd, sec, &contents))
948 goto error_return;
949 }
950
951 /* Read this BFD's local symbols if we haven't done so already. */
952 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
953 {
954 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
955 if (isymbuf == NULL)
956 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
957 symtab_hdr->sh_info, 0,
958 NULL, NULL, NULL);
959 if (isymbuf == NULL)
960 goto error_return;
961 }
962
963 /* Get the value of the symbol referred to by the reloc. */
964 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
965 {
966 /* A local symbol. */
967 Elf_Internal_Sym *isym;
968 asection *sym_sec;
969
970 isym = isymbuf + ELF32_R_SYM (irel->r_info);
971 if (isym->st_shndx == SHN_UNDEF)
972 sym_sec = bfd_und_section_ptr;
973 else if (isym->st_shndx == SHN_ABS)
974 sym_sec = bfd_abs_section_ptr;
975 else if (isym->st_shndx == SHN_COMMON)
976 sym_sec = bfd_com_section_ptr;
977 else
978 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
979 symval = (isym->st_value
980 + sym_sec->output_section->vma + sym_sec->output_offset);
981 }
982 else
983 {
984 unsigned long indx;
985 struct elf_link_hash_entry *h;
986
987 /* An external symbol. */
988 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
989 h = elf_sym_hashes (abfd)[indx];
990 BFD_ASSERT (h != NULL);
991
992 if (h->root.type != bfd_link_hash_defined
993 && h->root.type != bfd_link_hash_defweak)
994 /* This appears to be a reference to an undefined
995 symbol. Just ignore it--it will be caught by the
996 regular reloc processing. */
997 continue;
998
999 symval = (h->root.u.def.value
1000 + h->root.u.def.section->output_section->vma
1001 + h->root.u.def.section->output_offset);
1002 }
1003
1004 /* For simplicity of coding, we are going to modify the section
1005 contents, the section relocs, and the BFD symbol table. We
1006 must tell the rest of the code not to free up this
1007 information. It would be possible to instead create a table
1008 of changes which have to be made, as is done in coff-mips.c;
1009 that would be more work, but would require less memory when
1010 the linker is run. */
1011
1012 /* Try to turn a 16bit pc-relative branch into a 10bit pc-relative
1013 branch. */
1014 /* Paranoia? paranoia... */
1015 if (ELF32_R_TYPE (irel->r_info) == (int) R_MSP430_RL_PCREL)
1016 {
1017 bfd_vma value = symval;
1018
1019 /* Deal with pc-relative gunk. */
1020 value -= (sec->output_section->vma + sec->output_offset);
1021 value -= irel->r_offset;
1022 value += irel->r_addend;
1023
1024 /* See if the value will fit in 10 bits, note the high value is
1025 1016 as the target will be two bytes closer if we are
1026 able to relax. */
1027 if ((long) value < 1016 && (long) value > -1016)
1028 {
1029 int code0 = 0, code1 = 0, code2 = 0;
1030 int i;
1031 struct rcodes_s *rx;
1032
1033 /* Get the opcode. */
1034 if (irel->r_offset >= 6)
1035 code0 = bfd_get_16 (abfd, contents + irel->r_offset - 6);
1036
1037 if (irel->r_offset >= 4)
1038 code1 = bfd_get_16 (abfd, contents + irel->r_offset - 4);
1039
1040 code2 = bfd_get_16 (abfd, contents + irel->r_offset - 2);
1041
1042 if (code2 != 0x4010)
1043 continue;
1044
1045 /* Check r4 and r3. */
1046 for (i = NUMB_RELAX_CODES - 1; i >= 0; i--)
1047 {
1048 rx = &rcode[i];
1049 if (rx->cdx == 2 && rx->f0 == code0 && rx->f1 == code1)
1050 break;
1051 else if (rx->cdx == 1 && rx->f1 == code1)
1052 break;
1053 else if (rx->cdx == 0) /* This is an unconditional jump. */
1054 break;
1055 }
1056
1057 /* Check labels:
1058 .Label0: ; we do not care about this label
1059 jeq +6
1060 .Label1: ; make sure there is no label here
1061 jl +4
1062 .Label2: ; make sure there is no label here
1063 br .Label_dst
1064
1065 So, if there is .Label1 or .Label2 we cannot relax this code.
1066 This actually should not happen, cause for relaxable
1067 instructions we use RL_PCREL reloc instead of 16_PCREL.
1068 Will change this in the future. */
1069
1070 if (rx->cdx > 0
1071 && msp430_elf_symbol_address_p (abfd, sec, isymbuf,
1072 irel->r_offset - 2))
1073 continue;
1074 if (rx->cdx > 1
1075 && msp430_elf_symbol_address_p (abfd, sec, isymbuf,
1076 irel->r_offset - 4))
1077 continue;
1078
1079 /* Note that we've changed the relocs, section contents, etc. */
1080 elf_section_data (sec)->relocs = internal_relocs;
1081 elf_section_data (sec)->this_hdr.contents = contents;
1082 symtab_hdr->contents = (unsigned char *) isymbuf;
1083
1084 /* Fix the relocation's type. */
1085 if (rx->labels == 3) /* Handle special cases. */
1086 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1087 R_MSP430_2X_PCREL);
1088 else
1089 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1090 R_MSP430_10_PCREL);
1091
1092 /* Fix the opcode right way. */
1093 bfd_put_16 (abfd, rx->t0, contents + irel->r_offset - rx->off);
1094 if (rx->t1)
1095 bfd_put_16 (abfd, rx->t1,
1096 contents + irel->r_offset - rx->off + 2);
1097
1098 /* Delete bytes. */
1099 if (!msp430_elf_relax_delete_bytes (abfd, sec,
1100 irel->r_offset - rx->off +
1101 rx->ncl, rx->bs))
1102 goto error_return;
1103
1104 /* Handle unconditional jumps. */
1105 if (rx->cdx == 0)
1106 irel->r_offset -= 2;
1107
1108 /* That will change things, so, we should relax again.
1109 Note that this is not required, and it may be slow. */
1110 *again = TRUE;
1111 }
1112 }
1113 }
1114
1115 if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf)
1116 {
1117 if (!link_info->keep_memory)
1118 free (isymbuf);
1119 else
1120 {
1121 /* Cache the symbols for elf_link_input_bfd. */
1122 symtab_hdr->contents = (unsigned char *) isymbuf;
1123 }
1124 }
1125
1126 if (contents != NULL
1127 && elf_section_data (sec)->this_hdr.contents != contents)
1128 {
1129 if (!link_info->keep_memory)
1130 free (contents);
1131 else
1132 {
1133 /* Cache the section contents for elf_link_input_bfd. */
1134 elf_section_data (sec)->this_hdr.contents = contents;
1135 }
1136 }
1137
1138 if (internal_relocs != NULL
1139 && elf_section_data (sec)->relocs != internal_relocs)
1140 free (internal_relocs);
1141
1142 return TRUE;
1143
1144 error_return:
1145 if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf)
1146 free (isymbuf);
1147 if (contents != NULL
1148 && elf_section_data (sec)->this_hdr.contents != contents)
1149 free (contents);
1150 if (internal_relocs != NULL
1151 && elf_section_data (sec)->relocs != internal_relocs)
1152 free (internal_relocs);
1153
1154 return FALSE;
1155 }
1156
1157
1158 #define ELF_ARCH bfd_arch_msp430
1159 #define ELF_MACHINE_CODE EM_MSP430
1160 #define ELF_MACHINE_ALT1 EM_MSP430_OLD
1161 #define ELF_MAXPAGESIZE 1
1162
1163 #define TARGET_LITTLE_SYM bfd_elf32_msp430_vec
1164 #define TARGET_LITTLE_NAME "elf32-msp430"
1165
1166 #define elf_info_to_howto msp430_info_to_howto_rela
1167 #define elf_info_to_howto_rel NULL
1168 #define elf_backend_relocate_section elf32_msp430_relocate_section
1169 #define elf_backend_gc_mark_hook elf32_msp430_gc_mark_hook
1170 #define elf_backend_gc_sweep_hook elf32_msp430_gc_sweep_hook
1171 #define elf_backend_check_relocs elf32_msp430_check_relocs
1172 #define elf_backend_can_gc_sections 1
1173 #define elf_backend_final_write_processing bfd_elf_msp430_final_write_processing
1174 #define elf_backend_object_p elf32_msp430_object_p
1175 #define elf_backend_post_process_headers elf32_msp430_post_process_headers
1176 #define bfd_elf32_bfd_relax_section msp430_elf_relax_section
1177
1178 #include "elf32-target.h"
This page took 0.123554 seconds and 5 git commands to generate.