Adds support for generating notes in V850 binaries.
authorNick Clifton <nickc@redhat.com>
Tue, 24 Feb 2015 17:54:09 +0000 (17:54 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 24 Feb 2015 17:54:09 +0000 (17:54 +0000)
bfd * elf32-v850.c (v850_set_note): New function.  Creates a Renesas
style note entry.
(v850_elf_make_note_section): New function.  Creates a note
section.
(v850_elf_create_sections): New function.  Create a note section
if one is not already present.
(v850_elf_set_note): New function.  Adds a note to a bfd.
(v850_elf_copy_private_bfd_data): New function.  Copies V850
notes.
(v850_elf_merge_notes): New function.  Merges V850 notes.
(print_v850_note): New function.  Displays a V850 note.
(v850_elf_print_notes): New function. Displays all notes attached
to a bfd.
(v850_elf_merge_private_bfd_data): Call v850_elf_merge_notes.
(v850_elf_print_private_bfd_data): Call v850_elf_print_notes.
(v850_elf_fake_sections): Set the type of the V850 note section.
* bfd-in.h (v850_elf_create_sections): Add prototype.
(v850_elf_set_note): Add prototype.
* bfd-in2.h: Regenerate.

binutils* readelf.c (get_machine_flags): Remove deprecated V850 machine
flags.
(get_v850_section_type_name): New function.  Handles V850 special
sections.
(get_section_type_name): Add support for V850.
(get_v850_elf_note_type): New function.  Returns the name of a
V850 note.
(print_v850_note): New function.  Prints a V850 note.
(process_v850_notes): New function.  Prints V850 notes.
(process_note_sections): Add support for V850.

binutils/testsute
* binutils-all/objcopy.exp: Skip the strip-10 test for the V850.

gas * config/tc-v850.c (soft_float): New variable.
(v850_data_8): New variable.
(md_show_usage): Add -msoft-float/-mhard-float.
(md_parse_option): Likewise.
(md_begin): Set the default value of soft_float.
(v850_md_end): New function.  Creates a note section.
* config/tc-v850.h (md_end): Define.
* doc/c-v850.texi: Document -msoft-float/-mhard-float.

gas/testsuite
* gas/elf/elf.exp: Add special version of the section2 test for
the V850.
* gas/elf/section2.e-v850: New file.

include/elf
* v850.h (EF_RH850_SIMD): Delete deprecated flag.
(EF_RH850_CACHE): Likewise.
(EF_RH850_MMU): Likewise.
(EF_RH850_DATA_ALIGN8): Likewise.
(SHT_RENESAS_IOP): Fix typo in name.
(SHT_RENESAS_INFO): Define.
(V850_NOTE_SECNAME): Define.
(SIZEOF_V850_NOTE): Define.
(V850_NOTE_NAME): Define.
(enum v850_notes): New enum.
(NUM_V850_NOTES): Define.

ld/ChangeLog
2015-02-24  Nick Clifton  <nickc@redhat.com>

* Makefile.am (ev850.c): Add dependency upon
$(srcdir)/emultempl/v850elf.em.
(ev850_rh850.c): Likewise.
* Makefile.in: Regenerate.
* emultempl/v850elf.em: New file.
* emulparams/v850.sh (EXTRA_EM_FILE): Define.
* emulparams/v850_rh850.sh (EXTRA_EM_FILE): Define.
* scripttempl/v850.sc: Add .note.renesas section.
* scripttempl/v850_rh850.sc: Likewise.

ld/testsuite
* ld-elf/extract-symbol-1sec.d: Expect to fail on the V850.

27 files changed:
bfd/ChangeLog
bfd/bfd-in.h
bfd/bfd-in2.h
bfd/elf32-v850.c
binutils/ChangeLog
binutils/readelf.c
binutils/testsuite/ChangeLog
binutils/testsuite/binutils-all/objcopy.exp
gas/ChangeLog
gas/config/tc-v850.c
gas/config/tc-v850.h
gas/doc/c-v850.texi
gas/testsuite/ChangeLog
gas/testsuite/gas/elf/elf.exp
gas/testsuite/gas/elf/section2.e-v850 [new file with mode: 0644]
include/elf/ChangeLog
include/elf/v850.h
ld/ChangeLog
ld/Makefile.am
ld/Makefile.in
ld/emulparams/v850.sh
ld/emulparams/v850_rh850.sh
ld/emultempl/v850elf.em [new file with mode: 0644]
ld/scripttempl/v850.sc
ld/scripttempl/v850_rh850.sc
ld/testsuite/ChangeLog
ld/testsuite/ld-elf/extract-symbol-1sec.d

index 9ed4fd35dd919623d75b07d9981fae48cb446dd8..57b7fd1801774a4a63f572e30cdfff7e31f3b95a 100644 (file)
@@ -1,3 +1,25 @@
+2015-02-24  Nick Clifton  <nickc@redhat.com>
+
+       * elf32-v850.c (v850_set_note): New function.  Creates a Renesas
+       style note entry.
+       (v850_elf_make_note_section): New function.  Creates a note
+       section.
+       (v850_elf_create_sections): New function.  Create a note section
+       if one is not already present.
+       (v850_elf_set_note): New function.  Adds a note to a bfd.
+       (v850_elf_copy_private_bfd_data): New function.  Copies V850
+       notes.
+       (v850_elf_merge_notes): New function.  Merges V850 notes.
+       (print_v850_note): New function.  Displays a V850 note.
+       (v850_elf_print_notes): New function. Displays all notes attached
+       to a bfd.
+       (v850_elf_merge_private_bfd_data): Call v850_elf_merge_notes.
+       (v850_elf_print_private_bfd_data): Call v850_elf_print_notes.
+       (v850_elf_fake_sections): Set the type of the V850 note section.
+       * bfd-in.h (v850_elf_create_sections): Add prototype.
+       (v850_elf_set_note): Add prototype.
+       * bfd-in2.h: Regenerate.
+
 2015-02-24  Nick Clifton  <nickc@redhat.com>
 
        * configure.ac (AC_CHECK_HEADERS): Add wctype.h.
index 8ffae997bd2176bb453b2ae96fb9a76efe3cb569..cbd0465a6f7c26b156814fe251181f36c5f58464 100644 (file)
@@ -988,3 +988,10 @@ extern void bfd_elf32_ia64_after_parse
 
 extern void bfd_elf64_ia64_after_parse
   (int);
+
+/* V850 Note manipulation routines.  */
+extern bfd_boolean v850_elf_create_sections
+  (struct bfd_link_info *);
+
+extern bfd_boolean v850_elf_set_note
+  (bfd *, unsigned int, unsigned int);
index d02fc027078412b55a8930bf35d58e90818ddeb0..2ec7f92c6e0aeb7a7714101b1460fcf1e6d86fc3 100644 (file)
@@ -995,6 +995,13 @@ extern void bfd_elf32_ia64_after_parse
 
 extern void bfd_elf64_ia64_after_parse
   (int);
+
+/* V850 Note manipulation routines.  */
+extern bfd_boolean v850_elf_create_sections
+  (struct bfd_link_info *);
+
+extern bfd_boolean v850_elf_set_note
+  (bfd *, unsigned int, unsigned int);
 /* Extracted from init.c.  */
 void bfd_init (void);
 
index 0155b7d1a072b471e0a649c2797172ea1c8b6913..ae96ec28913a8d1a8faa5b3a2a570cd4188b06fd 100644 (file)
@@ -2344,6 +2344,327 @@ v850_elf_gc_mark_hook (asection *sec,
   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
 }
 
+static void
+v850_set_note (bfd * abfd, asection * s, enum v850_notes note, unsigned int val)
+{
+  bfd_byte * data = s->contents + ((note - 1) * SIZEOF_V850_NOTE);
+
+  bfd_put_32 (abfd, 4, data + 0);
+  bfd_put_32 (abfd, 4, data + 4);
+  bfd_put_32 (abfd, note, data + 8);
+  memcpy (data + 12, V850_NOTE_NAME, 4);
+  bfd_put_32 (abfd, val, data + 16);
+}
+
+/* Create the note section if not already present.  This is done early so
+   that the linker maps the sections to the right place in the output.  */
+
+static asection *
+v850_elf_make_note_section (bfd * abfd)
+{  
+  asection *s;
+  bfd_byte *data;
+  flagword flags;
+  enum v850_notes id;
+
+  /* Make the note section.  */
+  flags = SEC_READONLY | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_MERGE;
+
+  s = bfd_make_section_anyway_with_flags (abfd, V850_NOTE_SECNAME, flags);
+  if (s == NULL)
+    return NULL;
+
+  if (!bfd_set_section_alignment (abfd, s, 2))
+    return NULL;
+
+  /* Allocate space for all known notes.  */
+  if (!bfd_set_section_size (abfd, s, NUM_V850_NOTES * SIZEOF_V850_NOTE))
+    return NULL;
+
+  data = bfd_zalloc (abfd, NUM_V850_NOTES * SIZEOF_V850_NOTE);
+  if (data == NULL)
+    return NULL;
+
+  s->contents = data;
+
+  /* Provide default (= uninitilaised) values for all of the notes.  */
+  for (id = V850_NOTE_ALIGNMENT; id <= NUM_V850_NOTES; id++)
+    v850_set_note (abfd, s, id,  0);
+
+  return s;
+}
+
+/* Create the note section if not already present.  This is done early so
+   that the linker maps the sections to the right place in the output.  */
+
+bfd_boolean
+v850_elf_create_sections (struct bfd_link_info * info)
+{
+  bfd * ibfd;
+
+  /* If we already have a note section, do not make another.  */
+  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
+    if (bfd_get_section_by_name (ibfd, V850_NOTE_SECNAME) != NULL)
+      return TRUE;
+
+  return v850_elf_make_note_section (info->input_bfds) != NULL;
+}
+
+bfd_boolean
+v850_elf_set_note (bfd * abfd, enum v850_notes note, unsigned int val)
+{
+  asection * notes = bfd_get_section_by_name (abfd, V850_NOTE_SECNAME);
+
+  if (val > 2)
+    /* At the moment, no known note has a value over 2.  */
+    return FALSE;
+
+  if (notes == NULL)
+    notes = v850_elf_make_note_section (abfd);
+  if (notes == NULL)
+    return FALSE;
+
+  v850_set_note (abfd, notes, note, val);
+  return TRUE;
+}
+
+/* Copy backend specific data from one object module to another.  */
+
+static bfd_boolean
+v850_elf_copy_private_bfd_data (bfd * ibfd, bfd * obfd)
+{
+  asection * onotes;
+  asection * inotes;
+
+  /* If the output bfd does not have a note section, then
+     skip the merge.  The normal input to output section
+     copying will take care of everythng for us.  */
+  if ((onotes = bfd_get_section_by_name (obfd, V850_NOTE_SECNAME)) == NULL)
+    return TRUE;
+
+  if ((inotes = bfd_get_section_by_name (ibfd, V850_NOTE_SECNAME)) != NULL)
+    {
+      bfd_byte * icont;
+      bfd_byte * ocont;
+
+      BFD_ASSERT (bfd_section_size (ibfd, inotes) == bfd_section_size (obfd, onotes));
+
+      if ((icont = elf_section_data (inotes)->this_hdr.contents) == NULL)
+       BFD_ASSERT (bfd_malloc_and_get_section (ibfd, inotes, & icont));
+
+      if ((ocont = elf_section_data (onotes)->this_hdr.contents) == NULL)
+       BFD_ASSERT (bfd_malloc_and_get_section (obfd, onotes, & ocont));
+
+      /* Copy/overwrite notes from the input to the output.  */
+      memcpy (ocont, icont, bfd_section_size (obfd, onotes));
+    }
+
+  return TRUE;
+}
+#define bfd_elf32_bfd_copy_private_bfd_data    v850_elf_copy_private_bfd_data
+
+static bfd_boolean 
+v850_elf_merge_notes (bfd * ibfd, bfd *obfd)
+{
+  asection * onotes;
+  asection * inotes;
+  bfd_boolean result = TRUE;
+
+  /* If the output bfd does not have a note section, then
+     skip the merge.  The normal input to output section
+     copying will take care of everythng for us.  */
+  if ((onotes = bfd_get_section_by_name (obfd, V850_NOTE_SECNAME)) == NULL)
+    return TRUE;
+
+  if ((inotes = bfd_get_section_by_name (ibfd, V850_NOTE_SECNAME)) != NULL)
+    {
+      enum v850_notes id;
+      bfd_byte * icont;
+      bfd_byte * ocont;
+
+      BFD_ASSERT (bfd_section_size (ibfd, inotes) == bfd_section_size (obfd, onotes));
+
+      if ((icont = elf_section_data (inotes)->this_hdr.contents) == NULL)
+       BFD_ASSERT (bfd_malloc_and_get_section (ibfd, inotes, & icont));
+
+      if ((ocont = elf_section_data (onotes)->this_hdr.contents) == NULL)
+       BFD_ASSERT (bfd_malloc_and_get_section (obfd, onotes, & ocont));
+
+      for (id = V850_NOTE_ALIGNMENT; id <= NUM_V850_NOTES; id++)
+       {
+         unsigned int ival;
+         unsigned int oval;
+         bfd_byte * idata = icont + ((id - 1) * SIZEOF_V850_NOTE) + 16;
+         bfd_byte * odata = ocont + ((id - 1) * SIZEOF_V850_NOTE) + 16;
+
+         ival = bfd_get_32 (ibfd, idata);
+         oval = bfd_get_32 (obfd, odata);
+
+         if (ival == 0 || ival == oval)
+           continue;
+         
+         if (oval == 0)
+           {
+             bfd_put_32 (obfd, ival, odata);
+             v850_set_note (obfd, onotes, id, ival);
+             continue;
+           }
+
+         /* We have a mismatch.  The ABI defines how to handle
+            this siutation on a per note type basis.  */
+         switch (id)
+           {
+           case V850_NOTE_ALIGNMENT:
+             if (oval == EF_RH850_DATA_ALIGN4)
+               {
+                 _bfd_error_handler
+                   (_("error: %B needs 8-byte aligment but %B is set for 4-byte alignment"),
+                                     ibfd, obfd);
+                 result = FALSE;
+               }
+             else
+               /* ibfd uses 4-byte alignment, obfd uses 8-byte alignment.
+                  Leave the obfd alignment as it is.  */
+               BFD_ASSERT (oval == EF_RH850_DATA_ALIGN8);
+
+             break;
+
+           case V850_NOTE_DATA_SIZE:
+             if (oval == EF_RH850_DOUBLE32)
+               {
+                 _bfd_error_handler (_("error: %B uses 64-bit doubles but %B uses 32-bit doubles"),
+                                     ibfd, obfd);
+                 result = FALSE;
+               }
+             else
+               /* ibfd uses 32-bit doubles, obfd uses 64-bit doubles.
+                  This is acceptable.  Honest, that is what the ABI says.  */
+               BFD_ASSERT (oval == EF_RH850_DOUBLE64);
+             break;
+
+           case V850_NOTE_FPU_INFO:
+             if (oval == EF_RH850_FPU20)
+               {
+                 _bfd_error_handler (_("error: %B uses FPU-3.0 but %B only supports FPU-2.0"),
+                                    ibfd, obfd);
+                 result = FALSE;
+               }
+             else
+               /* ibfd uses FPU-2.0, obfd uses FPU-3.0.  Leave obfd as it is.  */
+               BFD_ASSERT (oval == EF_RH850_FPU30);
+
+             break;
+
+           default:
+             /* None of the other conflicts matter.
+                Stick with the current output values.  */
+             break;
+           }
+       }
+
+      /* FIXME:  We should also check for conflicts between the notes
+        and the EF flags in the ELF header.  */
+    }
+
+  return result;
+}
+
+static void
+print_v850_note (bfd * abfd, FILE * file, bfd_byte * data, enum v850_notes id)
+{
+  unsigned int value = bfd_get_32 (abfd, data + ((id - 1) * SIZEOF_V850_NOTE) + 16);
+
+  switch (id)
+    {
+    case V850_NOTE_ALIGNMENT:
+      fprintf (file, _(" alignment of 8-byte entities: "));
+      switch (value)
+       {
+       case EF_RH850_DATA_ALIGN4: fprintf (file, _("4-byte")); break;
+       case EF_RH850_DATA_ALIGN8: fprintf (file, _("8-byte")); break;
+       case 0:  fprintf (file, _("not set")); break;
+       default: fprintf (file, _("unknown: %x"), value); break;
+       }
+      fputc ('\n', file);
+      break;
+       
+    case V850_NOTE_DATA_SIZE:
+      fprintf (file, _(" size of doubles: "));
+      switch (value)
+       {
+       case EF_RH850_DOUBLE32: fprintf (file, _("4-bytes")); break;
+       case EF_RH850_DOUBLE64: fprintf (file, _("8-bytes")); break;
+       case 0:  fprintf (file, _("not set")); break;
+       default: fprintf (file, _("unknown: %x"), value); break;
+       }
+      fputc ('\n', file);
+      break;
+       
+    case V850_NOTE_FPU_INFO:
+      fprintf (file, _(" FPU support required: "));
+      switch (value)
+       {
+       case EF_RH850_FPU20: fprintf (file, _("FPU-2.0")); break;
+       case EF_RH850_FPU30: fprintf (file, _("FPU-3.0")); break;
+       case 0:  fprintf (file, _("none")); break;
+       default: fprintf (file, _("unknown: %x"), value); break;
+       }
+      fputc ('\n', file);
+      break;
+       
+    case V850_NOTE_SIMD_INFO:
+      fprintf (file, _("SIMD use: "));
+      switch (value)
+       {
+       case EF_RH850_SIMD: fprintf (file, _("yes")); break;
+       case 0:  fprintf (file, _("no")); break;
+       default: fprintf (file, _("unknown: %x"), value); break;
+       }
+      fputc ('\n', file);
+      break;
+       
+    case V850_NOTE_CACHE_INFO:
+      fprintf (file, _("CACHE use: "));
+      switch (value)
+       {
+       case EF_RH850_CACHE: fprintf (file, _("yes")); break;
+       case 0:  fprintf (file, _("no")); break;
+       default: fprintf (file, _("unknown: %x"), value); break;
+       }
+      fputc ('\n', file);
+      break;
+       
+    case V850_NOTE_MMU_INFO:
+      fprintf (file, _("MMU use: "));
+      switch (value)
+       {
+       case EF_RH850_MMU: fprintf (file, _("yes")); break;
+       case 0:  fprintf (file, _("no")); break;
+       default: fprintf (file, _("unknown: %x"), value); break;
+       }
+      fputc ('\n', file);
+      break;
+       
+    default:
+      BFD_ASSERT (0);
+    }
+}
+
+static void
+v850_elf_print_notes (bfd * abfd, FILE * file)
+{
+  asection * notes = bfd_get_section_by_name (abfd, V850_NOTE_SECNAME);
+  enum v850_notes id;
+
+  if (notes == NULL || notes->contents == NULL)
+    return;
+
+  BFD_ASSERT (bfd_section_size (abfd, notes) == NUM_V850_NOTES * SIZEOF_V850_NOTE);
+
+  for (id = V850_NOTE_ALIGNMENT; id <= NUM_V850_NOTES; id++)
+    print_v850_note (abfd, file, notes->contents, id);
+}
+
 /* Set the right machine number and architecture.  */
 
 static bfd_boolean
@@ -2439,11 +2760,14 @@ v850_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
 {
   flagword out_flags;
   flagword in_flags;
+  bfd_boolean result = TRUE;
 
   if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
     return TRUE;
 
+  result &= v850_elf_merge_notes (ibfd, obfd);
+
   in_flags = elf_elfheader (ibfd)->e_flags;
   out_flags = elf_elfheader (obfd)->e_flags;
 
@@ -2463,14 +2787,14 @@ v850_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
 
       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
          && bfd_get_arch_info (obfd)->the_default)
-       return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
+       result &= bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
 
-      return TRUE;
+      return result;
     }
 
   /* Check flag compatibility.  */
   if (in_flags == out_flags)
