aboutsummaryrefslogtreecommitdiff
path: root/gas/config/tc-rl78.c
diff options
context:
space:
mode:
authorKaushik Phata <Kaushik.Phatak@kpit.com>2014-05-16 14:57:10 +0100
committerNick Clifton <nickc@redhat.com>2014-05-16 14:57:10 +0100
commit856ea05ccf051d4d86f422552f5cdfa83659dd6b (patch)
tree7fb8784ab04e753ddf24d2fc239b5986a4432a38 /gas/config/tc-rl78.c
parent73eb770959c8d8d927dbeafbf6038a651e0cb1ae (diff)
downloadgdb-856ea05ccf051d4d86f422552f5cdfa83659dd6b.zip
gdb-856ea05ccf051d4d86f422552f5cdfa83659dd6b.tar.gz
gdb-856ea05ccf051d4d86f422552f5cdfa83659dd6b.tar.bz2
This adds support for marking RL78 binaries as either supporting 32-bit
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".
Diffstat (limited to 'gas/config/tc-rl78.c')
-rw-r--r--gas/config/tc-rl78.c37
1 files changed, 30 insertions, 7 deletions
diff --git a/gas/config/tc-rl78.c b/gas/config/tc-rl78.c
index bbbf47b..0cd7e5b 100644
--- a/gas/config/tc-rl78.c
+++ b/gas/config/tc-rl78.c
@@ -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 }