X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Fconfig%2Ftc-pdp11.c;h=7de42aea959f0e472f2eddeaf8b58cac27d0e6f2;hb=53fc67f8b2663261810353ae8e4f9920ae7a1c56;hp=98e241f67b7e5935038345aedb1c15fd7f7637aa;hpb=12505806d06803312a664d33cd05ab45067a67f1;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/config/tc-pdp11.c b/gas/config/tc-pdp11.c index 98e241f67b..7de42aea95 100644 --- a/gas/config/tc-pdp11.c +++ b/gas/config/tc-pdp11.c @@ -1,6 +1,5 @@ /* tc-pdp11.c - pdp11-specific - - Copyright 2001, 2002, 2004, 2005, 2007, 2009 - Free Software Foundation, Inc. + Copyright (C) 2001-2020 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -31,7 +30,7 @@ extern int flonum_gen2vax (int, FLONUM_TYPE * f, LITTLENUM_TYPE *); /* A representation for PDP-11 machine code. */ struct pdp11_code { - char *error; + const char *error; int code; int additional; /* Is there an additional word? */ int word; /* Additional word, if any. */ @@ -86,7 +85,7 @@ const pseudo_typeS md_pseudo_table[] = static struct hash_control *insn_hash = NULL; static int -set_option (char *arg) +set_option (const char *arg) { int yes = 1; @@ -110,7 +109,7 @@ set_option (char *arg) arg += 3; } - /* Commersial instructions. */ + /* Commercial instructions. */ if (strcmp (arg, "cis") == 0) pdp11_extension[PDP11_CIS] = yes; /* Call supervisor mode. */ @@ -204,7 +203,7 @@ md_number_to_chars (char con[], valueT value, int nbytes) { /* On a PDP-11, 0x1234 is stored as "\x12\x34", and 0x12345678 is stored as "\x56\x78\x12\x34". It's - anyones guess what 0x123456 would be stored like. */ + anyone's guess what 0x123456 would be stored like. */ switch (nbytes) { @@ -223,6 +222,16 @@ md_number_to_chars (char con[], valueT value, int nbytes) con[2] = value & 0xff; con[3] = (value >> 8) & 0xff; break; + case 8: + con[0] = (value >> 48) & 0xff; + con[1] = (value >> 56) & 0xff; + con[2] = (value >> 32) & 0xff; + con[3] = (value >> 40) & 0xff; + con[4] = (value >> 16) & 0xff; + con[5] = (value >> 24) & 0xff; + con[6] = value & 0xff; + con[7] = (value >> 8) & 0xff; + break; default: BAD_CASE (nbytes); } @@ -249,11 +258,19 @@ md_apply_fix (fixS *fixP, switch (fixP->fx_r_type) { + case BFD_RELOC_8: + mask = 0xff; + shift = 0; + break; case BFD_RELOC_16: case BFD_RELOC_16_PCREL: mask = 0xffff; shift = 0; break; + case BFD_RELOC_32: + mask = 0xffffffff; + shift = 0; + break; case BFD_RELOC_PDP11_DISP_8_PCREL: mask = 0x00ff; shift = 1; @@ -280,13 +297,11 @@ md_apply_fix (fixS *fixP, } long -md_chars_to_number (con, nbytes) - unsigned char con[]; /* Low order byte 1st. */ - int nbytes; /* Number of bytes in the input. */ +md_chars_to_number (unsigned char *con, int nbytes) { /* On a PDP-11, 0x1234 is stored as "\x12\x34", and 0x12345678 is stored as "\x56\x78\x12\x34". It's - anyones guess what 0x123456 would be stored like. */ + anyone's guess what 0x123456 would be stored like. */ switch (nbytes) { case 0: @@ -358,6 +373,12 @@ parse_reg (char *str, struct pdp11_code *operand) return str; } + if (ISALNUM (*str) || *str == '_' || *str == '.') + { + operand->error = _("Bad register name"); + str -= 2; + } + return str; } @@ -584,9 +605,34 @@ parse_op_noreg (char *str, struct pdp11_code *operand) if (*str == '@' || *str == '*') { - str = parse_op_no_deferred (str + 1, operand); + /* @(Rn) == @0(Rn): Mode 7, Indexed deferred. + Check for auto-increment deferred. */ + if (str[1] == '(' + && str[2] != 0 + && str[3] != 0 + && str[4] != 0 + && str[5] != '+') + { + /* Change implied to explicit index deferred. */ + *str = '0'; + str = parse_op_no_deferred (str, operand); + } + else + { + /* @Rn == (Rn): Register deferred. */ + str = parse_reg (str + 1, operand); + + /* Not @Rn */ + if (operand->error) + { + operand->error = NULL; + str = parse_op_no_deferred (str, operand); + } + } + if (operand->error) return str; + operand->code |= 010; } else @@ -652,7 +698,7 @@ md_assemble (char *instruction_string) struct pdp11_code insn, op1, op2; int error; int size; - char *err = NULL; + const char *err = NULL; char *str; char *p; char c; @@ -698,8 +744,6 @@ md_assemble (char *instruction_string) { case PDP11_OPCODE_NO_OPS: str = skip_whitespace (str); - if (*str == 0) - str = ""; break; case PDP11_OPCODE_IMM3: @@ -1046,7 +1090,7 @@ md_create_long_jump (char *ptr ATTRIBUTE_UNUSED, } static int -set_cpu_model (char *arg) +set_cpu_model (const char *arg) { char buf[4]; char *model = buf; @@ -1162,7 +1206,7 @@ set_cpu_model (char *arg) } static int -set_machine_model (char *arg) +set_machine_model (const char *arg) { if (strncmp (arg, "pdp-11/", 7) != 0 && strncmp (arg, "pdp11/", 6) != 0 @@ -1249,7 +1293,7 @@ size_t md_longopts_size = sizeof (md_longopts); See if it's a processor-specific option. */ int -md_parse_option (int c, char *arg) +md_parse_option (int c, const char *arg) { init_defaults (); @@ -1291,9 +1335,9 @@ md_show_usage (FILE *stream) { fprintf (stream, "\ \n\ -PDP-11 instruction set extentions:\n\ +PDP-11 instruction set extensions:\n\ \n\ --m(no-)cis allow (disallow) commersial instruction set\n\ +-m(no-)cis allow (disallow) commercial instruction set\n\ -m(no-)csm allow (disallow) CSM instruction\n\ -m(no-)eis allow (disallow) full extended instruction set\n\ -m(no-)fis allow (disallow) KEV11 floating-point instructions\n\ @@ -1307,8 +1351,8 @@ PDP-11 instruction set extentions:\n\ -m(no-)ucode allow (disallow) microcode instructions\n\ -mall-extensions allow all instruction set extensions\n\ (this is the default)\n\ --mno-extentions disallow all instruction set extensions\n\ --pic generate position-indepenent code\n\ +-mno-extensions disallow all instruction set extensions\n\ +-pic generate position-independent code\n\ \n\ PDP-11 CPU model options:\n\ \n\ @@ -1389,31 +1433,31 @@ tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, arelent *reloc; bfd_reloc_code_real_type code; - reloc = xmalloc (sizeof (* reloc)); + reloc = XNEW (arelent); - reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *)); + reloc->sym_ptr_ptr = XNEW (asymbol *); *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; /* This is taken account for in md_apply_fix(). */ reloc->addend = -symbol_get_bfdsym (fixp->fx_addsy)->section->vma; - switch (fixp->fx_r_type) + code = fixp->fx_r_type; + if (fixp->fx_pcrel) { - case BFD_RELOC_16: - if (fixp->fx_pcrel) - code = BFD_RELOC_16_PCREL; - else - code = BFD_RELOC_16; - break; + switch (code) + { + case BFD_RELOC_16: + code = BFD_RELOC_16_PCREL; + break; - case BFD_RELOC_16_PCREL: - code = BFD_RELOC_16_PCREL; - break; + case BFD_RELOC_16_PCREL: + break; - default: - BAD_CASE (fixp->fx_r_type); - return NULL; + default: + BAD_CASE (code); + return NULL; + } } reloc->howto = bfd_reloc_type_lookup (stdoutput, code); @@ -1447,7 +1491,7 @@ pseudo_even (int c ATTRIBUTE_UNUSED) record_alignment (now_seg, alignment); } -char * +const char * md_atof (int type, char * litP, int * sizeP) { return vax_md_atof (type, litP, sizeP);