diff options
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 11 | ||||
-rw-r--r-- | gas/config/tc-moxie.c | 113 | ||||
-rw-r--r-- | gas/config/tc-moxie.h | 10 |
3 files changed, 104 insertions, 30 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 0304941..999e20b 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,14 @@ +2012-09-13 Anthony Green <green@moxielogic.com> + + * config/tc-moxie.h (DEFAULT_TARGET_FORMAT): Define. + (TARGET_FORMAT): Don't hard-code endian-ness. + * config/tc-moxie.c (target_big_endian, moxie_target_format): + Define. + (md_assemble): Handle bi-endian encodings. + (md_shortopts, md_parse_option, md_show_usage, md_apply_fix) + (md_number_to_chars, md_chars_to_number): Update for bi-endian + support. + 2012-09-12 Chris Schlumberger-Socha <chris.schlumberger-socha@arm.com> * config/tc-aarch64.c diff --git a/gas/config/tc-moxie.c b/gas/config/tc-moxie.c index e73887d..fa8ace5 100644 --- a/gas/config/tc-moxie.c +++ b/gas/config/tc-moxie.c @@ -1,5 +1,5 @@ /* tc-moxie.c -- Assemble code for moxie - Copyright 2009 + Copyright 2009, 2012 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -43,7 +43,11 @@ const pseudo_typeS md_pseudo_table[] = const char FLT_CHARS[] = "rRsSfFdDxXpP"; const char EXP_CHARS[] = "eE"; -static int md_chars_to_number (char *val, int n); +static valueT md_chars_to_number (char * buf, int n); + +/* Byte order. */ +extern int target_big_endian; +const char *moxie_target_format = DEFAULT_TARGET_FORMAT; void md_operand (expressionS *op __attribute__((unused))) @@ -203,7 +207,7 @@ md_assemble (char *str) op_end++; op_end = parse_exp_save_ilp (op_end, &arg); fix_new_exp (frag_now, - ((p+1) - frag_now->fr_literal), + ((p + (target_big_endian ? 1 : 0)) - frag_now->fr_literal), 1, &arg, 0, @@ -589,26 +593,50 @@ md_atof (int type, char *litP, int *sizeP) return NULL; } - -const char *md_shortopts = ""; + +enum options +{ + OPTION_EB = OPTION_MD_BASE, + OPTION_EL, +}; struct option md_longopts[] = { - {NULL, no_argument, NULL, 0} + { "EB", no_argument, NULL, OPTION_EB}, + { "EL", no_argument, NULL, OPTION_EL}, + { NULL, no_argument, NULL, 0} }; + size_t md_longopts_size = sizeof (md_longopts); + +const char *md_shortopts = ""; -/* We have no target specific options yet, so these next - two functions are empty. */ int md_parse_option (int c ATTRIBUTE_UNUSED, char *arg ATTRIBUTE_UNUSED) { - return 0; + switch (c) + { + case OPTION_EB: + target_big_endian = 1; + moxie_target_format = "elf32-bigmoxie"; + break; + case OPTION_EL: + target_big_endian = 0; + moxie_target_format = "elf32-littlemoxie"; + break; + default: + return 0; + } + + return 1; } void md_show_usage (FILE *stream ATTRIBUTE_UNUSED) { + fprintf (stream, _("\ + -EB assemble for a big endian system (default)\n\ + -EL assemble for a little endian system\n")); } /* Apply a fixup to the object file. */ @@ -626,15 +654,35 @@ md_apply_fix (fixS *fixP ATTRIBUTE_UNUSED, switch (fixP->fx_r_type) { case BFD_RELOC_32: - *buf++ = val >> 24; - *buf++ = val >> 16; - *buf++ = val >> 8; - *buf++ = val >> 0; + if (target_big_endian) + { + buf[0] = val >> 24; + buf[1] = val >> 16; + buf[2] = val >> 8; + buf[3] = val >> 0; + } + else + { + buf[3] = val >> 24; + buf[2] = val >> 16; + buf[1] = val >> 8; + buf[0] = val >> 0; + } + buf += 4; break; case BFD_RELOC_16: - *buf++ = val >> 8; - *buf++ = val >> 0; + if (target_big_endian) + { + buf[0] = val >> 8; + buf[1] = val >> 0; + } + else + { + buf[1] = val >> 8; + buf[0] = val >> 0; + } + buf += 2; break; case BFD_RELOC_8: @@ -665,28 +713,43 @@ md_apply_fix (fixS *fixP ATTRIBUTE_UNUSED, fixP->fx_done = 1; } -/* Put number into target byte order (big endian). */ +/* Put number into target byte order. */ void -md_number_to_chars (char *ptr, valueT use, int nbytes) +md_number_to_chars (char * ptr, valueT use, int nbytes) { - number_to_chars_bigendian (ptr, use, nbytes); + if (target_big_endian) + number_to_chars_bigendian (ptr, use, nbytes); + else + number_to_chars_littleendian (ptr, use, nbytes); } /* Convert from target byte order to host byte order. */ -static int -md_chars_to_number (char *val, int n) +static valueT +md_chars_to_number (char * buf, int n) { - int retval = 0; + valueT result = 0; + unsigned char * where = (unsigned char *) buf; - while (n--) + if (target_big_endian) + { + while (n--) + { + result <<= 8; + result |= (*where++ & 255); + } + } + else { - retval <<= 8; - retval |= (*val++ & 255); + while (n--) + { + result <<= 8; + result |= (where[n] & 255); + } } - return retval; + return result; } /* Generate a machine-dependent relocation. */ diff --git a/gas/config/tc-moxie.h b/gas/config/tc-moxie.h index db1d01a..af4fe51 100644 --- a/gas/config/tc-moxie.h +++ b/gas/config/tc-moxie.h @@ -1,6 +1,6 @@ /* tc-moxie.h -- Header file for tc-moxie.c. - Copyright 2009 Free Software Foundation, Inc. + Copyright 2009, 2012 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -22,11 +22,11 @@ #define TARGET_BYTES_BIG_ENDIAN 1 #define WORKING_DOT_WORD -/* This macro is the BFD target name to use when creating the output - file. This will normally depend upon the `OBJ_FMT' macro. */ -#define TARGET_FORMAT "elf32-moxie" - /* This macro is the BFD architecture to pass to `bfd_set_arch_mach'. */ +const char *moxie_target_format; +#define DEFAULT_TARGET_FORMAT "elf32-bigmoxie" +#define TARGET_FORMAT moxie_target_format + #define TARGET_ARCH bfd_arch_moxie #define md_undefined_symbol(NAME) 0 |