X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Fconfig%2Ftc-moxie.c;h=9201cb58262e97ae1969b073b315c25ffdef9ba5;hb=87789e08e5cb2191af1122ed98af2d6c023b3a0a;hp=2eaa827193d646999419461dda90002aeebbc347;hpb=9c2799c243988c1a6d3fe93c7c2c06599672068d;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/config/tc-moxie.c b/gas/config/tc-moxie.c index 2eaa827193..9201cb5826 100644 --- a/gas/config/tc-moxie.c +++ b/gas/config/tc-moxie.c @@ -1,6 +1,5 @@ /* tc-moxie.c -- Assemble code for moxie - Copyright 2009 - Free Software Foundation, Inc. + Copyright (C) 2009-2016 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -43,7 +42,10 @@ 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; void md_operand (expressionS *op __attribute__((unused))) @@ -72,6 +74,8 @@ md_begin (void) for (count = 0, opcode = moxie_form3_opc_info; count++ < 10; opcode++) hash_insert (opcode_hash_control, opcode->name, (char *) opcode); + target_big_endian = TARGET_BYTES_BIG_ENDIAN; + bfd_set_arch_mach (stdoutput, TARGET_ARCH, 0); } @@ -97,7 +101,7 @@ parse_register_operand (char **ptr) if (*s != '$') { - as_bad ("expecting register"); + as_bad (_("expecting register")); ignore_rest_of_line (); return -1; } @@ -116,7 +120,7 @@ parse_register_operand (char **ptr) reg = s[2] - '0'; if ((reg < 0) || (reg > 9)) { - as_bad ("illegal register number"); + as_bad (_("illegal register number")); ignore_rest_of_line (); return -1; } @@ -132,7 +136,7 @@ parse_register_operand (char **ptr) } else { - as_bad ("illegal register number"); + as_bad (_("illegal register number")); ignore_rest_of_line (); return -1; } @@ -199,11 +203,11 @@ md_assemble (char *str) reg = parse_register_operand (&op_end); iword += (reg << 8); if (*op_end != ',') - as_warn ("expecting comma delimeted register operands"); + as_warn (_("expecting comma delimited register operands")); 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, @@ -218,14 +222,14 @@ md_assemble (char *str) int dest, src; dest = parse_register_operand (&op_end); if (*op_end != ',') - as_warn ("expecting comma delimeted register operands"); + as_warn (_("expecting comma delimited register operands")); op_end++; src = parse_register_operand (&op_end); iword += (dest << 4) + src; while (ISSPACE (*op_end)) op_end++; if (*op_end != 0) - as_warn ("extra stuff on line ignored"); + as_warn (_("extra stuff on line ignored")); } break; case MOXIE_F1_A4: @@ -245,7 +249,7 @@ md_assemble (char *str) if (*op_end != ',') { - as_bad ("expecting comma delimited operands"); + as_bad (_("expecting comma delimited operands")); ignore_rest_of_line (); return; } @@ -285,7 +289,7 @@ md_assemble (char *str) while (ISSPACE (*op_end)) op_end++; if (*op_end != 0) - as_warn ("extra stuff on line ignored"); + as_warn (_("extra stuff on line ignored")); break; case MOXIE_F1_A: iword = opcode->opcode << 8; @@ -297,7 +301,7 @@ md_assemble (char *str) while (ISSPACE (*op_end)) op_end++; if (*op_end != 0) - as_warn ("extra stuff on line ignored"); + as_warn (_("extra stuff on line ignored")); iword += (reg << 4); } break; @@ -309,11 +313,11 @@ md_assemble (char *str) int a, b; a = parse_register_operand (&op_end); if (*op_end != ',') - as_warn ("expecting comma delimeted register operands"); + as_warn (_("expecting comma delimited register operands")); op_end++; if (*op_end != '(') { - as_bad ("expecting indirect register `($rA)'"); + as_bad (_("expecting indirect register `($rA)'")); ignore_rest_of_line (); return; } @@ -321,7 +325,7 @@ md_assemble (char *str) b = parse_register_operand (&op_end); if (*op_end != ')') { - as_bad ("missing closing parenthesis"); + as_bad (_("missing closing parenthesis")); ignore_rest_of_line (); return; } @@ -330,7 +334,7 @@ md_assemble (char *str) while (ISSPACE (*op_end)) op_end++; if (*op_end != 0) - as_warn ("extra stuff on line ignored"); + as_warn (_("extra stuff on line ignored")); } break; case MOXIE_F1_AiB: @@ -341,7 +345,7 @@ md_assemble (char *str) int a, b; if (*op_end != '(') { - as_bad ("expecting indirect register `($rA)'"); + as_bad (_("expecting indirect register `($rA)'")); ignore_rest_of_line (); return; } @@ -349,20 +353,20 @@ md_assemble (char *str) a = parse_register_operand (&op_end); if (*op_end != ')') { - as_bad ("missing closing parenthesis"); + as_bad (_("missing closing parenthesis")); ignore_rest_of_line (); return; } op_end++; if (*op_end != ',') - as_warn ("expecting comma delimeted register operands"); + as_warn (_("expecting comma delimited register operands")); op_end++; b = parse_register_operand (&op_end); iword += (a << 4) + b; while (ISSPACE (*op_end)) op_end++; if (*op_end != 0) - as_warn ("extra stuff on line ignored"); + as_warn (_("extra stuff on line ignored")); } break; case MOXIE_F1_4A: @@ -385,7 +389,7 @@ md_assemble (char *str) if (*op_end != ',') { - as_bad ("expecting comma delimited operands"); + as_bad (_("expecting comma delimited operands")); ignore_rest_of_line (); return; } @@ -395,12 +399,12 @@ md_assemble (char *str) while (ISSPACE (*op_end)) op_end++; if (*op_end != 0) - as_warn ("extra stuff on line ignored"); + as_warn (_("extra stuff on line ignored")); iword += (a << 4); } break; - case MOXIE_F1_ABi4: + case MOXIE_F1_ABi2: iword = opcode->opcode << 8; while (ISSPACE (*op_end)) op_end++; @@ -415,24 +419,24 @@ md_assemble (char *str) if (*op_end != ',') { - as_bad ("expecting comma delimited operands"); + as_bad (_("expecting comma delimited operands")); ignore_rest_of_line (); return; } op_end++; op_end = parse_exp_save_ilp (op_end, &arg); - offset = frag_more (4); + offset = frag_more (2); fix_new_exp (frag_now, (offset - frag_now->fr_literal), - 4, + 2, &arg, 0, - BFD_RELOC_32); + BFD_RELOC_16); if (*op_end != '(') { - as_bad ("expecting indirect register `($rX)'"); + as_bad (_("expecting indirect register `($rX)'")); ignore_rest_of_line (); return; } @@ -440,7 +444,7 @@ md_assemble (char *str) b = parse_register_operand (&op_end); if (*op_end != ')') { - as_bad ("missing closing parenthesis"); + as_bad (_("missing closing parenthesis")); ignore_rest_of_line (); return; } @@ -449,12 +453,12 @@ md_assemble (char *str) while (ISSPACE (*op_end)) op_end++; if (*op_end != 0) - as_warn ("extra stuff on line ignored"); + as_warn (_("extra stuff on line ignored")); iword += (a << 4) + b; } break; - case MOXIE_F1_AiB4: + case MOXIE_F1_AiB2: iword = opcode->opcode << 8; while (ISSPACE (*op_end)) op_end++; @@ -464,17 +468,17 @@ md_assemble (char *str) int a, b; op_end = parse_exp_save_ilp (op_end, &arg); - offset = frag_more (4); + offset = frag_more (2); fix_new_exp (frag_now, (offset - frag_now->fr_literal), - 4, + 2, &arg, 0, - BFD_RELOC_32); + BFD_RELOC_16); if (*op_end != '(') { - as_bad ("expecting indirect register `($rX)'"); + as_bad (_("expecting indirect register `($rX)'")); ignore_rest_of_line (); return; } @@ -482,7 +486,7 @@ md_assemble (char *str) a = parse_register_operand (&op_end); if (*op_end != ')') { - as_bad ("missing closing parenthesis"); + as_bad (_("missing closing parenthesis")); ignore_rest_of_line (); return; } @@ -490,7 +494,7 @@ md_assemble (char *str) if (*op_end != ',') { - as_bad ("expecting comma delimited operands"); + as_bad (_("expecting comma delimited operands")); ignore_rest_of_line (); return; } @@ -503,7 +507,7 @@ md_assemble (char *str) while (ISSPACE (*op_end)) op_end++; if (*op_end != 0) - as_warn ("extra stuff on line ignored"); + as_warn (_("extra stuff on line ignored")); iword += (a << 4) + b; } @@ -513,7 +517,7 @@ md_assemble (char *str) while (ISSPACE (*op_end)) op_end++; if (*op_end != 0) - as_warn ("extra stuff on line ignored"); + as_warn (_("extra stuff on line ignored")); break; case MOXIE_F3_PCREL: iword = (3<<14) | (opcode->opcode << 10); @@ -532,7 +536,7 @@ md_assemble (char *str) } break; default: - abort(); + abort (); } md_number_to_chars (p, iword, 2); @@ -541,10 +545,10 @@ md_assemble (char *str) op_end++; if (*op_end != 0) - as_warn ("extra stuff on line ignored"); + as_warn (_("extra stuff on line ignored")); if (pending_reloc) - as_bad ("Something forgot to clean up\n"); + as_bad (_("Something forgot to clean up\n")); } /* Turn a string in input_line_pointer into a floating point constant @@ -552,7 +556,7 @@ md_assemble (char *str) of LITTLENUMS emitted is stored in *SIZEP . An error message is returned, or NULL on OK. */ -char * +const char * md_atof (int type, char *litP, int *sizeP) { int prec; @@ -589,54 +593,94 @@ 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) +md_parse_option (int c ATTRIBUTE_UNUSED, const char *arg ATTRIBUTE_UNUSED) { - return 0; + switch (c) + { + case OPTION_EB: + target_big_endian = 1; + break; + case OPTION_EL: + target_big_endian = 0; + 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. */ void -md_apply_fix (fixS *fixP ATTRIBUTE_UNUSED, +md_apply_fix (fixS *fixP ATTRIBUTE_UNUSED, valueT * valP ATTRIBUTE_UNUSED, segT seg ATTRIBUTE_UNUSED) { char *buf = fixP->fx_where + fixP->fx_frag->fr_literal; long val = *valP; long newval; long max, min; - int shift; max = min = 0; - shift = 0; 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: @@ -667,28 +711,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. */ @@ -712,9 +771,8 @@ tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixP) return 0; } - relP = xmalloc (sizeof (arelent)); - gas_assert (relP != 0); - relP->sym_ptr_ptr = xmalloc (sizeof (asymbol *)); + relP = XNEW (arelent); + relP->sym_ptr_ptr = XNEW (asymbol *); *relP->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy); relP->address = fixP->fx_frag->fr_address + fixP->fx_where; @@ -776,7 +834,8 @@ md_pcrel_from (fixS *fixP) case BFD_RELOC_32: return addr + 4; case BFD_RELOC_MOXIE_10_PCREL: - return addr; + /* Offset is from the end of the instruction. */ + return addr + 2; default: abort (); return addr;