-    return TRUE;
+    return result;
 
   if (bfd_get_arch (obfd) == bfd_arch_v850_rh850)
     {
@@ -2481,14 +2805,7 @@ v850_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
          elf_elfheader (obfd)->e_flags |= EF_V800_850E3;
        }
 
-      if ((in_flags & EF_RH850_DATA_ALIGN8) != (out_flags & EF_RH850_DATA_ALIGN8))
-       {
-         _bfd_error_handler (_("%B: Alignment mismatch with previous modules"),
-                             ibfd);
-         elf_elfheader (obfd)->e_flags |= EF_RH850_DATA_ALIGN8;
-       }
-
-      return TRUE;
+      return result;
     }
 
   if ((in_flags & EF_V850_ARCH) != (out_flags & EF_V850_ARCH)
@@ -2499,14 +2816,14 @@ v850_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
          which we set to v850e.  */
       if (   (in_flags  & EF_V850_ARCH) == E_V850E1_ARCH
           && (out_flags & EF_V850_ARCH) == E_V850E_ARCH)
-        return TRUE;
+        return result;
 
       if (   (in_flags  & EF_V850_ARCH) == E_V850_ARCH
          && (out_flags & EF_V850_ARCH) == E_V850E_ARCH)
        {
          elf_elfheader (obfd)->e_flags =
            ((out_flags & ~ EF_V850_ARCH) | E_V850E_ARCH);
-         return TRUE;
+         return result;
        }
 
       if ((   (in_flags & EF_V850_ARCH) == E_V850_ARCH
@@ -2515,7 +2832,7 @@ v850_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
        {
          elf_elfheader (obfd)->e_flags =
            ((out_flags & ~ EF_V850_ARCH) | E_V850E2_ARCH);
-         return TRUE;
+         return result;
        }
 
       if ((   (in_flags & EF_V850_ARCH) == E_V850_ARCH
@@ -2525,7 +2842,7 @@ v850_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
        {
          elf_elfheader (obfd)->e_flags =
            ((out_flags & ~ EF_V850_ARCH) | E_V850E2V3_ARCH);
-         return TRUE;
+         return result;
        }
 
       if ((   (in_flags & EF_V850_ARCH) == E_V850_ARCH
@@ -2536,14 +2853,14 @@ v850_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
        {
          elf_elfheader (obfd)->e_flags =
            ((out_flags & ~ EF_V850_ARCH) | E_V850E3V5_ARCH);
-         return TRUE;
+         return result;
        }
 
       _bfd_error_handler (_("%B: Architecture mismatch with previous modules"),
                          ibfd);
     }
 
-  return TRUE;
+  return result;
 }
 
 /* Display the flags field.  */
@@ -2568,9 +2885,6 @@ v850_elf_print_private_bfd_data (bfd *abfd, void * ptr)
        fprintf (file, _("v850 E3 architecture"));
       else
        fprintf (file, _("v850 architecture"));
-
-      if (elf_elfheader (abfd)->e_flags & EF_RH850_DATA_ALIGN8)
-       fprintf (file, _(", 8-byte data alignment"));
     }
   else
     {
@@ -2588,6 +2902,8 @@ v850_elf_print_private_bfd_data (bfd *abfd, void * ptr)
 
   fputc ('\n', file);
 
+  v850_elf_print_notes (abfd, file);
+
   return TRUE;
 }
 
@@ -2860,6 +3176,12 @@ v850_elf_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
     hdr->sh_type = SHT_V850_TCOMMON;
   else if (strcmp (name, ".zcommon") == 0)
     hdr->sh_type = SHT_V850_ZCOMMON;
+  /* Tweak the section type of .note.renesas.  */
+  else if (strcmp (name, V850_NOTE_SECNAME) == 0)
+    {
+      hdr->sh_type = SHT_RENESAS_INFO;
+      hdr->sh_entsize = SIZEOF_V850_NOTE;
+    }
 
   return TRUE;
 }
@@ -3801,8 +4123,8 @@ static const struct bfd_elf_special_section v850_elf_special_sections[] =
 #define elf_backend_gc_mark_hook                v850_elf_gc_mark_hook
 #define elf_backend_special_sections           v850_elf_special_sections
 
-#define elf_backend_can_gc_sections 1
-#define elf_backend_rela_normal 1
+#define elf_backend_can_gc_sections            1
+#define elf_backend_rela_normal                        1
 
 #define bfd_elf32_bfd_is_local_label_name      v850_elf_is_local_label_name
 #define bfd_elf32_bfd_is_target_special_symbol v850_elf_is_target_special_symbol
@@ -3911,7 +4233,6 @@ v800_elf_info_to_howto (bfd *               abfd,
   cache_ptr->howto = v800_elf_howto_table + r_type;
 }
 \f
-
 #undef  TARGET_LITTLE_SYM
 #define TARGET_LITTLE_SYM                      v800_elf32_vec
 #undef  TARGET_LITTLE_NAME
index 599c82c1bd935ec0a2729db9202120857c34c5f6..421fbe309bf84f74ba90f18c4d2ab2c8df9d6c6e 100644 (file)
@@ -1,3 +1,16 @@
+2015-02-24  Nick Clifton  <nickc@redhat.com>
+
+       * readelf.c (get_machine_flags): Remove deprecated V850 machine
+       flags.
+       (get_v850_section_type_name): New function.  Handles V850 special
+       sections.
+       (get_section_type_name): Add support for V850.
+       (get_v850_elf_note_type): New function.  Returns the name of a
+       V850 note.
+       (print_v850_note): New function.  Prints a V850 note.
+       (process_v850_notes): New function.  Prints V850 notes.
+       (process_note_sections): Add support for V850.
+
 2015-02-24  Mike Frysinger  <vapier@gentoo.org>
 
        PR binutils/17531
index b3f4733ed2e3b6ae5ea04329c67e3daeff7d2983..559ab4b727bbb2f47f2bf6ebe1be031c7e19f798 100644 (file)
@@ -2952,12 +2952,8 @@ get_machine_flags (unsigned e_flags, unsigned e_machine)
                {
                case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
                case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
-               case EF_RH850_SIMD: strcat (buf, ", SIMD"); break;
-               case EF_RH850_CACHE: strcat (buf, ", CACHE"); break;
-               case EF_RH850_MMU: strcat (buf, ", MMU"); break;
                case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
                case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
-               case EF_RH850_DATA_ALIGN8: strcat (buf, ", 8-byte alignment"); break;
                case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
                case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
                case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
@@ -3758,6 +3754,20 @@ get_msp430x_section_type_name (unsigned int sh_type)
     }
 }
 
+static const char *
+get_v850_section_type_name (unsigned int sh_type)
+{
+  switch (sh_type)
+    {
+    case SHT_V850_SCOMMON: return "V850 Small Common";
+    case SHT_V850_TCOMMON: return "V850 Tiny Common";
+    case SHT_V850_ZCOMMON: return "V850 Zero Common";
+    case SHT_RENESAS_IOP:  return "RENESAS IOP";
+    case SHT_RENESAS_INFO: return "RENESAS INFO";
+    default: return NULL;
+    }
+}
+
 static const char *
 get_section_type_name (unsigned int sh_type)
 {
@@ -3826,6 +3836,11 @@ get_section_type_name (unsigned int sh_type)
            case EM_MSP430:
              result = get_msp430x_section_type_name (sh_type);
              break;
+           case EM_V800:
+           case EM_V850:
+           case EM_CYGNUS_V850:
+             result = get_v850_section_type_name (sh_type);
+             break;
            default:
              result = NULL;
              break;
@@ -3856,7 +3871,19 @@ get_section_type_name (unsigned int sh_type)
          sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
        }
       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
-       sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
+       {
+         switch (elf_header.e_machine)
+           {
+           case EM_V800:
+           case EM_V850:
+           case EM_CYGNUS_V850:
+             return get_v850_section_type_name (sh_type);
+           default:
+             break;
+           }
+
+         sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
+       }
       else
        /* This message is probably going to be displayed in a 15
           character wide field, so put the hex value first.  */
@@ -14807,6 +14834,85 @@ print_gnu_note (Elf_Internal_Note *pnote)
   return 1;
 }
 
+static const char *
+get_v850_elf_note_type (enum v850_notes n_type)
+{
+  static char buff[64];
+
+  switch (n_type)
+    {
+    case V850_NOTE_ALIGNMENT:  return _("Alignment of 8-byte objects");
+    case V850_NOTE_DATA_SIZE:  return _("Sizeof double and long double");
+    case V850_NOTE_FPU_INFO:   return _("Type of FPU support needed");
+    case V850_NOTE_SIMD_INFO:  return _("Use of SIMD instructions");
+    case V850_NOTE_CACHE_INFO: return _("Use of cache");
+    case V850_NOTE_MMU_INFO:   return _("Use of MMU");
+    default:
+      snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
+      return buff;
+    }
+}
+
+static int
+print_v850_note (Elf_Internal_Note * pnote)
+{
+  unsigned int val;
+
+  if (pnote->descsz != 4)
+    return 0;
+  val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
+
+  if (val == 0)
+    {
+      printf (_("not set\n"));
+      return 1;
+    }
+
+  switch (pnote->type)
+    {
+    case V850_NOTE_ALIGNMENT:
+      switch (val)
+       {
+       case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return 1;
+       case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return 1;
+       }
+      break;
+       
+    case V850_NOTE_DATA_SIZE:
+      switch (val)
+       {
+       case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return 1;
+       case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return 1;
+       }
+      break;
+       
+    case V850_NOTE_FPU_INFO:
+      switch (val)
+       {
+       case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return 1;
+       case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return 1;
+       }
+      break;
+       
+    case V850_NOTE_MMU_INFO:
+    case V850_NOTE_CACHE_INFO:
+    case V850_NOTE_SIMD_INFO:
+      if (val == EF_RH850_SIMD)
+       {
+         printf (_("yes\n"));
+         return 1;
+       }
+      break;
+
+    default:
+      /* An 'unknown note type' message will already have been displayed.  */
+      break;
+    }
+
+  printf (_("unknown value: %x\n"), val);
+  return 0;
+}
+
 static const char *
 get_netbsd_elfcore_note_type (unsigned e_type)
 {
@@ -15247,6 +15353,78 @@ process_corefile_note_segments (FILE * file)
   return res;
 }
 
+static int
+process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
+{
+  Elf_External_Note * pnotes;
+  Elf_External_Note * external;
+  int res = 1;
+
+  if (length <= 0)
+    return 0;
+
+  pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
+                                           _("v850 notes"));
+  if (pnotes == NULL)
+    return 0;
+
+  external = pnotes;
+
+  printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
+         (unsigned long) offset, (unsigned long) length);
+
+  while (external < (Elf_External_Note *) ((char *) pnotes + length))
+    {
+      Elf_External_Note * next;
+      Elf_Internal_Note inote;
+
+      inote.type     = BYTE_GET (external->type);
+      inote.namesz   = BYTE_GET (external->namesz);
+      inote.namedata = external->name;
+      inote.descsz   = BYTE_GET (external->descsz);
+      inote.descdata = inote.namedata + align_power (inote.namesz, 2);
+      inote.descpos  = offset + (inote.descdata - (char *) pnotes);
+
+      next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
+
+      if (   ((char *) next > ((char *) pnotes) + length)
+         || ((char *) next <  (char *) pnotes))
+       {
+         warn (_("corrupt descsz found in note at offset 0x%lx\n"),
+               (unsigned long) ((char *) external - (char *) pnotes));
+         warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
+               inote.type, inote.namesz, inote.descsz);
+         break;
+       }
+
+      external = next;
+
+      /* Prevent out-of-bounds indexing.  */
+      if (   inote.namedata + inote.namesz > (char *) pnotes + length
+         || inote.namedata + inote.namesz < inote.namedata)
+        {
+          warn (_("corrupt namesz found in note at offset 0x%lx\n"),
+                (unsigned long) ((char *) external - (char *) pnotes));
+          warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
+                inote.type, inote.namesz, inote.descsz);
+          break;
+        }
+
+      printf ("  %s: ", get_v850_elf_note_type (inote.type));
+
+      if (! print_v850_note (& inote))
+       {
+         res = 0;
+         printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
+                 inote.namesz, inote.descsz);
+       }
+    }
+
+  free (pnotes);
+
+  return res;
+}
+
 static int
 process_note_sections (FILE * file)
 {
@@ -15258,13 +15436,26 @@ process_note_sections (FILE * file)
   for (i = 0, section = section_headers;
        i < elf_header.e_shnum && section != NULL;
        i++, section++)
-    if (section->sh_type == SHT_NOTE)
-      {
-       res &= process_corefile_note_segment (file,
-                                             (bfd_vma) section->sh_offset,
-                                             (bfd_vma) section->sh_size);
-       n++;
-      }
+    {
+      if (section->sh_type == SHT_NOTE)
+       {
+         res &= process_corefile_note_segment (file,
+                                               (bfd_vma) section->sh_offset,
+                                               (bfd_vma) section->sh_size);
+         n++;
+       }
+
+      if ((   elf_header.e_machine == EM_V800
+          || elf_header.e_machine == EM_V850
+          || elf_header.e_machine == EM_CYGNUS_V850)
+         && section->sh_type == SHT_RENESAS_INFO)
+       {
+         res &= process_v850_notes (file,
+                                    (bfd_vma) section->sh_offset,
+                                    (bfd_vma) section->sh_size);
+         n++;
+       }
+    }
 
   if (n == 0)
     /* Try processing NOTE segments instead.  */
index c73a6c304b6e8be8140f33ff6a08fcec83a20280..8e784340ac1bd51824869d9533603f0cc6666167 100644 (file)
@@ -1,3 +1,7 @@
+2015-02-24  Nick Clifton  <nickc@redhat.com>
+
+       * binutils-all/objcopy.exp: Skip the strip-10 test for the V850.
+
 2015-01-01  Alan Modra  <amodra@gmail.com>
 
        Update year range in copyright notice of all files.
index f41392dea839758be05942355a724871f9a2d74b..ae21b22ab3c2e41937bedff3e3534e7f77cc3cb9 100644 (file)
@@ -954,9 +954,11 @@ if [is_elf_format] {
     run_dump_test "strip-8"
     run_dump_test "strip-9"
     # Non-EABI ARM targets will set OSABI to ARM
+    # The V850 sets the OSABI to UNIX - System V
     if { ![istarget "*-*-hpux*"]
         && ![istarget "msp*-*-*"]
         && ![istarget "visium-*-*"]
+        && ![istarget "v850*-*-*"]
          && !([istarget "arm*-*-*"] && ![istarget "arm-*-*eabi*"])} {
        run_dump_test "strip-10"
     }
index ab3efea7ea0e80ffaba61fbc6a9ca0c3cd287ca1..afcc7dcd751765312af8d50fa3c4da31e3c507bf 100644 (file)
@@ -1,3 +1,14 @@
+2015-02-24  Nick Clifton  <nickc@redhat.com>
+
+       * config/tc-v850.c (soft_float): New variable.
+       (v850_data_8): New variable.
+       (md_show_usage): Add -msoft-float/-mhard-float.
+       (md_parse_option): Likewise.
+       (md_begin): Set the default value of soft_float.
+       (v850_md_end): New function.  Creates a note section.
+       * config/tc-v850.h (md_end): Define.
+       * doc/c-v850.texi: Document -msoft-float/-mhard-float.
+
 2015-02-23  Yoshinori Sato  <ysato@users.sourceforge.jp>
 
        * config/tc-h8300.c (line_separater_chars): Add a version for
index c48c01112e95cf55474626a9926fe89e148fd7b4..fc5510605b73772810f791b92aed3a242f681ac6 100644 (file)
@@ -31,6 +31,9 @@
 static bfd_boolean warn_signed_overflows   = FALSE;
 static bfd_boolean warn_unsigned_overflows = FALSE;
 
+/* Non-zero if floating point insns are not being used.  */
+static signed int soft_float = -1;
+
 /* Indicates the target BFD machine number.  */
 static int machine = -1;
 
@@ -1537,6 +1540,8 @@ struct option md_longopts[] =
 
 size_t md_longopts_size = sizeof (md_longopts);
 
+static bfd_boolean v850_data_8 = FALSE;
+
 void
 md_show_usage (FILE *stream)
 {
@@ -1560,6 +1565,8 @@ md_show_usage (FILE *stream)
   fprintf (stream, _("  -mrh850-abi               Mark the binary as using the RH850 ABI (default)\n"));
   fprintf (stream, _("  -m8byte-align             Mark the binary as using 64-bit alignment\n"));
   fprintf (stream, _("  -m4byte-align             Mark the binary as using 32-bit alignment (default)\n"));
+  fprintf (stream, _("  -msoft-float              Mark the binary as not using FP insns (default for pre e2v3)\n"));
+  fprintf (stream, _("  -mhard-float              Mark the binary as using FP insns (default for e2v3 and up)\n"));
 }
 
 int
@@ -1645,6 +1652,14 @@ md_parse_option (int c, char *arg)
       v850_target_arch = bfd_arch_v850_rh850;
       v850_target_format = "elf32-v850-rh850";
     }
+  else if (strcmp (arg, "8byte-align") == 0)
+    v850_data_8 = TRUE;
+  else if (strcmp (arg, "4byte-align") == 0)
+    v850_data_8 = FALSE;
+  else if (strcmp (arg, "soft-float") == 0)
+    soft_float = 1;
+  else if (strcmp (arg, "hard-float") == 0)
+    soft_float = 0;
   else if (strcmp (arg, "8byte-align") == 0)
     v850_e_flags |= EF_RH850_DATA_ALIGN8;
   else if (strcmp (arg, "4byte-align") == 0)
@@ -1940,6 +1955,9 @@ md_begin (void)
     as_bad (_("Unable to determine default target processor from string: %s"),
            TARGET_CPU);
 
+  if (soft_float == -1)
+    soft_float = machine < bfd_mach_v850e2v3;
+
   v850_hash = hash_new ();
 
   /* Insert unique names into hash table.  The V850 instruction set
@@ -3716,3 +3734,73 @@ v850_force_relocation (struct fix *fixP)
 
   return generic_force_reloc (fixP);
 }
+
+/* Create a v850 note section.  */
+void
+v850_md_end (void)
+{
+  segT note_sec;
+  segT orig_seg = now_seg;
+  subsegT orig_subseg = now_subseg;
+  enum v850_notes id;
+
+  note_sec = subseg_new (V850_NOTE_SECNAME, 0);
+  bfd_set_section_flags (stdoutput, note_sec, SEC_HAS_CONTENTS | SEC_READONLY | SEC_MERGE);
+  bfd_set_section_alignment (stdoutput, note_sec, 2);
+
+  /* Provide default values for all of the notes.  */
+  for (id = V850_NOTE_ALIGNMENT; id <= NUM_V850_NOTES; id++)
+    {
+      int val = 0;
+      char * p;
+
+      /* Follow the standard note section layout:
+        First write the length of the name string.  */
+      p = frag_more (4);
+      md_number_to_chars (p, 4, 4);
+
+      /* Next comes the length of the "descriptor", i.e., the actual data.  */
+      p = frag_more (4);
+      md_number_to_chars (p, 4, 4);
+
+      /* Write the note type.  */
+      p = frag_more (4);
+      md_number_to_chars (p, (valueT) id, 4);
+
+      /* Write the name field.  */
+      p = frag_more (4);
+      memcpy (p, V850_NOTE_NAME, 4);
+
+      /* Finally, write the descriptor.  */
+      p = frag_more (4);
+      switch (id)
+       {
+       case V850_NOTE_ALIGNMENT:
+         val = v850_data_8 ? EF_RH850_DATA_ALIGN8 : EF_RH850_DATA_ALIGN4;
+         break;
+
+       case V850_NOTE_DATA_SIZE:
+         /* GCC does not currently support an option
+            for 32-bit doubles with the V850 backend.  */
+         val = EF_RH850_DOUBLE64;
+         break;
+
+       case V850_NOTE_FPU_INFO:
+         if (! soft_float)
+           switch (machine)
+             {
+             case bfd_mach_v850e3v5: val = EF_RH850_FPU30; break;
+             case bfd_mach_v850e2v3: val = EF_RH850_FPU20; break;
+             default: break;
+             }
+         break;
+
+       default:
+         break;
+       }
+      md_number_to_chars (p, val, 4);
+    }
+
+  /* Paranoia - we probably do not need this.  */
+  subseg_set (orig_seg, orig_subseg);
+}
index 0808bd8eccd9b1370fef6969d51f94fef5264c57..efce415dfb5a834ce96142845c6d71b96ed5e9bf 100644 (file)
@@ -84,3 +84,6 @@ extern long v850_pcrel_from_section (struct fix *, asection *);
    processed so that the resulting value can be inserted correctly.  */
 #define TC_FIX_TYPE             void *
 #define TC_INIT_FIX_DATA(fixP)  (fixP)->tc_fix_data = NULL
+
+#define md_end v850_md_end
+extern void    v850_md_end (void);
index 0e4e05ba6335c8f75dd40e75a42b1943b883d754..2f78f5140034e465704bc4943871a5aba7798df4 100644 (file)
@@ -100,24 +100,39 @@ attempt to relax them.
 
 @cindex @code{-mgcc-abi} command line option, V850
 @item -mgcc-abi
-Marks the generated objecy file as supporting the old GCC ABI.
+Marks the generated object file as supporting the old GCC ABI.
 
 @cindex @code{-mrh850-abi} command line option, V850
 @item -mrh850-abi
-Marks the generated objecy file as supporting the RH850 ABI.  This is
+Marks the generated object file as supporting the RH850 ABI.  This is
 the default.
 
 @cindex @code{-m8byte-align} command line option, V850
 @item -m8byte-align
-Marks the generated objecy file as supporting a maximum 64-bits of
+Marks the generated object file as supporting a maximum 64-bits of
 alignment for variables defined in the source code.
 
 @cindex @code{-m4byte-align} command line option, V850
 @item -m4byte-align
-Marks the generated objecy file as supporting a maximum 32-bits of
+Marks the generated object file as supporting a maximum 32-bits of
 alignment for variables defined in the source code.  This is the
 default.
 
+@cindex @code{-msoft-float} command line option, V850
+@item -msoft-float
+Marks the generated object file as not using any floating point
+instructions - and hence can be linked with other V850 binaries
+that do or do not use floating point.  This is the default for
+binaries for architectures earlier than the @code{e2v3}.
+
+@cindex @code{-mhard-float} command line option, V850
+@item -mhard-float
+Marks the generated object file as one that uses floating point
+instructions - and hence can only be linked with other V850 binaries
+that use the same kind of floating point instructions, or with
+binaries that do not use floating point at all.  This is the default
+for binaries the @code{e2v3} and later architectures.
+
 @end table
 
 @node V850 Syntax
index 1c10644ac254958fb986b31366e4ed4f446888e9..615e3a6338de4a834f0f5ccb620bbada1f1857cd 100644 (file)
@@ -1,3 +1,9 @@
+2015-02-24  Nick Clifton  <nickc@redhat.com>
+
+       * gas/elf/elf.exp: Add special version of the section2 test for
+       the V850.
+       * gas/elf/section2.e-v850: New file.
+
 2015-02-09  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * gas/arm/armv1.l: Remove 'Warning: ' from expected messages
index 2398e88ad16d84f72b1994b596f1debf83e053e1..47b5a21b030d82b56c0f3cbf460d221d01a51bbe 100644 (file)
@@ -76,6 +76,9 @@ if { [is_elf_format] } then {
     if {[istarget "rx-*-*"]} then {
        set target_machine -rx
     }
+    if {[istarget "v850*-*-*"]} then {
+       set target_machine -v850
+    }
     if {[istarget "arm*-*-*"]} {
        set target_machine -arm
     }
diff --git a/gas/testsuite/gas/elf/section2.e-v850 b/gas/testsuite/gas/elf/section2.e-v850
new file mode 100644 (file)
index 0000000..115bae2
--- /dev/null
@@ -0,0 +1,9 @@
+
+Symbol table '.symtab' contains 6 entries:
+ +Num: +Value +Size +Type +Bind +Vis +Ndx +Name
+ +0: 0+0 +0 +NOTYPE +LOCAL +DEFAULT +UND 
+ +1: 0+0 +0 +SECTION +LOCAL +DEFAULT +1 
+ +2: 0+0 +0 +SECTION +LOCAL +DEFAULT +2 
+ +3: 0+0 +0 +SECTION +LOCAL +DEFAULT +3 
+ +4: 0+0 +0 +SECTION +LOCAL +DEFAULT +4 
+ +5: 0+0 +0 +SECTION +LOCAL +DEFAULT +5 
index 1fccebc6dfbd4a056cdc6038c828f492dfcf3e10..69151cb7793e22a5ad6747f9f00265998c88050e 100644 (file)
@@ -1,3 +1,17 @@
+2015-02-24  Nick Clifton  <nickc@redhat.com>
+
+       * v850.h (EF_RH850_SIMD): Delete deprecated flag.
+       (EF_RH850_CACHE): Likewise.
+       (EF_RH850_MMU): Likewise.
+       (EF_RH850_DATA_ALIGN8): Likewise.
+       (SHT_RENESAS_IOP): Fix typo in name.
+       (SHT_RENESAS_INFO): Define.
+       (V850_NOTE_SECNAME): Define.
+       (SIZEOF_V850_NOTE): Define.
+       (V850_NOTE_NAME): Define.
+       (enum v850_notes): New enum.
+       (NUM_V850_NOTES): Define.
+
 2015-02-23  Nick Clifton  <nickc@redhat.com>
 
        PR 17915
index 5cc358170afadb22f6a6b56d55afd724504bf894..0a2784bc9d584782ca0df3edb57a276a90a6b832 100644 (file)
@@ -158,12 +158,8 @@ END_RELOC_NUMBERS (R_V850_max)
 
 #define EF_RH850_FPU_DOUBLE    0x00000001      /* sizeof(double) == 8.  */
 #define EF_RH850_FPU_SINGLE    0x00000002      /* sizeof(double) == 4.  */
-#define EF_RH850_SIMD          0x00000004
-#define EF_RH850_CACHE         0x00000008
-#define EF_RH850_MMU           0x00000010
 #define EF_RH850_REGMODE22     0x00000020      /* Registers r15-r24 (inclusive) are not used.  */
 #define EF_RH850_REGMODE32     0x00000040
-#define EF_RH850_DATA_ALIGN8   0x00000080      /* 8-byte alignment supported.  */
 #define EF_RH850_GP_FIX                0x00000100      /* r4 is fixed.  */
 #define EF_RH850_GP_NOFIX      0x00000200      /* r4 is callee save.  */
 #define EF_RH850_EP_FIX                0x00000400      /* r30 is fixed.  */
@@ -173,7 +169,7 @@ END_RELOC_NUMBERS (R_V850_max)
 #define EF_RH850_REG2_RESERVE  0x00004000      /* r2 is fixed.  */
 #define EF_RH850_REG2_NORESERVE 0x00008000     /* r2 is callee saved.  */
 
-#define SHT_RNESAS_IOP         SHT_LOUSER      /* Used by Renesas linker.  */
+#define SHT_RENESAS_IOP                SHT_LOUSER      /* Used by Renesas linker.  */
 
 #define SHF_RENESAS_ABS                0x80000000      /* Absolute section.  */
 #define SHF_GHS_ABS            0x00000400      /* Use unknown.  */
@@ -280,4 +276,54 @@ START_RELOC_NUMBERS (v800_reloc_type)
 
 END_RELOC_NUMBERS (R_V800_max)
 
+/* Type for Renesas note sections.  NB/ This is in application space
+   rather than processor space as it refers to the requirements of the
+   binary concerned.  A given processor may be able to handle multiple
+   different types of application.  */
+#define SHT_RENESAS_INFO       0xa0000000
+
+/* Contents of a Renesas note entry:
+
+     namesz +------------------+
+            |    4             |  "REL\0"
+     descsz +------------------+
+            |    4             |  Currently 4byte only
+     type   +------------------+
+            |    ID            |
+     name   +------------------+
+            |    REL\0         |
+     desc   +------------------+
+            |    Value         |
+            +------------------+  */
+
+#define V850_NOTE_SECNAME      ".note.renesas"
+#define SIZEOF_V850_NOTE       20
+#define V850_NOTE_NAME         "REL"
+
+enum v850_notes
+{
+  V850_NOTE_ALIGNMENT =        1,      /* Alignment of 8-byte entities.  */
+#define EF_RH850_DATA_ALIGN4   0x0001  /* Aligned to 4-byte bounadries.  */
+#define EF_RH850_DATA_ALIGN8   0x0002  /* Aligned to 8-byte bounadries.  */
+
+  V850_NOTE_DATA_SIZE =        2,      /* Sizeof double and long double.  */
+#define EF_RH850_DOUBLE32      0x0001  /* 32-bits in size.  */
+#define EF_RH850_DOUBLE64      0x0002  /* 64-bits in size.  */
+
+  V850_NOTE_FPU_INFO = 3,      /* Defined if extended floating point insns are used.  */
+#define EF_RH850_FPU20         0x0001  /* Set if [N]]M{ADD|SUB}F.S are used.  */
+#define EF_RH850_FPU30         0x0002  /* Set if ADSF.D or ADDF.D is used.  */
+
+  V850_NOTE_SIMD_INFO = 4,
+#define EF_RH850_SIMD          0x0001
+
+  V850_NOTE_CACHE_INFO = 5,
+#define EF_RH850_CACHE         0x0001
+
+  V850_NOTE_MMU_INFO = 6
+#define EF_RH850_MMU           0x0001
+};
+
+#define NUM_V850_NOTES V850_NOTE_MMU_INFO
+
 #endif /* _ELF_V850_H */
index 4db576cce742a94debd99004987c4e3e41c946f3..d7c841c88b9d11ce2ce9949c656f16f45490a0c8 100644 (file)
@@ -1,3 +1,15 @@
+2015-02-24  Nick Clifton  <nickc@redhat.com>
+
+       * Makefile.am (ev850.c): Add dependency upon
+       $(srcdir)/emultempl/v850elf.em.
+       (ev850_rh850.c): Likewise.
+       * Makefile.in: Regenerate.
+       * emultempl/v850elf.em: New file.
+       * emulparams/v850.sh (EXTRA_EM_FILE): Define.
+       * emulparams/v850_rh850.sh (EXTRA_EM_FILE): Define.
+       * scripttempl/v850.sc: Add .note.renesas section.
+       * scripttempl/v850_rh850.sc: Likewise.
+
 2015-02-24  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>
 
        * scripttempl/avr.sc: Add new user_signatures region.  Define and
index 11de1c43f0d5c22d5882463c2f646eb6a2e7d4a6..58daa41fcb0d9ed60a961515b467b92fe6133057 100644 (file)
@@ -1777,10 +1777,10 @@ etic54xcoff.c: $(srcdir)/emulparams/tic54xcoff.sh \
 etic80coff.c: $(srcdir)/emulparams/tic80coff.sh \
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/tic80coff.sc ${GEN_DEPENDS}
 
-ev850.c: $(srcdir)/emulparams/v850.sh \
+ev850.c: $(srcdir)/emulparams/v850.sh $(srcdir)/emultempl/v850elf.em \
   $(ELF_DEPS) $(srcdir)/scripttempl/v850.sc ${GEN_DEPENDS}
 
-ev850_rh850.c: $(srcdir)/emulparams/v850_rh850.sh \
+ev850_rh850.c: $(srcdir)/emulparams/v850_rh850.sh $(srcdir)/emultempl/v850elf.em \
   $(ELF_DEPS) $(srcdir)/scripttempl/v850_rh850.sc ${GEN_DEPENDS}
 
 evanilla.c: $(srcdir)/emulparams/vanilla.sh \
index 9b803d73822faf3dda0b0f63cde019600a439d1f..83dc7f18e4ca50bbb538262e1e558b4c80abeeca 100644 (file)
@@ -3264,10 +3264,10 @@ etic54xcoff.c: $(srcdir)/emulparams/tic54xcoff.sh \
 etic80coff.c: $(srcdir)/emulparams/tic80coff.sh \
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/tic80coff.sc ${GEN_DEPENDS}
 
-ev850.c: $(srcdir)/emulparams/v850.sh \
+ev850.c: $(srcdir)/emulparams/v850.sh $(srcdir)/emultempl/v850elf.em \
   $(ELF_DEPS) $(srcdir)/scripttempl/v850.sc ${GEN_DEPENDS}
 
-ev850_rh850.c: $(srcdir)/emulparams/v850_rh850.sh \
+ev850_rh850.c: $(srcdir)/emulparams/v850_rh850.sh $(srcdir)/emultempl/v850elf.em \
   $(ELF_DEPS) $(srcdir)/scripttempl/v850_rh850.sc ${GEN_DEPENDS}
 
 evanilla.c: $(srcdir)/emulparams/vanilla.sh \
index 96cdc6808848a59c2c3e9a38cd37ad64e0391305..c2bdda3273683b9eb19f8f67e76e7d48e7b6c6fb 100644 (file)
@@ -1,5 +1,6 @@
 MACHINE=
 SCRIPT_NAME=v850
+EXTRA_EM_FILE=v850elf
 OUTPUT_FORMAT="elf32-v850"
 TEXT_START_ADDR=0x100000
 ZDATA_START_ADDR=0x160
index 4315d2b95d976e2fd8522ec1d2af7b055c8b27c1..febdad3d1844d7d1f2532720a28ae0b791b31509 100644 (file)
@@ -1,5 +1,6 @@
 MACHINE=
 SCRIPT_NAME=v850_rh850
+EXTRA_EM_FILE=v850elf
 OUTPUT_FORMAT="elf32-v850-rh850"
 TEXT_START_ADDR=0x100000
 ZDATA_START_ADDR=0x160
diff --git a/ld/emultempl/v850elf.em b/ld/emultempl/v850elf.em
new file mode 100644 (file)
index 0000000..6f9f0d2
--- /dev/null
@@ -0,0 +1,54 @@
+# This shell script emits a C file. -*- C -*-
+#   Copyright 2013-2015 Free Software Foundation, Inc.
+#
+# This file is part of the GNU Binutils.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+#
+
+# This file is sourced from elf32.em, and defines extra cpu specific
+# features.
+#
+fragment <<EOF
+#include "ldctor.h"
+
+static bfd_boolean
+is_v850_target (void)
+{
+  extern const bfd_target v850_elf32_vec;
+  extern const bfd_target v800_elf32_vec;
+
+  return link_info.output_bfd->xvec == & v850_elf32_vec
+      || link_info.output_bfd->xvec == & v800_elf32_vec;
+}
+
+/* Create our note section.  */
+
+static void
+v850_after_open (void)
+{
+  if (is_v850_target ()
+      && ! link_info.relocatable
+      && link_info.input_bfds != NULL
+      && ! v850_elf_create_sections (& link_info))
+       einfo ("%X%P: can not create note section: %E\n");
+
+  gld${EMULATION_NAME}_after_open ();
+}
+
+EOF
+
+LDEMUL_AFTER_OPEN=v850_after_open
index d8a873e5c4632dd148649397bbb50338ca103a3d..ef6c92ec594804530324e3fec912a6879188b81a 100644 (file)
@@ -194,6 +194,8 @@ SECTIONS
   ${RELOCATING+PROVIDE (end = .);}
   ${RELOCATING+PROVIDE (_heap_start = .);}
 
+  .note.renesas 0 : { KEEP(*(.note.renesas)) }  
+
   /* Stabs debugging sections.  */
   .stab 0              : { *(.stab) }
   .stabstr 0           : { *(.stabstr) }
index 63a3937df9597b4eba182a68ed77b0868ac5a9b2..0316a36060287214dec055087105b172432b2939 100644 (file)
@@ -214,6 +214,8 @@ SECTIONS
   ${RELOCATING+PROVIDE (end = .);}
   ${RELOCATING+PROVIDE (_heap_start = .);}
 
+  .note.renesas 0 : { KEEP(*(.note.renesas)) }  
+
   /* Stabs debugging sections.  */
   .stab 0              : { *(.stab) }
   .stabstr 0           : { *(.stabstr) }
index 588302204ffb8d616202b6f717968743d97ed116..869e48fb6e243c134bf64843af561c26ee8c9cc0 100644 (file)
@@ -1,3 +1,7 @@
+2015-02-24  Nick Clifton  <nickc@redhat.com>
+
+       * ld-elf/extract-symbol-1sec.d: Expect to fail on the V850.
+
 2015-02-24  Alan Modra  <amodra@gmail.com>
 
        * ld-elf/merge3.s, * ld-elf/merge3.d: New test.
index 57a56625b57fb7bd3c8082e30e992ab3b60be9ab..35ca898a180cd8e5f245cf1226ee76fcf3858b3c 100644 (file)
@@ -3,8 +3,9 @@
 #ld: -Textract-symbol-1.ld
 #objcopy_linked_file: --extract-symbol
 #objdump: --headers
-#xfail: "hppa*-*-*" "rx-*-*"
+#xfail: "hppa*-*-*" "rx-*-*" "v850*-*-*"
 # FAILS on the RX because the linker has to set LMA == VMA for the Renesas loader.
+# FAILS on the V850 because an extra section - .note.renesas - is created.
 #...
 Sections:
  *Idx +Name +Size +VMA +LMA .*