]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - bfd/elf32-msp430.c
2005-08-12 Dmitry Diky <diwil@spec.ru>
[thirdparty/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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, 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 {
292 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
293 while (h->root.type == bfd_link_hash_indirect
294 || h->root.type == bfd_link_hash_warning)
295 h = (struct elf_link_hash_entry *) h->root.u.i.link;
296 }
297 }
298
299 return TRUE;
300 }
301
302 /* Perform a single relocation. By default we use the standard BFD
303 routines, but a few relocs, we have to do them ourselves. */
304
305 static bfd_reloc_status_type
306 msp430_final_link_relocate (reloc_howto_type * howto, bfd * input_bfd,
307 asection * input_section, bfd_byte * contents,
308 Elf_Internal_Rela * rel, bfd_vma relocation)
309 {
310 bfd_reloc_status_type r = bfd_reloc_ok;
311 bfd_vma x;
312 bfd_signed_vma srel;
313
314 switch (howto->type)
315 {
316 case R_MSP430_10_PCREL:
317 contents += rel->r_offset;
318 srel = (bfd_signed_vma) relocation;
319 srel += rel->r_addend;
320 srel -= rel->r_offset;
321 srel -= 2; /* Branch instructions add 2 to the PC... */
322 srel -= (input_section->output_section->vma +
323 input_section->output_offset);
324
325 if (srel & 1)
326 return bfd_reloc_outofrange;
327
328 /* MSP430 addresses commands as words. */
329 srel >>= 1;
330
331 /* Check for an overflow. */
332 if (srel < -512 || srel > 511)
333 return bfd_reloc_overflow;
334
335 x = bfd_get_16 (input_bfd, contents);
336 x = (x & 0xfc00) | (srel & 0x3ff);
337 bfd_put_16 (input_bfd, x, contents);
338 break;
339
340 case R_MSP430_2X_PCREL:
341 contents += rel->r_offset;
342 srel = (bfd_signed_vma) relocation;
343 srel += rel->r_addend;
344 srel -= rel->r_offset;
345 srel -= 2; /* Branch instructions add 2 to the PC... */
346 srel -= (input_section->output_section->vma +
347 input_section->output_offset);
348
349 if (srel & 1)
350 return bfd_reloc_outofrange;
351
352 /* MSP430 addresses commands as words. */
353 srel >>= 1;
354
355 /* Check for an overflow. */
356 if (srel < -512 || srel > 511)
357 return bfd_reloc_overflow;
358
359 x = bfd_get_16 (input_bfd, contents);
360 x = (x & 0xfc00) | (srel & 0x3ff);
361 bfd_put_16 (input_bfd, x, contents);
362 /* Handle second jump instruction. */
363 x = bfd_get_16 (input_bfd, contents - 2);
364 srel += 1;
365 x = (x & 0xfc00) | (srel & 0x3ff);
366 bfd_put_16 (input_bfd, x, contents - 2);
367 break;
368
369 case R_MSP430_16_PCREL:
370 case R_MSP430_RL_PCREL:
371 contents += rel->r_offset;
372 srel = (bfd_signed_vma) relocation;
373 srel += rel->r_addend;
374 srel -= rel->r_offset;
375 /* Only branch instructions add 2 to the PC... */
376 srel -= (input_section->output_section->vma +
377 input_section->output_offset);
378
379 if (srel & 1)
380 return bfd_reloc_outofrange;
381
382 bfd_put_16 (input_bfd, srel & 0xffff, contents);
383 break;
384
385 case R_MSP430_16_PCREL_BYTE:
386 contents += rel->r_offset;
387 srel = (bfd_signed_vma) relocation;
388 srel += rel->r_addend;
389 srel -= rel->r_offset;
390 /* Only branch instructions add 2 to the PC... */
391 srel -= (input_section->output_section->vma +
392 input_section->output_offset);
393
394 bfd_put_16 (input_bfd, srel & 0xffff, contents);
395 break;
396
397 case R_MSP430_16_BYTE:
398 contents += rel->r_offset;
399 srel = (bfd_signed_vma) relocation;
400 srel += rel->r_addend;
401 bfd_put_16 (input_bfd, srel & 0xffff, contents);
402 break;
403
404 case R_MSP430_16:
405 contents += rel->r_offset;
406 srel = (bfd_signed_vma) relocation;
407 srel += rel->r_addend;
408
409 if (srel & 1)
410 return bfd_reloc_notsupported;
411
412 bfd_put_16 (input_bfd, srel & 0xffff, contents);
413 break;
414
415 default:
416 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
417 contents, rel->r_offset,
418 relocation, rel->r_addend);
419 }
420
421 return r;
422 }
423
424 /* Relocate an MSP430 ELF section. */
425
426 static bfd_boolean
427 elf32_msp430_relocate_section (bfd * output_bfd ATTRIBUTE_UNUSED,
428 struct bfd_link_info * info,
429 bfd * input_bfd,
430 asection * input_section,
431 bfd_byte * contents,
432 Elf_Internal_Rela * relocs,
433 Elf_Internal_Sym * local_syms,
434 asection ** local_sections)
435 {
436 Elf_Internal_Shdr *symtab_hdr;
437 struct elf_link_hash_entry **sym_hashes;
438 Elf_Internal_Rela *rel;
439 Elf_Internal_Rela *relend;
440
441 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
442 sym_hashes = elf_sym_hashes (input_bfd);
443 relend = relocs + input_section->reloc_count;
444
445 for (rel = relocs; rel < relend; rel++)
446 {
447 reloc_howto_type *howto;
448 unsigned long r_symndx;
449 Elf_Internal_Sym *sym;
450 asection *sec;
451 struct elf_link_hash_entry *h;
452 bfd_vma relocation;
453 bfd_reloc_status_type r;
454 const char *name = NULL;
455 int r_type;
456
457 /* This is a final link. */
458
459 r_type = ELF32_R_TYPE (rel->r_info);
460 r_symndx = ELF32_R_SYM (rel->r_info);
461 howto = elf_msp430_howto_table + ELF32_R_TYPE (rel->r_info);
462 h = NULL;
463 sym = NULL;
464 sec = NULL;
465
466 if (r_symndx < symtab_hdr->sh_info)
467 {
468 sym = local_syms + r_symndx;
469 sec = local_sections[r_symndx];
470 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
471
472 name = bfd_elf_string_from_elf_section
473 (input_bfd, symtab_hdr->sh_link, sym->st_name);
474 name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
475 }
476 else
477 {
478 bfd_boolean unresolved_reloc, warned;
479
480 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
481 r_symndx, symtab_hdr, sym_hashes,
482 h, sec, relocation,
483 unresolved_reloc, warned);
484 }
485
486 r = msp430_final_link_relocate (howto, input_bfd, input_section,
487 contents, rel, relocation);
488
489 if (r != bfd_reloc_ok)
490 {
491 const char *msg = (const char *) NULL;
492
493 switch (r)
494 {
495 case bfd_reloc_overflow:
496 r = info->callbacks->reloc_overflow
497 (info, (h ? &h->root : NULL), name, howto->name,
498 (bfd_vma) 0, input_bfd, input_section,
499 rel->r_offset);
500 break;
501
502 case bfd_reloc_undefined:
503 r = info->callbacks->undefined_symbol
504 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
505 break;
506
507 case bfd_reloc_outofrange:
508 msg = _("internal error: out of range error");
509 break;
510
511 case bfd_reloc_notsupported:
512 msg = _("internal error: unsupported relocation error");
513 break;
514
515 case bfd_reloc_dangerous:
516 msg = _("internal error: dangerous relocation");
517 break;
518
519 default:
520 msg = _("internal error: unknown error");
521 break;
522 }
523
524 if (msg)
525 r = info->callbacks->warning
526 (info, msg, name, input_bfd, input_section, rel->r_offset);
527
528 if (!r)
529 return FALSE;
530 }
531
532 }
533
534 return TRUE;
535 }
536
537 /* The final processing done just before writing out a MSP430 ELF object
538 file. This gets the MSP430 architecture right based on the machine
539 number. */
540
541 static void
542 bfd_elf_msp430_final_write_processing (bfd * abfd,
543 bfd_boolean linker ATTRIBUTE_UNUSED)
544 {
545 unsigned long val;
546
547 switch (bfd_get_mach (abfd))
548 {
549 default:
550 case bfd_mach_msp110:
551 val = E_MSP430_MACH_MSP430x11x1;
552 break;
553
554 case bfd_mach_msp11:
555 val = E_MSP430_MACH_MSP430x11;
556 break;
557
558 case bfd_mach_msp12:
559 val = E_MSP430_MACH_MSP430x12;
560 break;
561
562 case bfd_mach_msp13:
563 val = E_MSP430_MACH_MSP430x13;
564 break;
565
566 case bfd_mach_msp14:
567 val = E_MSP430_MACH_MSP430x14;
568 break;
569
570 case bfd_mach_msp15:
571 val = E_MSP430_MACH_MSP430x15;
572 break;
573
574 case bfd_mach_msp16:
575 val = E_MSP430_MACH_MSP430x16;
576 break;
577
578 case bfd_mach_msp31:
579 val = E_MSP430_MACH_MSP430x31;
580 break;
581
582 case bfd_mach_msp32:
583 val = E_MSP430_MACH_MSP430x32;
584 break;
585
586 case bfd_mach_msp33:
587 val = E_MSP430_MACH_MSP430x33;
588 break;
589
590 case bfd_mach_msp41:
591 val = E_MSP430_MACH_MSP430x41;
592 break;
593
594 case bfd_mach_msp42:
595 val = E_MSP430_MACH_MSP430x42;
596 break;
597
598 case bfd_mach_msp43:
599 val = E_MSP430_MACH_MSP430x43;
600 break;
601
602 case bfd_mach_msp44:
603 val = E_MSP430_MACH_MSP430x44;
604 break;
605 }
606
607 elf_elfheader (abfd)->e_machine = EM_MSP430;
608 elf_elfheader (abfd)->e_flags &= ~EF_MSP430_MACH;
609 elf_elfheader (abfd)->e_flags |= val;
610 }
611
612 /* Set the right machine number. */
613
614 static bfd_boolean
615 elf32_msp430_object_p (bfd * abfd)
616 {
617 int e_set = bfd_mach_msp14;
618
619 if (elf_elfheader (abfd)->e_machine == EM_MSP430
620 || elf_elfheader (abfd)->e_machine == EM_MSP430_OLD)
621 {
622 int e_mach = elf_elfheader (abfd)->e_flags & EF_MSP430_MACH;
623
624 switch (e_mach)
625 {
626 default:
627 case E_MSP430_MACH_MSP430x11:
628 e_set = bfd_mach_msp11;
629 break;
630
631 case E_MSP430_MACH_MSP430x11x1:
632 e_set = bfd_mach_msp110;
633 break;
634
635 case E_MSP430_MACH_MSP430x12:
636 e_set = bfd_mach_msp12;
637 break;
638
639 case E_MSP430_MACH_MSP430x13:
640 e_set = bfd_mach_msp13;
641 break;
642
643 case E_MSP430_MACH_MSP430x14:
644 e_set = bfd_mach_msp14;
645 break;
646
647 case E_MSP430_MACH_MSP430x15:
648 e_set = bfd_mach_msp15;
649 break;
650
651 case E_MSP430_MACH_MSP430x16:
652 e_set = bfd_mach_msp16;
653 break;
654
655 case E_MSP430_MACH_MSP430x31:
656 e_set = bfd_mach_msp31;
657 break;
658
659 case E_MSP430_MACH_MSP430x32:
660 e_set = bfd_mach_msp32;
661 break;
662
663 case E_MSP430_MACH_MSP430x33:
664 e_set = bfd_mach_msp33;
665 break;
666
667 case E_MSP430_MACH_MSP430x41:
668 e_set = bfd_mach_msp41;
669 break;
670
671 case E_MSP430_MACH_MSP430x42:
672 e_set = bfd_mach_msp42;
673 break;
674
675 case E_MSP430_MACH_MSP430x43:
676 e_set = bfd_mach_msp43;
677 break;
678
679 case E_MSP430_MACH_MSP430x44:
680 e_set = bfd_mach_msp44;
681 break;
682 }
683 }
684
685 return bfd_default_set_arch_mach (abfd, bfd_arch_msp430, e_set);
686 }
687
688 static void
689 elf32_msp430_post_process_headers (bfd * abfd,
690 struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
691 {
692 Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form. */
693
694 i_ehdrp = elf_elfheader (abfd);
695
696 #ifndef ELFOSABI_STANDALONE
697 #define ELFOSABI_STANDALONE 255
698 #endif
699
700 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_STANDALONE;
701 }
702
703 /* These functions handle relaxing for the msp430.
704 Relaxation required only in two cases:
705 - Bad hand coding like jumps from one section to another or
706 from file to file.
707 - Sibling calls. This will affect onlu 'jump label' polymorph. Without
708 relaxing this enlarges code by 2 bytes. Sibcalls implemented but
709 do not work in gcc's port by the reason I do not know.
710 Anyway, if a relaxation required, user should pass -relax option to the
711 linker.
712
713 There are quite a few relaxing opportunities available on the msp430:
714
715 ================================================================
716
717 1. 3 words -> 1 word
718
719 eq == jeq label jne +4; br lab
720 ne != jne label jeq +4; br lab
721 lt < jl label jge +4; br lab
722 ltu < jlo label lhs +4; br lab
723 ge >= jge label jl +4; br lab
724 geu >= jhs label jlo +4; br lab
725
726 2. 4 words -> 1 word
727
728 ltn < jn jn +2; jmp +4; br lab
729
730 3. 4 words -> 2 words
731
732 gt > jeq +2; jge label jeq +6; jl +4; br label
733 gtu > jeq +2; jhs label jeq +6; jlo +4; br label
734
735 4. 4 words -> 2 words and 2 labels
736
737 leu <= jeq label; jlo label jeq +2; jhs +4; br label
738 le <= jeq label; jl label jeq +2; jge +4; br label
739 =================================================================
740
741 codemap for first cases is (labels masked ):
742 eq: 0x2002,0x4010,0x0000 -> 0x2400
743 ne: 0x2402,0x4010,0x0000 -> 0x2000
744 lt: 0x3402,0x4010,0x0000 -> 0x3800
745 ltu: 0x2c02,0x4010,0x0000 -> 0x2800
746 ge: 0x3802,0x4010,0x0000 -> 0x3400
747 geu: 0x2802,0x4010,0x0000 -> 0x2c00
748
749 second case:
750 ltn: 0x3001,0x3c02,0x4010,0x0000 -> 0x3000
751
752 third case:
753 gt: 0x2403,0x3802,0x4010,0x0000 -> 0x2401,0x3400
754 gtu: 0x2403,0x2802,0x4010,0x0000 -> 0x2401,0x2c00
755
756 fourth case:
757 leu: 0x2401,0x2c02,0x4010,0x0000 -> 0x2400,0x2800
758 le: 0x2401,0x3402,0x4010,0x0000 -> 0x2400,0x3800
759
760 Unspecified case :)
761 jump: 0x4010,0x0000 -> 0x3c00. */
762
763 #define NUMB_RELAX_CODES 12
764 static struct rcodes_s
765 {
766 int f0, f1; /* From code. */
767 int t0, t1; /* To code. */
768 int labels; /* Position of labels: 1 - one label at first
769 word, 2 - one at second word, 3 - two
770 labels at both. */
771 int cdx; /* Words to match. */
772 int bs; /* Shrink bytes. */
773 int off; /* Offset from old label for new code. */
774 int ncl; /* New code length. */
775 } rcode[] =
776 {/* lab,cdx,bs,off,ncl */
777 { 0x0000, 0x0000, 0x3c00, 0x0000, 1, 0, 2, 2, 2}, /* jump */
778 { 0x0000, 0x2002, 0x2400, 0x0000, 1, 1, 4, 4, 2}, /* eq */
779 { 0x0000, 0x2402, 0x2000, 0x0000, 1, 1, 4, 4, 2}, /* ne */
780 { 0x0000, 0x3402, 0x3800, 0x0000, 1, 1, 4, 4, 2}, /* lt */
781 { 0x0000, 0x2c02, 0x2800, 0x0000, 1, 1, 4, 4, 2}, /* ltu */
782 { 0x0000, 0x3802, 0x3400, 0x0000, 1, 1, 4, 4, 2}, /* ge */
783 { 0x0000, 0x2802, 0x2c00, 0x0000, 1, 1, 4, 4, 2}, /* geu */
784 { 0x3001, 0x3c02, 0x3000, 0x0000, 1, 2, 6, 6, 2}, /* ltn */
785 { 0x2403, 0x3802, 0x2401, 0x3400, 2, 2, 4, 6, 4}, /* gt */
786 { 0x2403, 0x2802, 0x2401, 0x2c00, 2, 2, 4, 6, 4}, /* gtu */
787 { 0x2401, 0x2c02, 0x2400, 0x2800, 3, 2, 4, 6, 4}, /* leu , 2 labels */
788 { 0x2401, 0x2c02, 0x2400, 0x2800, 3, 2, 4, 6, 4}, /* le , 2 labels */
789 { 0, 0, 0, 0, 0, 0, 0, 0, 0}
790 };
791
792 /* Return TRUE if a symbol exists at the given address. */
793
794 static bfd_boolean
795 msp430_elf_symbol_address_p (bfd * abfd,
796 asection * sec,
797 Elf_Internal_Sym * isym,
798 bfd_vma addr)
799 {
800 Elf_Internal_Shdr *symtab_hdr;
801 unsigned int sec_shndx;
802 Elf_Internal_Sym *isymend;
803 struct elf_link_hash_entry **sym_hashes;
804 struct elf_link_hash_entry **end_hashes;
805 unsigned int symcount;
806
807 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
808
809 /* Examine all the local symbols. */
810 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
811 for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
812 if (isym->st_shndx == sec_shndx && isym->st_value == addr)
813 return TRUE;
814
815 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
816 - symtab_hdr->sh_info);
817 sym_hashes = elf_sym_hashes (abfd);
818 end_hashes = sym_hashes + symcount;
819 for (; sym_hashes < end_hashes; sym_hashes++)
820 {
821 struct elf_link_hash_entry *sym_hash = *sym_hashes;
822
823 if ((sym_hash->root.type == bfd_link_hash_defined
824 || sym_hash->root.type == bfd_link_hash_defweak)
825 && sym_hash->root.u.def.section == sec
826 && sym_hash->root.u.def.value == addr)
827 return TRUE;
828 }
829
830 return FALSE;
831 }
832
833 /* Delete some bytes from a section while relaxing. */
834
835 static bfd_boolean
836 msp430_elf_relax_delete_bytes (bfd * abfd, asection * sec, bfd_vma addr,
837 int count)
838 {
839 Elf_Internal_Shdr *symtab_hdr;
840 unsigned int sec_shndx;
841 bfd_byte *contents;
842 Elf_Internal_Rela *irel;
843 Elf_Internal_Rela *irelend;
844 Elf_Internal_Rela *irelalign;
845 bfd_vma toaddr;
846 Elf_Internal_Sym *isym;
847 Elf_Internal_Sym *isymend;
848 struct elf_link_hash_entry **sym_hashes;
849 struct elf_link_hash_entry **end_hashes;
850 unsigned int symcount;
851
852 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
853
854 contents = elf_section_data (sec)->this_hdr.contents;
855
856 /* The deletion must stop at the next ALIGN reloc for an aligment
857 power larger than the number of bytes we are deleting. */
858
859 irelalign = NULL;
860 toaddr = sec->size;
861
862 irel = elf_section_data (sec)->relocs;
863 irelend = irel + sec->reloc_count;
864
865 /* Actually delete the bytes. */
866 memmove (contents + addr, contents + addr + count,
867 (size_t) (toaddr - addr - count));
868 sec->size -= count;
869
870 /* Adjust all the relocs. */
871 symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
872 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
873 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
874 {
875 int sidx = ELF32_R_SYM(irel->r_info);
876 Elf_Internal_Sym *lsym = isym + sidx;
877
878 /* Get the new reloc address. */
879 if ((irel->r_offset > addr && irel->r_offset < toaddr))
880 irel->r_offset -= count;
881
882 /* Adjust symbols referenced by .sec+0xXX */
883 if (irel->r_addend > addr && irel->r_addend < toaddr
884 && lsym->st_shndx == sec_shndx)
885 irel->r_addend -= count;
886 }
887
888 /* Adjust the local symbols defined in this section. */
889 symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
890 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
891 for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
892 if (isym->st_shndx == sec_shndx
893 && isym->st_value > addr && isym->st_value < toaddr)
894 isym->st_value -= count;
895
896 /* Now adjust the global symbols defined in this section. */
897 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
898 - symtab_hdr->sh_info);
899 sym_hashes = elf_sym_hashes (abfd);
900 end_hashes = sym_hashes + symcount;
901 for (; sym_hashes < end_hashes; sym_hashes++)
902 {
903 struct elf_link_hash_entry *sym_hash = *sym_hashes;
904
905 if ((sym_hash->root.type == bfd_link_hash_defined
906 || sym_hash->root.type == bfd_link_hash_defweak)
907 && sym_hash->root.u.def.section == sec
908 && sym_hash->root.u.def.value > addr
909 && sym_hash->root.u.def.value < toaddr)
910 sym_hash->root.u.def.value -= count;
911 }
912
913 return TRUE;
914 }
915
916
917 static bfd_boolean
918 msp430_elf_relax_section (bfd * abfd, asection * sec,
919 struct bfd_link_info * link_info,
920 bfd_boolean * again)
921 {
922 Elf_Internal_Shdr * symtab_hdr;
923 Elf_Internal_Rela * internal_relocs;
924 Elf_Internal_Rela * irel;
925 Elf_Internal_Rela * irelend;
926 bfd_byte * contents = NULL;
927 Elf_Internal_Sym * isymbuf = NULL;
928
929 /* Assume nothing changes. */
930 *again = FALSE;
931
932 /* We don't have to do anything for a relocatable link, if
933 this section does not have relocs, or if this is not a
934 code section. */
935 if (link_info->relocatable
936 || (sec->flags & SEC_RELOC) == 0
937 || sec->reloc_count == 0 || (sec->flags & SEC_CODE) == 0)
938 return TRUE;
939
940 symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
941
942 /* Get a copy of the native relocations. */
943 internal_relocs =
944 _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, link_info->keep_memory);
945 if (internal_relocs == NULL)
946 goto error_return;
947
948 /* Walk through them looking for relaxing opportunities. */
949 irelend = internal_relocs + sec->reloc_count;
950 for (irel = internal_relocs; irel < irelend; irel++)
951 {
952 bfd_vma symval;
953
954 /* If this isn't something that can be relaxed, then ignore
955 this reloc. */
956 if (ELF32_R_TYPE (irel->r_info) != (int) R_MSP430_RL_PCREL)
957 continue;
958
959 /* Get the section contents if we haven't done so already. */
960 if (contents == NULL)
961 {
962 /* Get cached copy if it exists. */
963 if (elf_section_data (sec)->this_hdr.contents != NULL)
964 contents = elf_section_data (sec)->this_hdr.contents;
965 else if (! bfd_malloc_and_get_section (abfd, sec, &contents))
966 goto error_return;
967 }
968
969 /* Read this BFD's local symbols if we haven't done so already. */
970 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
971 {
972 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
973 if (isymbuf == NULL)
974 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
975 symtab_hdr->sh_info, 0,
976 NULL, NULL, NULL);
977 if (isymbuf == NULL)
978 goto error_return;
979 }
980
981 /* Get the value of the symbol referred to by the reloc. */
982 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
983 {
984 /* A local symbol. */
985 Elf_Internal_Sym *isym;
986 asection *sym_sec;
987
988 isym = isymbuf + ELF32_R_SYM (irel->r_info);
989 if (isym->st_shndx == SHN_UNDEF)
990 sym_sec = bfd_und_section_ptr;
991 else if (isym->st_shndx == SHN_ABS)
992 sym_sec = bfd_abs_section_ptr;
993 else if (isym->st_shndx == SHN_COMMON)
994 sym_sec = bfd_com_section_ptr;
995 else
996 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
997 symval = (isym->st_value
998 + sym_sec->output_section->vma + sym_sec->output_offset);
999 }
1000 else
1001 {
1002 unsigned long indx;
1003 struct elf_link_hash_entry *h;
1004
1005 /* An external symbol. */
1006 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
1007 h = elf_sym_hashes (abfd)[indx];
1008 BFD_ASSERT (h != NULL);
1009
1010 if (h->root.type != bfd_link_hash_defined
1011 && h->root.type != bfd_link_hash_defweak)
1012 /* This appears to be a reference to an undefined
1013 symbol. Just ignore it--it will be caught by the
1014 regular reloc processing. */
1015 continue;
1016
1017 symval = (h->root.u.def.value
1018 + h->root.u.def.section->output_section->vma
1019 + h->root.u.def.section->output_offset);
1020 }
1021
1022 /* For simplicity of coding, we are going to modify the section
1023 contents, the section relocs, and the BFD symbol table. We
1024 must tell the rest of the code not to free up this
1025 information. It would be possible to instead create a table
1026 of changes which have to be made, as is done in coff-mips.c;
1027 that would be more work, but would require less memory when
1028 the linker is run. */
1029
1030 /* Try to turn a 16bit pc-relative branch into a 10bit pc-relative
1031 branch. */
1032 /* Paranoia? paranoia... */
1033 if (ELF32_R_TYPE (irel->r_info) == (int) R_MSP430_RL_PCREL)
1034 {
1035 bfd_vma value = symval;
1036
1037 /* Deal with pc-relative gunk. */
1038 value -= (sec->output_section->vma + sec->output_offset);
1039 value -= irel->r_offset;
1040 value += irel->r_addend;
1041
1042 /* See if the value will fit in 10 bits, note the high value is
1043 1016 as the target will be two bytes closer if we are
1044 able to relax. */
1045 if ((long) value < 1016 && (long) value > -1016)
1046 {
1047 int code0 = 0, code1 = 0, code2 = 0;
1048 int i;
1049 struct rcodes_s *rx;
1050
1051 /* Get the opcode. */
1052 if (irel->r_offset >= 6)
1053 code0 = bfd_get_16 (abfd, contents + irel->r_offset - 6);
1054
1055 if (irel->r_offset >= 4)
1056 code1 = bfd_get_16 (abfd, contents + irel->r_offset - 4);
1057
1058 code2 = bfd_get_16 (abfd, contents + irel->r_offset - 2);
1059
1060 if (code2 != 0x4010)
1061 continue;
1062
1063 /* Check r4 and r3. */
1064 for (i = NUMB_RELAX_CODES - 1; i >= 0; i--)
1065 {
1066 rx = &rcode[i];
1067 if (rx->cdx == 2 && rx->f0 == code0 && rx->f1 == code1)
1068 break;
1069 else if (rx->cdx == 1 && rx->f1 == code1)
1070 break;
1071 else if (rx->cdx == 0) /* This is an unconditional jump. */
1072 break;
1073 }
1074
1075 /* Check labels:
1076 .Label0: ; we do not care about this label
1077 jeq +6
1078 .Label1: ; make sure there is no label here
1079 jl +4
1080 .Label2: ; make sure there is no label here
1081 br .Label_dst
1082
1083 So, if there is .Label1 or .Label2 we cannot relax this code.
1084 This actually should not happen, cause for relaxable
1085 instructions we use RL_PCREL reloc instead of 16_PCREL.
1086 Will change this in the future. */
1087
1088 if (rx->cdx > 0
1089 && msp430_elf_symbol_address_p (abfd, sec, isymbuf,
1090 irel->r_offset - 2))
1091 continue;
1092 if (rx->cdx > 1
1093 && msp430_elf_symbol_address_p (abfd, sec, isymbuf,
1094 irel->r_offset - 4))
1095 continue;
1096
1097 /* Note that we've changed the relocs, section contents, etc. */
1098 elf_section_data (sec)->relocs = internal_relocs;
1099 elf_section_data (sec)->this_hdr.contents = contents;
1100 symtab_hdr->contents = (unsigned char *) isymbuf;
1101
1102 /* Fix the relocation's type. */
1103 if (rx->labels == 3) /* Handle special cases. */
1104 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1105 R_MSP430_2X_PCREL);
1106 else
1107 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1108 R_MSP430_10_PCREL);
1109
1110 /* Fix the opcode right way. */
1111 bfd_put_16 (abfd, rx->t0, contents + irel->r_offset - rx->off);
1112 if (rx->t1)
1113 bfd_put_16 (abfd, rx->t1,
1114 contents + irel->r_offset - rx->off + 2);
1115
1116 /* Delete bytes. */
1117 if (!msp430_elf_relax_delete_bytes (abfd, sec,
1118 irel->r_offset - rx->off +
1119 rx->ncl, rx->bs))
1120 goto error_return;
1121
1122 /* Handle unconditional jumps. */
1123 if (rx->cdx == 0)
1124 irel->r_offset -= 2;
1125
1126 /* That will change things, so, we should relax again.
1127 Note that this is not required, and it may be slow. */
1128 *again = TRUE;
1129 }
1130 }
1131 }
1132
1133 if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf)
1134 {
1135 if (!link_info->keep_memory)
1136 free (isymbuf);
1137 else
1138 {
1139 /* Cache the symbols for elf_link_input_bfd. */
1140 symtab_hdr->contents = (unsigned char *) isymbuf;
1141 }
1142 }
1143
1144 if (contents != NULL
1145 && elf_section_data (sec)->this_hdr.contents != contents)
1146 {
1147 if (!link_info->keep_memory)
1148 free (contents);
1149 else
1150 {
1151 /* Cache the section contents for elf_link_input_bfd. */
1152 elf_section_data (sec)->this_hdr.contents = contents;
1153 }
1154 }
1155
1156 if (internal_relocs != NULL
1157 && elf_section_data (sec)->relocs != internal_relocs)
1158 free (internal_relocs);
1159
1160 return TRUE;
1161
1162 error_return:
1163 if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf)
1164 free (isymbuf);
1165 if (contents != NULL
1166 && elf_section_data (sec)->this_hdr.contents != contents)
1167 free (contents);
1168 if (internal_relocs != NULL
1169 && elf_section_data (sec)->relocs != internal_relocs)
1170 free (internal_relocs);
1171
1172 return FALSE;
1173 }
1174
1175
1176 #define ELF_ARCH bfd_arch_msp430
1177 #define ELF_MACHINE_CODE EM_MSP430
1178 #define ELF_MACHINE_ALT1 EM_MSP430_OLD
1179 #define ELF_MAXPAGESIZE 1
1180
1181 #define TARGET_LITTLE_SYM bfd_elf32_msp430_vec
1182 #define TARGET_LITTLE_NAME "elf32-msp430"
1183
1184 #define elf_info_to_howto msp430_info_to_howto_rela
1185 #define elf_info_to_howto_rel NULL
1186 #define elf_backend_relocate_section elf32_msp430_relocate_section
1187 #define elf_backend_gc_mark_hook elf32_msp430_gc_mark_hook
1188 #define elf_backend_gc_sweep_hook elf32_msp430_gc_sweep_hook
1189 #define elf_backend_check_relocs elf32_msp430_check_relocs
1190 #define elf_backend_can_gc_sections 1
1191 #define elf_backend_final_write_processing bfd_elf_msp430_final_write_processing
1192 #define elf_backend_object_p elf32_msp430_object_p
1193 #define elf_backend_post_process_headers elf32_msp430_post_process_headers
1194 #define bfd_elf32_bfd_relax_section msp430_elf_relax_section
1195
1196 #include "elf32-target.h"