X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gas%2Fconfig%2Ftc-pdp11.c;h=1230daee34bc11f6d619d69b66a0e68baf8eda35;hb=f16c3d4f137ae02fab0982782b2e1c2b2afc8583;hp=89c75c32100eeb27b95540b480305b4f111f5547;hpb=6f2750feaf2827ef8a1a0a5b2f90c1e9a6cabbd1;p=binutils-gdb.git diff --git a/gas/config/tc-pdp11.c b/gas/config/tc-pdp11.c index 89c75c32100..1230daee34b 100644 --- a/gas/config/tc-pdp11.c +++ b/gas/config/tc-pdp11.c @@ -1,5 +1,5 @@ /* tc-pdp11.c - pdp11-specific - - Copyright (C) 2001-2016 Free Software Foundation, Inc. + Copyright (C) 2001-2020 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -30,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. */ @@ -82,10 +82,10 @@ const pseudo_typeS md_pseudo_table[] = { 0, 0, 0 }, }; -static struct hash_control *insn_hash = NULL; +static htab_t insn_hash = NULL; static int -set_option (char *arg) +set_option (const char *arg) { int yes = 1; @@ -109,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. */ @@ -188,14 +188,12 @@ md_begin (void) init_defaults (); - insn_hash = hash_new (); - if (insn_hash == NULL) - as_fatal (_("Virtual memory exhausted")); + insn_hash = str_htab_create (); for (i = 0; i < pdp11_num_opcodes; i++) - hash_insert (insn_hash, pdp11_opcodes[i].name, (void *) (pdp11_opcodes + i)); + str_hash_insert (insn_hash, pdp11_opcodes[i].name, pdp11_opcodes + i, 0); for (i = 0; i < pdp11_num_aliases; i++) - hash_insert (insn_hash, pdp11_aliases[i].name, (void *) (pdp11_aliases + i)); + str_hash_insert (insn_hash, pdp11_aliases[i].name, pdp11_aliases + i, 0); } void @@ -203,7 +201,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) { @@ -222,6 +220,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); } @@ -248,11 +256,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; @@ -279,13 +295,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: @@ -357,6 +371,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; } @@ -583,9 +603,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 @@ -651,7 +696,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; @@ -666,7 +711,7 @@ md_assemble (char *instruction_string) c = *p; *p = '\0'; - op = (struct pdp11_opcode *)hash_find (insn_hash, str); + op = (struct pdp11_opcode *)str_hash_find (insn_hash, str); *p = c; if (op == 0) { @@ -697,8 +742,6 @@ md_assemble (char *instruction_string) { case PDP11_OPCODE_NO_OPS: str = skip_whitespace (str); - if (*str == 0) - str = ""; break; case PDP11_OPCODE_IMM3: @@ -1045,7 +1088,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; @@ -1161,7 +1204,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 @@ -1248,7 +1291,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 (); @@ -1290,9 +1333,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\ @@ -1306,8 +1349,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\ @@ -1388,31 +1431,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); @@ -1446,7 +1489,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);