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