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>
5 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
23 #include "libiberty.h"
26 #include "elf/msp430.h"
28 /* Use RELA instead of REL. */
31 static reloc_howto_type elf_msp430_howto_table
[] =
33 HOWTO (R_MSP430_NONE
, /* type */
35 2, /* size (0 = byte, 1 = short, 2 = long) */
37 FALSE
, /* pc_relative */
39 complain_overflow_bitfield
,/* complain_on_overflow */
40 bfd_elf_generic_reloc
, /* special_function */
41 "R_MSP430_NONE", /* name */
42 FALSE
, /* partial_inplace */
45 FALSE
), /* pcrel_offset */
47 HOWTO (R_MSP430_32
, /* type */
49 2, /* size (0 = byte, 1 = short, 2 = long) */
51 FALSE
, /* pc_relative */
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 */
61 /* A 13 bit PC relative relocation. */
62 HOWTO (R_MSP430_10_PCREL
, /* type */
64 1, /* size (0 = byte, 1 = short, 2 = long) */
66 TRUE
, /* pc_relative */
68 complain_overflow_bitfield
,/* complain_on_overflow */
69 bfd_elf_generic_reloc
, /* special_function */
70 "R_MSP430_13_PCREL", /* name */
71 FALSE
, /* partial_inplace */
74 TRUE
), /* pcrel_offset */
76 /* A 16 bit absolute relocation. */
77 HOWTO (R_MSP430_16
, /* type */
79 1, /* size (0 = byte, 1 = short, 2 = long) */
81 FALSE
, /* pc_relative */
83 complain_overflow_dont
,/* complain_on_overflow */
84 bfd_elf_generic_reloc
, /* special_function */
85 "R_MSP430_16", /* name */
86 FALSE
, /* partial_inplace */
88 0xffff, /* dst_mask */
89 FALSE
), /* pcrel_offset */
91 /* A 16 bit absolute relocation for command address. */
92 HOWTO (R_MSP430_16_PCREL
, /* type */
94 1, /* size (0 = byte, 1 = short, 2 = long) */
96 TRUE
, /* pc_relative */
98 complain_overflow_dont
,/* complain_on_overflow */
99 bfd_elf_generic_reloc
, /* special_function */
100 "R_MSP430_16_PCREL", /* name */
101 FALSE
, /* partial_inplace */
103 0xffff, /* dst_mask */
104 TRUE
), /* pcrel_offset */
106 /* A 16 bit absolute relocation, byte operations. */
107 HOWTO (R_MSP430_16_BYTE
, /* type */
109 1, /* size (0 = byte, 1 = short, 2 = long) */
111 FALSE
, /* pc_relative */
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 */
121 /* A 16 bit absolute relocation for command address. */
122 HOWTO (R_MSP430_16_PCREL_BYTE
,/* type */
124 1, /* size (0 = byte, 1 = short, 2 = long) */
126 TRUE
, /* pc_relative */
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 */
136 /* A 13 bit PC relative relocation for complicated polymorphs. */
137 HOWTO (R_MSP430_2X_PCREL
, /* type */
139 2, /* size (0 = byte, 1 = short, 2 = long) */
141 TRUE
, /* pc_relative */
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 */
151 /* A 16 bit relaxable relocation for command address. */
152 HOWTO (R_MSP430_RL_PCREL
, /* type */
154 1, /* size (0 = byte, 1 = short, 2 = long) */
156 TRUE
, /* pc_relative */
158 complain_overflow_dont
,/* complain_on_overflow */
159 bfd_elf_generic_reloc
, /* special_function */
160 "R_MSP430_RL_PCREL", /* name */
161 FALSE
, /* partial_inplace */
163 0xffff, /* dst_mask */
164 TRUE
) /* pcrel_offset */
167 /* Map BFD reloc types to MSP430 ELF reloc types. */
169 struct msp430_reloc_map
171 bfd_reloc_code_real_type bfd_reloc_val
;
172 unsigned int elf_reloc_val
;
175 static const struct msp430_reloc_map msp430_reloc_map
[] =
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
}
189 static reloc_howto_type
*
190 bfd_elf32_bfd_reloc_type_lookup (bfd
* abfd ATTRIBUTE_UNUSED
,
191 bfd_reloc_code_real_type code
)
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
];
202 /* Set the howto pointer for an MSP430 ELF reloc. */
205 msp430_info_to_howto_rela (bfd
* abfd ATTRIBUTE_UNUSED
,
207 Elf_Internal_Rela
* dst
)
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
];
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
)
225 switch (ELF32_R_TYPE (rel
->r_info
))
228 switch (h
->root
.type
)
230 case bfd_link_hash_defined
:
231 case bfd_link_hash_defweak
:
232 return h
->root
.u
.def
.section
;
234 case bfd_link_hash_common
:
235 return h
->root
.u
.c
.p
->section
;
243 return bfd_section_from_elf_index (sec
->owner
, sym
->st_shndx
);
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
)
254 /* We don't use got and plt entries for msp430. */
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. */
263 elf32_msp430_check_relocs (bfd
* abfd
, struct bfd_link_info
* info
,
264 asection
* sec
, const Elf_Internal_Rela
* relocs
)
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
;
271 if (info
->relocatable
)
274 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
275 sym_hashes
= elf_sym_hashes (abfd
);
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
;
281 rel_end
= relocs
+ sec
->reloc_count
;
282 for (rel
= relocs
; rel
< rel_end
; rel
++)
284 struct elf_link_hash_entry
*h
;
285 unsigned long r_symndx
;
287 r_symndx
= ELF32_R_SYM (rel
->r_info
);
288 if (r_symndx
< symtab_hdr
->sh_info
)
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
;
302 /* Perform a single relocation. By default we use the standard BFD
303 routines, but a few relocs, we have to do them ourselves. */
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
)
310 bfd_reloc_status_type r
= bfd_reloc_ok
;
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
);
326 return bfd_reloc_outofrange
;
328 /* MSP430 addresses commands as words. */
331 /* Check for an overflow. */
332 if (srel
< -512 || srel
> 511)
333 return bfd_reloc_overflow
;
335 x
= bfd_get_16 (input_bfd
, contents
);
336 x
= (x
& 0xfc00) | (srel
& 0x3ff);
337 bfd_put_16 (input_bfd
, x
, contents
);
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
);
350 return bfd_reloc_outofrange
;
352 /* MSP430 addresses commands as words. */
355 /* Check for an overflow. */
356 if (srel
< -512 || srel
> 511)
357 return bfd_reloc_overflow
;
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);
365 x
= (x
& 0xfc00) | (srel
& 0x3ff);
366 bfd_put_16 (input_bfd
, x
, contents
- 2);
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
);
380 return bfd_reloc_outofrange
;
382 bfd_put_16 (input_bfd
, srel
& 0xffff, contents
);
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
);
394 bfd_put_16 (input_bfd
, srel
& 0xffff, contents
);
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
);
405 contents
+= rel
->r_offset
;
406 srel
= (bfd_signed_vma
) relocation
;
407 srel
+= rel
->r_addend
;
410 return bfd_reloc_notsupported
;
412 bfd_put_16 (input_bfd
, srel
& 0xffff, contents
);
416 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
417 contents
, rel
->r_offset
,
418 relocation
, rel
->r_addend
);
424 /* Relocate an MSP430 ELF section. */
427 elf32_msp430_relocate_section (bfd
* output_bfd ATTRIBUTE_UNUSED
,
428 struct bfd_link_info
* info
,
430 asection
* input_section
,
432 Elf_Internal_Rela
* relocs
,
433 Elf_Internal_Sym
* local_syms
,
434 asection
** local_sections
)
436 Elf_Internal_Shdr
*symtab_hdr
;
437 struct elf_link_hash_entry
**sym_hashes
;
438 Elf_Internal_Rela
*rel
;
439 Elf_Internal_Rela
*relend
;
441 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
442 sym_hashes
= elf_sym_hashes (input_bfd
);
443 relend
= relocs
+ input_section
->reloc_count
;
445 for (rel
= relocs
; rel
< relend
; rel
++)
447 reloc_howto_type
*howto
;
448 unsigned long r_symndx
;
449 Elf_Internal_Sym
*sym
;
451 struct elf_link_hash_entry
*h
;
453 bfd_reloc_status_type r
;
454 const char *name
= NULL
;
457 /* This is a final link. */
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
);
466 if (r_symndx
< symtab_hdr
->sh_info
)
468 sym
= local_syms
+ r_symndx
;
469 sec
= local_sections
[r_symndx
];
470 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
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
;
478 bfd_boolean unresolved_reloc
, warned
;
480 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
481 r_symndx
, symtab_hdr
, sym_hashes
,
483 unresolved_reloc
, warned
);
486 r
= msp430_final_link_relocate (howto
, input_bfd
, input_section
,
487 contents
, rel
, relocation
);
489 if (r
!= bfd_reloc_ok
)
491 const char *msg
= (const char *) NULL
;
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
,
502 case bfd_reloc_undefined
:
503 r
= info
->callbacks
->undefined_symbol
504 (info
, name
, input_bfd
, input_section
, rel
->r_offset
, TRUE
);
507 case bfd_reloc_outofrange
:
508 msg
= _("internal error: out of range error");
511 case bfd_reloc_notsupported
:
512 msg
= _("internal error: unsupported relocation error");
515 case bfd_reloc_dangerous
:
516 msg
= _("internal error: dangerous relocation");
520 msg
= _("internal error: unknown error");
525 r
= info
->callbacks
->warning
526 (info
, msg
, name
, input_bfd
, input_section
, rel
->r_offset
);
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
542 bfd_elf_msp430_final_write_processing (bfd
* abfd
,
543 bfd_boolean linker ATTRIBUTE_UNUSED
)
547 switch (bfd_get_mach (abfd
))
550 case bfd_mach_msp110
:
551 val
= E_MSP430_MACH_MSP430x11x1
;
555 val
= E_MSP430_MACH_MSP430x11
;
559 val
= E_MSP430_MACH_MSP430x12
;
563 val
= E_MSP430_MACH_MSP430x13
;
567 val
= E_MSP430_MACH_MSP430x14
;
571 val
= E_MSP430_MACH_MSP430x15
;
575 val
= E_MSP430_MACH_MSP430x16
;
579 val
= E_MSP430_MACH_MSP430x31
;
583 val
= E_MSP430_MACH_MSP430x32
;
587 val
= E_MSP430_MACH_MSP430x33
;
591 val
= E_MSP430_MACH_MSP430x41
;
595 val
= E_MSP430_MACH_MSP430x42
;
599 val
= E_MSP430_MACH_MSP430x43
;
603 val
= E_MSP430_MACH_MSP430x44
;
607 elf_elfheader (abfd
)->e_machine
= EM_MSP430
;
608 elf_elfheader (abfd
)->e_flags
&= ~EF_MSP430_MACH
;
609 elf_elfheader (abfd
)->e_flags
|= val
;
612 /* Set the right machine number. */
615 elf32_msp430_object_p (bfd
* abfd
)
617 int e_set
= bfd_mach_msp14
;
619 if (elf_elfheader (abfd
)->e_machine
== EM_MSP430
620 || elf_elfheader (abfd
)->e_machine
== EM_MSP430_OLD
)
622 int e_mach
= elf_elfheader (abfd
)->e_flags
& EF_MSP430_MACH
;
627 case E_MSP430_MACH_MSP430x11
:
628 e_set
= bfd_mach_msp11
;
631 case E_MSP430_MACH_MSP430x11x1
:
632 e_set
= bfd_mach_msp110
;
635 case E_MSP430_MACH_MSP430x12
:
636 e_set
= bfd_mach_msp12
;
639 case E_MSP430_MACH_MSP430x13
:
640 e_set
= bfd_mach_msp13
;
643 case E_MSP430_MACH_MSP430x14
:
644 e_set
= bfd_mach_msp14
;
647 case E_MSP430_MACH_MSP430x15
:
648 e_set
= bfd_mach_msp15
;
651 case E_MSP430_MACH_MSP430x16
:
652 e_set
= bfd_mach_msp16
;
655 case E_MSP430_MACH_MSP430x31
:
656 e_set
= bfd_mach_msp31
;
659 case E_MSP430_MACH_MSP430x32
:
660 e_set
= bfd_mach_msp32
;
663 case E_MSP430_MACH_MSP430x33
:
664 e_set
= bfd_mach_msp33
;
667 case E_MSP430_MACH_MSP430x41
:
668 e_set
= bfd_mach_msp41
;
671 case E_MSP430_MACH_MSP430x42
:
672 e_set
= bfd_mach_msp42
;
675 case E_MSP430_MACH_MSP430x43
:
676 e_set
= bfd_mach_msp43
;
679 case E_MSP430_MACH_MSP430x44
:
680 e_set
= bfd_mach_msp44
;
685 return bfd_default_set_arch_mach (abfd
, bfd_arch_msp430
, e_set
);
689 elf32_msp430_post_process_headers (bfd
* abfd
,
690 struct bfd_link_info
* link_info ATTRIBUTE_UNUSED
)
692 Elf_Internal_Ehdr
* i_ehdrp
; /* ELF file header, internal form. */
694 i_ehdrp
= elf_elfheader (abfd
);
696 #ifndef ELFOSABI_STANDALONE
697 #define ELFOSABI_STANDALONE 255
700 i_ehdrp
->e_ident
[EI_OSABI
] = ELFOSABI_STANDALONE
;
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
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
713 There are quite a few relaxing opportunities available on the msp430:
715 ================================================================
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
728 ltn < jn jn +2; jmp +4; br lab
730 3. 4 words -> 2 words
732 gt > jeq +2; jge label jeq +6; jl +4; br label
733 gtu > jeq +2; jhs label jeq +6; jlo +4; br label
735 4. 4 words -> 2 words and 2 labels
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 =================================================================
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
750 ltn: 0x3001,0x3c02,0x4010,0x0000 -> 0x3000
753 gt: 0x2403,0x3802,0x4010,0x0000 -> 0x2401,0x3400
754 gtu: 0x2403,0x2802,0x4010,0x0000 -> 0x2401,0x2c00
757 leu: 0x2401,0x2c02,0x4010,0x0000 -> 0x2400,0x2800
758 le: 0x2401,0x3402,0x4010,0x0000 -> 0x2400,0x3800
761 jump: 0x4010,0x0000 -> 0x3c00. */
763 #define NUMB_RELAX_CODES 12
764 static struct rcodes_s
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
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. */
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}
792 /* Return TRUE if a symbol exists at the given address. */
795 msp430_elf_symbol_address_p (bfd
* abfd
,
797 Elf_Internal_Sym
* isym
,
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
;
807 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
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
)
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
++)
821 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
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
)
833 /* Delete some bytes from a section while relaxing. */
836 msp430_elf_relax_delete_bytes (bfd
* abfd
, asection
* sec
, bfd_vma addr
,
839 Elf_Internal_Shdr
*symtab_hdr
;
840 unsigned int sec_shndx
;
842 Elf_Internal_Rela
*irel
;
843 Elf_Internal_Rela
*irelend
;
844 Elf_Internal_Rela
*irelalign
;
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
;
852 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
854 contents
= elf_section_data (sec
)->this_hdr
.contents
;
856 /* The deletion must stop at the next ALIGN reloc for an aligment
857 power larger than the number of bytes we are deleting. */
862 irel
= elf_section_data (sec
)->relocs
;
863 irelend
= irel
+ sec
->reloc_count
;
865 /* Actually delete the bytes. */
866 memmove (contents
+ addr
, contents
+ addr
+ count
,
867 (size_t) (toaddr
- addr
- count
));
870 /* Adjust all the relocs. */
871 for (irel
= elf_section_data (sec
)->relocs
; irel
< irelend
; irel
++)
872 /* Get the new reloc address. */
873 if ((irel
->r_offset
> addr
&& irel
->r_offset
< toaddr
))
874 irel
->r_offset
-= count
;
876 /* Adjust the local symbols defined in this section. */
877 symtab_hdr
= & elf_tdata (abfd
)->symtab_hdr
;
878 isym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
879 for (isymend
= isym
+ symtab_hdr
->sh_info
; isym
< isymend
; isym
++)
880 if (isym
->st_shndx
== sec_shndx
881 && isym
->st_value
> addr
&& isym
->st_value
< toaddr
)
882 isym
->st_value
-= count
;
884 /* Now adjust the global symbols defined in this section. */
885 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
886 - symtab_hdr
->sh_info
);
887 sym_hashes
= elf_sym_hashes (abfd
);
888 end_hashes
= sym_hashes
+ symcount
;
889 for (; sym_hashes
< end_hashes
; sym_hashes
++)
891 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
893 if ((sym_hash
->root
.type
== bfd_link_hash_defined
894 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
895 && sym_hash
->root
.u
.def
.section
== sec
896 && sym_hash
->root
.u
.def
.value
> addr
897 && sym_hash
->root
.u
.def
.value
< toaddr
)
898 sym_hash
->root
.u
.def
.value
-= count
;
906 msp430_elf_relax_section (bfd
* abfd
, asection
* sec
,
907 struct bfd_link_info
* link_info
,
910 Elf_Internal_Shdr
* symtab_hdr
;
911 Elf_Internal_Rela
* internal_relocs
;
912 Elf_Internal_Rela
* irel
;
913 Elf_Internal_Rela
* irelend
;
914 bfd_byte
* contents
= NULL
;
915 Elf_Internal_Sym
* isymbuf
= NULL
;
917 /* Assume nothing changes. */
920 /* We don't have to do anything for a relocatable link, if
921 this section does not have relocs, or if this is not a
923 if (link_info
->relocatable
924 || (sec
->flags
& SEC_RELOC
) == 0
925 || sec
->reloc_count
== 0 || (sec
->flags
& SEC_CODE
) == 0)
928 symtab_hdr
= & elf_tdata (abfd
)->symtab_hdr
;
930 /* Get a copy of the native relocations. */
932 _bfd_elf_link_read_relocs (abfd
, sec
, NULL
, NULL
, link_info
->keep_memory
);
933 if (internal_relocs
== NULL
)
936 /* Walk through them looking for relaxing opportunities. */
937 irelend
= internal_relocs
+ sec
->reloc_count
;
938 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
942 /* If this isn't something that can be relaxed, then ignore
944 if (ELF32_R_TYPE (irel
->r_info
) != (int) R_MSP430_RL_PCREL
)
947 /* Get the section contents if we haven't done so already. */
948 if (contents
== NULL
)
950 /* Get cached copy if it exists. */
951 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
952 contents
= elf_section_data (sec
)->this_hdr
.contents
;
953 else if (! bfd_malloc_and_get_section (abfd
, sec
, &contents
))
957 /* Read this BFD's local symbols if we haven't done so already. */
958 if (isymbuf
== NULL
&& symtab_hdr
->sh_info
!= 0)
960 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
962 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
963 symtab_hdr
->sh_info
, 0,
969 /* Get the value of the symbol referred to by the reloc. */
970 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
972 /* A local symbol. */
973 Elf_Internal_Sym
*isym
;
976 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
977 if (isym
->st_shndx
== SHN_UNDEF
)
978 sym_sec
= bfd_und_section_ptr
;
979 else if (isym
->st_shndx
== SHN_ABS
)
980 sym_sec
= bfd_abs_section_ptr
;
981 else if (isym
->st_shndx
== SHN_COMMON
)
982 sym_sec
= bfd_com_section_ptr
;
984 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
985 symval
= (isym
->st_value
986 + sym_sec
->output_section
->vma
+ sym_sec
->output_offset
);
991 struct elf_link_hash_entry
*h
;
993 /* An external symbol. */
994 indx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
995 h
= elf_sym_hashes (abfd
)[indx
];
996 BFD_ASSERT (h
!= NULL
);
998 if (h
->root
.type
!= bfd_link_hash_defined
999 && h
->root
.type
!= bfd_link_hash_defweak
)
1000 /* This appears to be a reference to an undefined
1001 symbol. Just ignore it--it will be caught by the
1002 regular reloc processing. */
1005 symval
= (h
->root
.u
.def
.value
1006 + h
->root
.u
.def
.section
->output_section
->vma
1007 + h
->root
.u
.def
.section
->output_offset
);
1010 /* For simplicity of coding, we are going to modify the section
1011 contents, the section relocs, and the BFD symbol table. We
1012 must tell the rest of the code not to free up this
1013 information. It would be possible to instead create a table
1014 of changes which have to be made, as is done in coff-mips.c;
1015 that would be more work, but would require less memory when
1016 the linker is run. */
1018 /* Try to turn a 16bit pc-relative branch into a 10bit pc-relative
1020 /* Paranoia? paranoia... */
1021 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_MSP430_RL_PCREL
)
1023 bfd_vma value
= symval
;
1025 /* Deal with pc-relative gunk. */
1026 value
-= (sec
->output_section
->vma
+ sec
->output_offset
);
1027 value
-= irel
->r_offset
;
1028 value
+= irel
->r_addend
;
1030 /* See if the value will fit in 10 bits, note the high value is
1031 1016 as the target will be two bytes closer if we are
1033 if ((long) value
< 1016 && (long) value
> -1016)
1035 int code0
= 0, code1
= 0, code2
= 0;
1037 struct rcodes_s
*rx
;
1039 /* Get the opcode. */
1040 if (irel
->r_offset
>= 6)
1041 code0
= bfd_get_16 (abfd
, contents
+ irel
->r_offset
- 6);
1043 if (irel
->r_offset
>= 4)
1044 code1
= bfd_get_16 (abfd
, contents
+ irel
->r_offset
- 4);
1046 code2
= bfd_get_16 (abfd
, contents
+ irel
->r_offset
- 2);
1048 if (code2
!= 0x4010)
1051 /* Check r4 and r3. */
1052 for (i
= NUMB_RELAX_CODES
- 1; i
>= 0; i
--)
1055 if (rx
->cdx
== 2 && rx
->f0
== code0
&& rx
->f1
== code1
)
1057 else if (rx
->cdx
== 1 && rx
->f1
== code1
)
1059 else if (rx
->cdx
== 0) /* This is an unconditional jump. */
1064 .Label0: ; we do not care about this label
1066 .Label1: ; make sure there is no label here
1068 .Label2: ; make sure there is no label here
1071 So, if there is .Label1 or .Label2 we cannot relax this code.
1072 This actually should not happen, cause for relaxable
1073 instructions we use RL_PCREL reloc instead of 16_PCREL.
1074 Will change this in the future. */
1077 && msp430_elf_symbol_address_p (abfd
, sec
, isymbuf
,
1078 irel
->r_offset
- 2))
1081 && msp430_elf_symbol_address_p (abfd
, sec
, isymbuf
,
1082 irel
->r_offset
- 4))
1085 /* Note that we've changed the relocs, section contents, etc. */
1086 elf_section_data (sec
)->relocs
= internal_relocs
;
1087 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1088 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1090 /* Fix the relocation's type. */
1091 if (rx
->labels
== 3) /* Handle special cases. */
1092 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
1095 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
1098 /* Fix the opcode right way. */
1099 bfd_put_16 (abfd
, rx
->t0
, contents
+ irel
->r_offset
- rx
->off
);
1101 bfd_put_16 (abfd
, rx
->t1
,
1102 contents
+ irel
->r_offset
- rx
->off
+ 2);
1105 if (!msp430_elf_relax_delete_bytes (abfd
, sec
,
1106 irel
->r_offset
- rx
->off
+
1110 /* Handle unconditional jumps. */
1112 irel
->r_offset
-= 2;
1114 /* That will change things, so, we should relax again.
1115 Note that this is not required, and it may be slow. */
1121 if (isymbuf
!= NULL
&& symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1123 if (!link_info
->keep_memory
)
1127 /* Cache the symbols for elf_link_input_bfd. */
1128 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1132 if (contents
!= NULL
1133 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
1135 if (!link_info
->keep_memory
)
1139 /* Cache the section contents for elf_link_input_bfd. */
1140 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1144 if (internal_relocs
!= NULL
1145 && elf_section_data (sec
)->relocs
!= internal_relocs
)
1146 free (internal_relocs
);
1151 if (isymbuf
!= NULL
&& symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1153 if (contents
!= NULL
1154 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
1156 if (internal_relocs
!= NULL
1157 && elf_section_data (sec
)->relocs
!= internal_relocs
)
1158 free (internal_relocs
);
1164 #define ELF_ARCH bfd_arch_msp430
1165 #define ELF_MACHINE_CODE EM_MSP430
1166 #define ELF_MACHINE_ALT1 EM_MSP430_OLD
1167 #define ELF_MAXPAGESIZE 1
1169 #define TARGET_LITTLE_SYM bfd_elf32_msp430_vec
1170 #define TARGET_LITTLE_NAME "elf32-msp430"
1172 #define elf_info_to_howto msp430_info_to_howto_rela
1173 #define elf_info_to_howto_rel NULL
1174 #define elf_backend_relocate_section elf32_msp430_relocate_section
1175 #define elf_backend_gc_mark_hook elf32_msp430_gc_mark_hook
1176 #define elf_backend_gc_sweep_hook elf32_msp430_gc_sweep_hook
1177 #define elf_backend_check_relocs elf32_msp430_check_relocs
1178 #define elf_backend_can_gc_sections 1
1179 #define elf_backend_final_write_processing bfd_elf_msp430_final_write_processing
1180 #define elf_backend_object_p elf32_msp430_object_p
1181 #define elf_backend_post_process_headers elf32_msp430_post_process_headers
1182 #define bfd_elf32_bfd_relax_section msp430_elf_relax_section
1184 #include "elf32-target.h"