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