This adds support for marking RL78 binaries as either supporting 32-bit
authorKaushik Phata <Kaushik.Phatak@kpit.com>
Fri, 16 May 2014 13:57:10 +0000 (14:57 +0100)
committerNick Clifton <nickc@redhat.com>
Fri, 16 May 2014 13:57:10 +0000 (14:57 +0100)
or 64-bit doubles.  It also makes the linker complain if the user attempts
to link together binaries with different sized doubles.

* elf32-rl78.c (rl78_elf_merge_private_bfd_data): Complain if
64-bit doubles objects mix with 32-bit doubles objects.
(rl78_elf_print_private_bfd_data): Describe 64-bit doubles flag.

* readelf.c (get_machine_flags): Handle RL78 64-bit doubles flag.

* config/tc-rl78.c (enum options): Add OPTION_32BIT_DOUBLES
and OPTION_64BIT_DOUBLES.
(md_longopts): Add -m32bit-doubles and -m64bit-doubles.
(md_parse_option): Parse -m32bit-doubles and -m64bit-doubles.
(md_show_usage): Show all of the RL78 options.
(rl78_float_cons): New static functions.
(md_pseudo_table): Update handler for "double".

bfd/ChangeLog
bfd/elf32-rl78.c
binutils/ChangeLog
binutils/readelf.c
gas/ChangeLog
gas/config/tc-rl78.c
gas/doc/as.texinfo
gas/doc/c-rl78.texi

index 3c0aa71..de40fb7 100644 (file)
@@ -1,3 +1,9 @@
+2014-05-16  Kaushik Phata  <Kaushik.Phatak@kpit.com>
+
+       * elf32-rl78.c (rl78_elf_merge_private_bfd_data): Complain if
+       64-bit doubles objects mix with 32-bit doubles objects.
+       (rl78_elf_print_private_bfd_data): Describe 64-bit doubles flag.
+
 2014-05-08  Hans-Peter Nilsson  <hp@bitrange.com>
 
        * mmo.c: Update URLs in documentation comments.
index 7b66971..5e62edd 100644 (file)
@@ -1049,6 +1049,19 @@ rl78_elf_merge_private_bfd_data (bfd * ibfd, bfd * obfd)
            (*_bfd_error_handler) (_("- %s is G10, %s is not"),
                                   bfd_get_filename (ibfd), bfd_get_filename (obfd));
        }
+
+      if (changed_flags & E_FLAG_RL78_64BIT_DOUBLES)
+       {
+         (*_bfd_error_handler)
+           (_("RL78 merge conflict: cannot link 32-bit and 64-bit objects together"));
+
+         if (old_flags & E_FLAG_RL78_64BIT_DOUBLES)
+           (*_bfd_error_handler) (_("- %s is 64-bit, %s is not"),
+                                  bfd_get_filename (obfd), bfd_get_filename (ibfd));
+         else
+           (*_bfd_error_handler) (_("- %s is 64-bit, %s is not"),
+                                  bfd_get_filename (ibfd), bfd_get_filename (obfd));
+       }    
     }
 
   return !error;
@@ -1071,6 +1084,9 @@ rl78_elf_print_private_bfd_data (bfd * abfd, void * ptr)
   if (flags & E_FLAG_RL78_G10)
     fprintf (file, _(" [G10]"));
 
+  if (flags & E_FLAG_RL78_64BIT_DOUBLES)
+    fprintf (file, _(" [64-bit doubles]"));
+
   fputc ('\n', file);
   return TRUE;
 }
index 922317f..66f2ec1 100644 (file)
@@ -1,3 +1,7 @@
+2014-05-16  Kaushik Phata  <Kaushik.Phatak@kpit.com>
+
+       * readelf.c (get_machine_flags): Handle RL78 64-bit doubles flag.
+
 2014-05-02  Alan Modra  <amodra@gmail.com>
 
        * emul_aix.c: Update bfd target vector naming.
index 9cafd7c..af6463e 100644 (file)
@@ -3009,6 +3009,8 @@ get_machine_flags (unsigned e_flags, unsigned e_machine)
        case EM_RL78:
          if (e_flags & E_FLAG_RL78_G10)
            strcat (buf, ", G10");
+         if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
+           strcat (buf, ", 64-bit doubles");
          break;
 
        case EM_RX:
index e5e6785..fa1d46b 100644 (file)
@@ -1,3 +1,15 @@
+2014-05-16  Kaushik Phata  <Kaushik.Phatak@kpit.com>
+
+       * config/tc-rl78.c (enum options): Add OPTION_32BIT_DOUBLES
+       and OPTION_64BIT_DOUBLES.
+       (md_longopts): Add -m32bit-doubles and -m64bit-doubles.
+       (md_parse_option): Parse -m32bit-doubles and -m64bit-doubles.
+       (md_show_usage): Show all of the RL78 options.
+       (rl78_float_cons): New static functions.
+       (md_pseudo_table): Update handler for "double".
+       * doc/c-rl78.texi: Document new options.
+       * doc/as.texinfo: Likewise.
+
 2014-05-13  Matthew Fortune  <matthew.fortune@imgtec.com>
 
        * config/tc-mips.c (mips_set_options): Rename gp32 to gp throughout.
