This commit was generated by cvs2svn to track changes on a CVS vendor
[platform/upstream/binutils.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 /* Adjust all local symbols defined as '.section + 0xXXXX' (.section has sec_shndx)
834     referenced from current and other sections */
835 static bfd_boolean
836 msp430_elf_relax_adjust_locals(bfd * abfd, asection * sec, bfd_vma addr,
837     int count, unsigned int sec_shndx, bfd_vma toaddr)
838 {
839   Elf_Internal_Shdr *symtab_hdr;
840   Elf_Internal_Rela *irel;
841   Elf_Internal_Rela *irelend;
842   Elf_Internal_Sym *isym;
843
844   irel = elf_section_data (sec)->relocs;
845   irelend = irel + sec->reloc_count;
846   symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
847   isym = (Elf_Internal_Sym *) symtab_hdr->contents;
848   
849   for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
850     {
851       int sidx = ELF32_R_SYM(irel->r_info);
852       Elf_Internal_Sym *lsym = isym + sidx;
853       
854       /* Adjust symbols referenced by .sec+0xXX */
855       if (irel->r_addend > addr && irel->r_addend < toaddr 
856           && lsym->st_shndx == sec_shndx)
857         irel->r_addend -= count;
858     }
859   
860   return TRUE;
861 }
862
863 /* Delete some bytes from a section while relaxing.  */
864
865 static bfd_boolean
866 msp430_elf_relax_delete_bytes (bfd * abfd, asection * sec, bfd_vma addr,
867                                int count)
868 {
869   Elf_Internal_Shdr *symtab_hdr;
870   unsigned int sec_shndx;
871   bfd_byte *contents;
872   Elf_Internal_Rela *irel;
873   Elf_Internal_Rela *irelend;
874   Elf_Internal_Rela *irelalign;
875   bfd_vma toaddr;
876   Elf_Internal_Sym *isym;
877   Elf_Internal_Sym *isymend;
878   struct elf_link_hash_entry **sym_hashes;
879   struct elf_link_hash_entry **end_hashes;
880   unsigned int symcount;
881   asection *p;
882
883   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
884
885   contents = elf_section_data (sec)->this_hdr.contents;
886
887   /* The deletion must stop at the next ALIGN reloc for an aligment
888      power larger than the number of bytes we are deleting.  */
889
890   irelalign = NULL;
891   toaddr = sec->size;
892
893   irel = elf_section_data (sec)->relocs;
894   irelend = irel + sec->reloc_count;
895
896   /* Actually delete the bytes.  */
897   memmove (contents + addr, contents + addr + count,
898            (size_t) (toaddr - addr - count));
899   sec->size -= count;
900
901   /* Adjust all the relocs.  */
902   symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
903   isym = (Elf_Internal_Sym *) symtab_hdr->contents;
904   for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
905     {
906       /* Get the new reloc address.  */
907       if ((irel->r_offset > addr && irel->r_offset < toaddr))
908         irel->r_offset -= count;
909     }
910
911   for (p = abfd->sections; p != NULL; p = p->next)
912     msp430_elf_relax_adjust_locals(abfd,p,addr,count,sec_shndx,toaddr);
913   
914   /* Adjust the local symbols defined in this section.  */
915   symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
916   isym = (Elf_Internal_Sym *) symtab_hdr->contents;
917   for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
918     if (isym->st_shndx == sec_shndx
919         && isym->st_value > addr && isym->st_value < toaddr)
920       isym->st_value -= count;
921
922   /* Now adjust the global symbols defined in this section.  */
923   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
924               - symtab_hdr->sh_info);
925   sym_hashes = elf_sym_hashes (abfd);
926   end_hashes = sym_hashes + symcount;
927   for (; sym_hashes < end_hashes; sym_hashes++)
928     {
929       struct elf_link_hash_entry *sym_hash = *sym_hashes;
930
931       if ((sym_hash->root.type == bfd_link_hash_defined
932            || sym_hash->root.type == bfd_link_hash_defweak)
933           && sym_hash->root.u.def.section == sec
934           && sym_hash->root.u.def.value > addr
935           && sym_hash->root.u.def.value < toaddr)
936         sym_hash->root.u.def.value -= count;
937     }
938
939   return TRUE;
940 }
941
942
943 static bfd_boolean
944 msp430_elf_relax_section (bfd * abfd, asection * sec,
945                           struct bfd_link_info * link_info,
946                           bfd_boolean * again)
947 {
948   Elf_Internal_Shdr * symtab_hdr;
949   Elf_Internal_Rela * internal_relocs;
950   Elf_Internal_Rela * irel;
951   Elf_Internal_Rela * irelend;
952   bfd_byte *          contents = NULL;
953   Elf_Internal_Sym *  isymbuf = NULL;
954
955   /* Assume nothing changes.  */
956   *again = FALSE;
957
958   /* We don't have to do anything for a relocatable link, if
959      this section does not have relocs, or if this is not a
960      code section.  */
961   if (link_info->relocatable
962       || (sec->flags & SEC_RELOC) == 0
963       || sec->reloc_count == 0 || (sec->flags & SEC_CODE) == 0)
964     return TRUE;
965
966   symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
967
968   /* Get a copy of the native relocations.  */
969   internal_relocs =
970     _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, link_info->keep_memory);
971   if (internal_relocs == NULL)
972     goto error_return;
973
974   /* Walk through them looking for relaxing opportunities.  */
975   irelend = internal_relocs + sec->reloc_count;
976   for (irel = internal_relocs; irel < irelend; irel++)
977     {
978       bfd_vma symval;
979
980       /* If this isn't something that can be relaxed, then ignore
981          this reloc.  */
982       if (ELF32_R_TYPE (irel->r_info) != (int) R_MSP430_RL_PCREL)
983         continue;
984
985       /* Get the section contents if we haven't done so already.  */
986       if (contents == NULL)
987         {
988           /* Get cached copy if it exists.  */
989           if (elf_section_data (sec)->this_hdr.contents != NULL)
990             contents = elf_section_data (sec)->this_hdr.contents;
991           else if (! bfd_malloc_and_get_section (abfd, sec, &contents))
992             goto error_return;
993         }
994
995       /* Read this BFD's local symbols if we haven't done so already.  */
996       if (isymbuf == NULL && symtab_hdr->sh_info != 0)
997         {
998           isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
999           if (isymbuf == NULL)
1000             isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
1001                                             symtab_hdr->sh_info, 0,
1002                                             NULL, NULL, NULL);
1003           if (isymbuf == NULL)
1004             goto error_return;
1005         }
1006
1007       /* Get the value of the symbol referred to by the reloc.  */
1008       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1009         {
1010           /* A local symbol.  */
1011           Elf_Internal_Sym *isym;
1012           asection *sym_sec;
1013
1014           isym = isymbuf + ELF32_R_SYM (irel->r_info);
1015           if (isym->st_shndx == SHN_UNDEF)
1016             sym_sec = bfd_und_section_ptr;
1017           else if (isym->st_shndx == SHN_ABS)
1018             sym_sec = bfd_abs_section_ptr;
1019           else if (isym->st_shndx == SHN_COMMON)
1020             sym_sec = bfd_com_section_ptr;
1021           else
1022             sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1023           symval = (isym->st_value
1024                     + sym_sec->output_section->vma + sym_sec->output_offset);
1025         }
1026       else
1027         {
1028           unsigned long indx;
1029           struct elf_link_hash_entry *h;
1030
1031           /* An external symbol.  */
1032           indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
1033           h = elf_sym_hashes (abfd)[indx];
1034           BFD_ASSERT (h != NULL);
1035
1036           if (h->root.type != bfd_link_hash_defined
1037               && h->root.type != bfd_link_hash_defweak)
1038             /* This appears to be a reference to an undefined
1039                symbol.  Just ignore it--it will be caught by the
1040                regular reloc processing.  */
1041             continue;
1042
1043           symval = (h->root.u.def.value
1044                     + h->root.u.def.section->output_section->vma
1045                     + h->root.u.def.section->output_offset);
1046         }
1047
1048       /* For simplicity of coding, we are going to modify the section
1049          contents, the section relocs, and the BFD symbol table.  We
1050          must tell the rest of the code not to free up this
1051          information.  It would be possible to instead create a table
1052          of changes which have to be made, as is done in coff-mips.c;
1053          that would be more work, but would require less memory when
1054          the linker is run.  */
1055
1056       /* Try to turn a 16bit pc-relative branch into a 10bit pc-relative
1057          branch.  */
1058       /* Paranoia? paranoia...  */      
1059       if (ELF32_R_TYPE (irel->r_info) == (int) R_MSP430_RL_PCREL)
1060         {
1061           bfd_vma value = symval;
1062
1063           /* Deal with pc-relative gunk.  */
1064           value -= (sec->output_section->vma + sec->output_offset);
1065           value -= irel->r_offset;
1066           value += irel->r_addend;
1067
1068           /* See if the value will fit in 10 bits, note the high value is
1069              1016 as the target will be two bytes closer if we are
1070              able to relax. */
1071           if ((long) value < 1016 && (long) value > -1016)
1072             {
1073               int code0 = 0, code1 = 0, code2 = 0;
1074               int i;
1075               struct rcodes_s *rx;
1076
1077               /* Get the opcode.  */
1078               if (irel->r_offset >= 6)
1079                 code0 = bfd_get_16 (abfd, contents + irel->r_offset - 6);
1080
1081               if (irel->r_offset >= 4)
1082                 code1 = bfd_get_16 (abfd, contents + irel->r_offset - 4);
1083
1084               code2 = bfd_get_16 (abfd, contents + irel->r_offset - 2);
1085
1086               if (code2 != 0x4010)
1087                 continue;
1088
1089               /* Check r4 and r3.  */
1090               for (i = NUMB_RELAX_CODES - 1; i >= 0; i--)
1091                 {
1092                   rx = &rcode[i];
1093                   if (rx->cdx == 2 && rx->f0 == code0 && rx->f1 == code1)
1094                     break;
1095                   else if (rx->cdx == 1 && rx->f1 == code1)
1096                     break;
1097                   else if (rx->cdx == 0)        /* This is an unconditional jump.  */
1098                     break;
1099                 }
1100
1101               /* Check labels:
1102                    .Label0:       ; we do not care about this label
1103                       jeq    +6
1104                    .Label1:       ; make sure there is no label here
1105                       jl     +4
1106                    .Label2:       ; make sure there is no label here
1107                       br .Label_dst
1108
1109                  So, if there is .Label1 or .Label2 we cannot relax this code.
1110                  This actually should not happen, cause for relaxable
1111                  instructions we use RL_PCREL reloc instead of 16_PCREL.
1112                  Will change this in the future. */
1113
1114               if (rx->cdx > 0
1115                   && msp430_elf_symbol_address_p (abfd, sec, isymbuf,
1116                                                   irel->r_offset - 2))
1117                 continue;
1118               if (rx->cdx > 1
1119                   && msp430_elf_symbol_address_p (abfd, sec, isymbuf,
1120                                                   irel->r_offset - 4))
1121                 continue;
1122
1123               /* Note that we've changed the relocs, section contents, etc.  */
1124               elf_section_data (sec)->relocs = internal_relocs;
1125               elf_section_data (sec)->this_hdr.contents = contents;
1126               symtab_hdr->contents = (unsigned char *) isymbuf;
1127
1128               /* Fix the relocation's type.  */
1129               if (rx->labels == 3)      /* Handle special cases.  */
1130                 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1131                                            R_MSP430_2X_PCREL);
1132               else
1133                 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1134                                            R_MSP430_10_PCREL);
1135
1136               /* Fix the opcode right way.  */
1137               bfd_put_16 (abfd, rx->t0, contents + irel->r_offset - rx->off);
1138               if (rx->t1)
1139                 bfd_put_16 (abfd, rx->t1,
1140                             contents + irel->r_offset - rx->off + 2);
1141
1142               /* Delete bytes. */
1143               if (!msp430_elf_relax_delete_bytes (abfd, sec,
1144                                                   irel->r_offset - rx->off +
1145                                                   rx->ncl, rx->bs))
1146                 goto error_return;
1147
1148               /* Handle unconditional jumps.  */
1149               if (rx->cdx == 0)
1150                 irel->r_offset -= 2;
1151
1152               /* That will change things, so, we should relax again.
1153                  Note that this is not required, and it may be slow.  */
1154               *again = TRUE;
1155             }
1156         }
1157     }
1158
1159   if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf)
1160     {
1161       if (!link_info->keep_memory)
1162         free (isymbuf);
1163       else
1164         {
1165           /* Cache the symbols for elf_link_input_bfd.  */
1166           symtab_hdr->contents = (unsigned char *) isymbuf;
1167         }
1168     }
1169
1170   if (contents != NULL
1171       && elf_section_data (sec)->this_hdr.contents != contents)
1172     {
1173       if (!link_info->keep_memory)
1174         free (contents);
1175       else
1176         {
1177           /* Cache the section contents for elf_link_input_bfd.  */
1178           elf_section_data (sec)->this_hdr.contents = contents;
1179         }
1180     }
1181
1182   if (internal_relocs != NULL
1183       && elf_section_data (sec)->relocs != internal_relocs)
1184     free (internal_relocs);
1185
1186   return TRUE;
1187
1188 error_return:
1189   if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf)
1190     free (isymbuf);
1191   if (contents != NULL
1192       && elf_section_data (sec)->this_hdr.contents != contents)
1193     free (contents);
1194   if (internal_relocs != NULL
1195       && elf_section_data (sec)->relocs != internal_relocs)
1196     free (internal_relocs);
1197
1198   return FALSE;
1199 }
1200
1201
1202 #define ELF_ARCH                bfd_arch_msp430
1203 #define ELF_MACHINE_CODE        EM_MSP430
1204 #define ELF_MACHINE_ALT1        EM_MSP430_OLD
1205 #define ELF_MAXPAGESIZE         1
1206
1207 #define TARGET_LITTLE_SYM       bfd_elf32_msp430_vec
1208 #define TARGET_LITTLE_NAME      "elf32-msp430"
1209
1210 #define elf_info_to_howto                    msp430_info_to_howto_rela
1211 #define elf_info_to_howto_rel                NULL
1212 #define elf_backend_relocate_section         elf32_msp430_relocate_section
1213 #define elf_backend_gc_mark_hook             elf32_msp430_gc_mark_hook
1214 #define elf_backend_gc_sweep_hook            elf32_msp430_gc_sweep_hook
1215 #define elf_backend_check_relocs             elf32_msp430_check_relocs
1216 #define elf_backend_can_gc_sections          1
1217 #define elf_backend_final_write_processing   bfd_elf_msp430_final_write_processing
1218 #define elf_backend_object_p                 elf32_msp430_object_p
1219 #define elf_backend_post_process_headers     elf32_msp430_post_process_headers
1220 #define bfd_elf32_bfd_relax_section          msp430_elf_relax_section
1221
1222 #include "elf32-target.h"