index bbbf47b..0cd7e5b 100644 (file)
@@ -282,6 +282,8 @@ enum options
 {
   OPTION_RELAX = OPTION_MD_BASE,
   OPTION_G10,
+  OPTION_32BIT_DOUBLES,
+  OPTION_64BIT_DOUBLES,
 };
 
 #define RL78_SHORTOPTS ""
@@ -292,6 +294,8 @@ struct option md_longopts[] =
 {
   {"relax", no_argument, NULL, OPTION_RELAX},
   {"mg10", no_argument, NULL, OPTION_G10},
+  {"m32bit-doubles", no_argument, NULL, OPTION_32BIT_DOUBLES},
+  {"m64bit-doubles", no_argument, NULL, OPTION_64BIT_DOUBLES},
   {NULL, no_argument, NULL, 0}
 };
 size_t md_longopts_size = sizeof (md_longopts);
@@ -308,6 +312,14 @@ md_parse_option (int c, char * arg ATTRIBUTE_UNUSED)
     case OPTION_G10:
       elf_flags |= E_FLAG_RL78_G10;
       return 1;
+
+    case OPTION_32BIT_DOUBLES:
+      elf_flags &= ~ E_FLAG_RL78_64BIT_DOUBLES;
+      return 1;
+
+    case OPTION_64BIT_DOUBLES:
+      elf_flags |= E_FLAG_RL78_64BIT_DOUBLES;
+      return 1;
     }
   return 0;
 }
@@ -315,9 +327,12 @@ md_parse_option (int c, char * arg ATTRIBUTE_UNUSED)
 void
 md_show_usage (FILE * stream ATTRIBUTE_UNUSED)
 {
+  fprintf (stream, _(" RL78 specific command line options:\n"));
+  fprintf (stream, _("  --mg10            Enable support for G10 variant\n"));
+  fprintf (stream, _("  --m32bit-doubles  [default]\n"));
+  fprintf (stream, _("  --m64bit-doubles\n"));
 }
 
-
 static void
 s_bss (int ignore ATTRIBUTE_UNUSED)
 {
@@ -328,15 +343,23 @@ s_bss (int ignore ATTRIBUTE_UNUSED)
   demand_empty_rest_of_line ();
 }
 
+static void
+rl78_float_cons (int ignore ATTRIBUTE_UNUSED)
+{
+  if (elf_flags & E_FLAG_RL78_64BIT_DOUBLES)
+    return float_cons ('d');
+  return float_cons ('f');
+}
+
 /* The target specific pseudo-ops which we support.  */
 const pseudo_typeS md_pseudo_table[] =
 {
-  /* Our "standard" pseudos. */
-  { "double",   float_cons,    'd' },
-  { "bss",     s_bss,          0 },
-  { "3byte",   cons,           3 },
-  { "int",     cons,           4 },
-  { "word",    cons,           4 },
+  /* Our "standard" pseudos.  */
+  { "double", rl78_float_cons, 'd' },
+  { "bss",    s_bss,           0 },
+  { "3byte",  cons,            3 },
+  { "int",    cons,            4 },
+  { "word",   cons,            4 },
 
   /* End of list marker.  */
   { NULL,      NULL,           0 }
index 5759e9b..0f0956c 100644 (file)
@@ -479,6 +479,12 @@ gcc(1), ld(1), and the Info entries for @file{binutils} and @file{ld}.
    [@b{-msolaris}|@b{-mno-solaris}]
    [@b{-nops=@var{count}}]
 @end ifset
+@ifset RL78
+
+@emph{Target RL78 options:}
+   [@b{-mg10}]
+   [@b{-m32bit-doubles}|@b{-m64bit-doubles}]
+@end ifset
 @ifset RX
 
 @emph{Target RX options:}
index dce833b..a714548 100644 (file)
@@ -32,6 +32,14 @@ Enable support for link-time relaxation.
 Mark the generated binary as targeting the G10 variant of the RL78
 architecture.
 
+@item m32bit-doubles
+Mark the generated binary as one that uses 32-bits to hold the
+@code{double} floating point type.  This is the default.
+
+@item m64bit-doubles
+Mark the generated binary as one that uses 64-bits to hold the
+@code{double} floating point type.
+
 @end table
 
 @node RL78-Modifiers
@@ -85,8 +93,10 @@ In addition to the common directives, the RL78 adds these:
 @table @code
 
 @item .double
-Output a constant in ``double'' format, which is a 32-bit floating
-point value on RL78.
+Output a constant in ``double'' format, which is either a 32-bit
+or a 64-bit floating point value, depending upon the setting of the
+@option{-m32bit-doubles}|@option{-m64bit-doubles} command line
+option.
 
 @item .bss
 Select the BSS section.