1 /* tc-mmix.c -- Assembler for Don Knuth's MMIX. 2 Copyright (C) 2001, 2002, 2003 Free Software Foundation. 3 4 This file is part of GAS, the GNU Assembler. 5 6 GAS is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2, or (at your option) 9 any later version. 10 11 GAS is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with GAS; see the file COPYING. If not, write to 18 the Free Software Foundation, 59 Temple Place - Suite 330, 19 Boston, MA 02111-1307, USA. */ 20 21 /* Knuth's assembler mmixal does not provide a relocatable format; mmo is 22 to be considered a final link-format. In the final link, we make mmo, 23 but for relocatable files, we use ELF. 24 25 One goal is to provide a superset of what mmixal does, including 26 compatible syntax, but the main purpose is to serve GCC. */ 27 28 29 #include <stdio.h> 30 #include <limits.h> 31 #include "as.h" 32 #include "subsegs.h" 33 #include "bfd.h" 34 #include "elf/mmix.h" 35 #include "opcode/mmix.h" 36 #include "safe-ctype.h" 37 #include "dwarf2dbg.h" 38 #include "obstack.h" 39 40 /* Something to describe what we need to do with a fixup before output, 41 for example assert something of what it became or make a relocation. */ 42 43 enum mmix_fixup_action 44 { 45 mmix_fixup_byte, 46 mmix_fixup_register, 47 mmix_fixup_register_or_adjust_for_byte 48 }; 49 50 static int get_spec_regno PARAMS ((char *)); 51 static int get_operands PARAMS ((int, char *, expressionS[])); 52 static int get_putget_operands 53 PARAMS ((struct mmix_opcode *, char *, expressionS[])); 54 static void s_prefix PARAMS ((int)); 55 static void s_greg PARAMS ((int)); 56 static void s_loc PARAMS ((int)); 57 static void s_bspec PARAMS ((int)); 58 static void s_espec PARAMS ((int)); 59 static void mmix_s_local PARAMS ((int)); 60 static void mmix_greg_internal PARAMS ((char *)); 61 static void mmix_set_geta_branch_offset PARAMS ((char *, offsetT value)); 62 static void mmix_set_jmp_offset PARAMS ((char *, offsetT)); 63 static void mmix_fill_nops PARAMS ((char *, int)); 64 static int cmp_greg_symbol_fixes PARAMS ((const PTR, const PTR)); 65 static int cmp_greg_val_greg_symbol_fixes 66 PARAMS ((const PTR p1, const PTR p2)); 67 static void mmix_handle_rest_of_empty_line PARAMS ((void)); 68 static void mmix_discard_rest_of_line PARAMS ((void)); 69 static void mmix_byte PARAMS ((void)); 70 static void mmix_cons PARAMS ((int)); 71 72 /* Continue the tradition of symbols.c; use control characters to enforce 73 magic. These are used when replacing e.g. 8F and 8B so we can handle 74 such labels correctly with the common parser hooks. */ 75 #define MAGIC_FB_BACKWARD_CHAR '\003' 76 #define MAGIC_FB_FORWARD_CHAR '\004' 77 78 /* Copy the location of a frag to a fix. */ 79 #define COPY_FR_WHERE_TO_FX(FRAG, FIX) \ 80 do \ 81 { \ 82 (FIX)->fx_file = (FRAG)->fr_file; \ 83 (FIX)->fx_line = (FRAG)->fr_line; \ 84 } \ 85 while (0) 86 87 const char *md_shortopts = "x"; 88 static int current_fb_label = -1; 89 static char *pending_label = NULL; 90 91 static bfd_vma lowest_text_loc = (bfd_vma) -1; 92 static int text_has_contents = 0; 93 94 /* The alignment of the previous instruction, and a boolean for whether we 95 want to avoid aligning the next WYDE, TETRA, OCTA or insn. */ 96 static int last_alignment = 0; 97 static int want_unaligned = 0; 98 99 static bfd_vma lowest_data_loc = (bfd_vma) -1; 100 static int data_has_contents = 0; 101 102 /* The fragS of the instruction being assembled. Only valid from within 103 md_assemble. */ 104 fragS *mmix_opcode_frag = NULL; 105 106 /* Raw GREGs as appearing in input. These may be fewer than the number 107 after relaxing. */ 108 static int n_of_raw_gregs = 0; 109 static struct 110 { 111 char *label; 112 expressionS exp; 113 } mmix_raw_gregs[MAX_GREGS]; 114 115 /* Fixups for all unique GREG registers. We store the fixups here in 116 md_convert_frag, then we use the array to convert 117 BFD_RELOC_MMIX_BASE_PLUS_OFFSET fixups in tc_gen_reloc. The index is 118 just a running number and is not supposed to be correlated to a 119 register number. */ 120 static fixS *mmix_gregs[MAX_GREGS]; 121 static int n_of_cooked_gregs = 0; 122 123 /* Pointing to the register section we use for output. */ 124 static asection *real_reg_section; 125 126 /* For each symbol; unknown or section symbol, we keep a list of GREG 127 definitions sorted on increasing offset. It seems no use keeping count 128 to allocate less room than the maximum number of gregs when we've found 129 one for a section or symbol. */ 130 struct mmix_symbol_gregs 131 { 132 int n_gregs; 133 struct mmix_symbol_greg_fixes 134 { 135 fixS *fix; 136 137 /* A signed type, since we may have GREGs pointing slightly before the 138 contents of a section. */ 139 offsetT offs; 140 } greg_fixes[MAX_GREGS]; 141 }; 142 143 /* Should read insert a colon on something that starts in column 0 on 144 this line? */ 145 static int label_without_colon_this_line = 1; 146 147 /* Should we automatically expand instructions into multiple insns in 148 order to generate working code? */ 149 static int expand_op = 1; 150 151 /* Should we warn when expanding operands? FIXME: test-cases for when -x 152 is absent. */ 153 static int warn_on_expansion = 1; 154 155 /* Should we merge non-zero GREG register definitions? */ 156 static int merge_gregs = 1; 157 158 /* Should we pass on undefined BFD_RELOC_MMIX_BASE_PLUS_OFFSET relocs 159 (missing suitable GREG definitions) to the linker? */ 160 static int allocate_undefined_gregs_in_linker = 0; 161 162 /* Should we emit built-in symbols? */ 163 static int predefined_syms = 1; 164 165 /* Should we allow anything but the listed special register name 166 (e.g. equated symbols)? */ 167 static int equated_spec_regs = 1; 168 169 /* Do we require standard GNU syntax? */ 170 int mmix_gnu_syntax = 0; 171 172 /* Do we globalize all symbols? */ 173 int mmix_globalize_symbols = 0; 174 175 /* When expanding insns, do we want to expand PUSHJ as a call to a stub 176 (or else as a series of insns)? */ 177 int pushj_stubs = 1; 178 179 /* Do we know that the next semicolon is at the end of the operands field 180 (in mmixal mode; constant 1 in GNU mode)? */ 181 int mmix_next_semicolon_is_eoln = 1; 182 183 /* Do we have a BSPEC in progress? */ 184 static int doing_bspec = 0; 185 static char *bspec_file; 186 static unsigned int bspec_line; 187 188 struct option md_longopts[] = 189 { 190 #define OPTION_RELAX (OPTION_MD_BASE) 191 #define OPTION_NOEXPAND (OPTION_RELAX + 1) 192 #define OPTION_NOMERGEGREG (OPTION_NOEXPAND + 1) 193 #define OPTION_NOSYMS (OPTION_NOMERGEGREG + 1) 194 #define OPTION_GNU_SYNTAX (OPTION_NOSYMS + 1) 195 #define OPTION_GLOBALIZE_SYMBOLS (OPTION_GNU_SYNTAX + 1) 196 #define OPTION_FIXED_SPEC_REGS (OPTION_GLOBALIZE_SYMBOLS + 1) 197 #define OPTION_LINKER_ALLOCATED_GREGS (OPTION_FIXED_SPEC_REGS + 1) 198 #define OPTION_NOPUSHJSTUBS (OPTION_LINKER_ALLOCATED_GREGS + 1) 199 {"linkrelax", no_argument, NULL, OPTION_RELAX}, 200 {"no-expand", no_argument, NULL, OPTION_NOEXPAND}, 201 {"no-merge-gregs", no_argument, NULL, OPTION_NOMERGEGREG}, 202 {"no-predefined-syms", no_argument, NULL, OPTION_NOSYMS}, 203 {"gnu-syntax", no_argument, NULL, OPTION_GNU_SYNTAX}, 204 {"globalize-symbols", no_argument, NULL, OPTION_GLOBALIZE_SYMBOLS}, 205 {"fixed-special-register-names", no_argument, NULL, 206 OPTION_FIXED_SPEC_REGS}, 207 {"linker-allocated-gregs", no_argument, NULL, 208 OPTION_LINKER_ALLOCATED_GREGS}, 209 {"no-pushj-stubs", no_argument, NULL, OPTION_NOPUSHJSTUBS}, 210 {"no-stubs", no_argument, NULL, OPTION_NOPUSHJSTUBS}, 211 {NULL, no_argument, NULL, 0} 212 }; 213 214 size_t md_longopts_size = sizeof (md_longopts); 215 216 static struct hash_control *mmix_opcode_hash; 217 218 /* We use these when implementing the PREFIX pseudo. */ 219 char *mmix_current_prefix; 220 struct obstack mmix_sym_obstack; 221 222 223 /* For MMIX, we encode the relax_substateT:s (in e.g. fr_substate) as one 224 bit length, and the relax-type shifted on top of that. There seems to 225 be no point in making the relaxation more fine-grained; the linker does 226 that better and we might interfere by changing non-optimal relaxations 227 into other insns that cannot be relaxed as easily. 228 229 Groups for MMIX relaxing: 230 231 1. GETA 232 extra length: zero or three insns. 233 234 2. Bcc 235 extra length: zero or five insns. 236 237 3. PUSHJ 238 extra length: zero or four insns. 239 Special handling to deal with transition to PUSHJSTUB. 240 241 4. JMP 242 extra length: zero or four insns. 243 244 5. GREG 245 special handling, allocates a named global register unless another 246 is within reach for all uses. 247 248 6. PUSHJSTUB 249 special handling (mostly) for external references; assumes the 250 linker will generate a stub if target is no longer than 256k from 251 the end of the section plus max size of previous stubs. Zero or 252 four insns. */ 253 254 #define STATE_GETA (1) 255 #define STATE_BCC (2) 256 #define STATE_PUSHJ (3) 257 #define STATE_JMP (4) 258 #define STATE_GREG (5) 259 #define STATE_PUSHJSTUB (6) 260 261 /* No fine-grainedness here. */ 262 #define STATE_LENGTH_MASK (1) 263 264 #define STATE_ZERO (0) 265 #define STATE_MAX (1) 266 267 /* More descriptive name for convenience. */ 268 /* FIXME: We should start on something different, not MAX. */ 269 #define STATE_UNDF STATE_MAX 270 271 /* FIXME: For GREG, we must have other definitions; UNDF == MAX isn't 272 appropriate; we need it the other way round. This value together with 273 fragP->tc_frag_data shows what state the frag is in: tc_frag_data 274 non-NULL means 0, NULL means 8 bytes. */ 275 #define STATE_GREG_UNDF ENCODE_RELAX (STATE_GREG, STATE_ZERO) 276 #define STATE_GREG_DEF ENCODE_RELAX (STATE_GREG, STATE_MAX) 277 278 /* These displacements are relative to the address following the opcode 279 word of the instruction. The catch-all states have zero for "reach" 280 and "next" entries. */ 281 282 #define GETA_0F (65536 * 4 - 8) 283 #define GETA_0B (-65536 * 4 - 4) 284 285 #define GETA_MAX_LEN 4 * 4 286 #define GETA_3F 0 287 #define GETA_3B 0 288 289 #define BCC_0F GETA_0F 290 #define BCC_0B GETA_0B 291 292 #define BCC_MAX_LEN 6 * 4 293 #define BCC_5F GETA_3F 294 #define BCC_5B GETA_3B 295 296 #define PUSHJ_0F GETA_0F 297 #define PUSHJ_0B GETA_0B 298 299 #define PUSHJ_MAX_LEN 5 * 4 300 #define PUSHJ_4F GETA_3F 301 #define PUSHJ_4B GETA_3B 302 303 /* We'll very rarely have sections longer than LONG_MAX, but we'll make a 304 feeble attempt at getting 64-bit C99 or gcc-specific values (assuming 305 long long is 64 bits on the host). */ 306 #ifdef LLONG_MIN 307 #define PUSHJSTUB_MIN LLONG_MIN 308 #elsif defined (LONG_LONG_MIN) 309 #define PUSHJSTUB_MIN LONG_LONG_MIN 310 #else 311 #define PUSHJSTUB_MIN LONG_MIN 312 #endif 313 #ifdef LLONG_MAX 314 #define PUSHJSTUB_MAX LLONG_MAX 315 #elsif defined (LONG_LONG_MAX) 316 #define PUSHJSTUB_MAX LONG_LONG_MAX 317 #else 318 #define PUSHJSTUB_MAX LONG_MAX 319 #endif 320 321 #define JMP_0F (65536 * 256 * 4 - 8) 322 #define JMP_0B (-65536 * 256 * 4 - 4) 323 324 #define JMP_MAX_LEN 5 * 4 325 #define JMP_4F 0 326 #define JMP_4B 0 327 328 #define RELAX_ENCODE_SHIFT 1 329 #define ENCODE_RELAX(what, length) (((what) << RELAX_ENCODE_SHIFT) + (length)) 330 331 const relax_typeS mmix_relax_table[] = 332 { 333 /* Error sentinel (0, 0). */ 334 {1, 1, 0, 0}, 335 336 /* Unused (0, 1). */ 337 {1, 1, 0, 0}, 338 339 /* GETA (1, 0). */ 340 {GETA_0F, GETA_0B, 0, ENCODE_RELAX (STATE_GETA, STATE_MAX)}, 341 342 /* GETA (1, 1). */ 343 {GETA_3F, GETA_3B, 344 GETA_MAX_LEN - 4, 0}, 345 346 /* BCC (2, 0). */ 347 {BCC_0F, BCC_0B, 0, ENCODE_RELAX (STATE_BCC, STATE_MAX)}, 348 349 /* BCC (2, 1). */ 350 {BCC_5F, BCC_5B, 351 BCC_MAX_LEN - 4, 0}, 352 353 /* PUSHJ (3, 0). Next state is actually PUSHJSTUB (6, 0). */ 354 {PUSHJ_0F, PUSHJ_0B, 0, ENCODE_RELAX (STATE_PUSHJSTUB, STATE_ZERO)}, 355 356 /* PUSHJ (3, 1). */ 357 {PUSHJ_4F, PUSHJ_4B, 358 PUSHJ_MAX_LEN - 4, 0}, 359 360 /* JMP (4, 0). */ 361 {JMP_0F, JMP_0B, 0, ENCODE_RELAX (STATE_JMP, STATE_MAX)}, 362 363 /* JMP (4, 1). */ 364 {JMP_4F, JMP_4B, 365 JMP_MAX_LEN - 4, 0}, 366 367 /* GREG (5, 0), (5, 1), though the table entry isn't used. */ 368 {0, 0, 0, 0}, {0, 0, 0, 0}, 369 370 /* PUSHJSTUB (6, 0). PUSHJ (3, 0) uses the range, so we set it to infinite. */ 371 {PUSHJSTUB_MAX, PUSHJSTUB_MIN, 372 0, ENCODE_RELAX (STATE_PUSHJ, STATE_MAX)}, 373 /* PUSHJSTUB (6, 1) isn't used. */ 374 {0, 0, PUSHJ_MAX_LEN, 0} 375 }; 376 377 const pseudo_typeS md_pseudo_table[] = 378 { 379 /* Support " .greg sym,expr" syntax. */ 380 {"greg", s_greg, 0}, 381 382 /* Support " .bspec expr" syntax. */ 383 {"bspec", s_bspec, 1}, 384 385 /* Support " .espec" syntax. */ 386 {"espec", s_espec, 1}, 387 388 /* Support " .local $45" syntax. */ 389 {"local", mmix_s_local, 1}, 390 391 {NULL, 0, 0} 392 }; 393 394 const char mmix_comment_chars[] = "%!"; 395 396 /* A ':' is a valid symbol character in mmixal. It's the prefix 397 delimiter, but other than that, it works like a symbol character, 398 except that we strip one off at the beginning of symbols. An '@' is a 399 symbol by itself (for the current location); space around it must not 400 be stripped. */ 401 const char mmix_symbol_chars[] = ":@"; 402 403 const char line_comment_chars[] = "*#"; 404 405 const char line_separator_chars[] = ";"; 406 407 const char mmix_exp_chars[] = "eE"; 408 409 const char mmix_flt_chars[] = "rf"; 410 411 412 /* Fill in the offset-related part of GETA or Bcc. */ 413 414 static void 415 mmix_set_geta_branch_offset (opcodep, value) 416 char *opcodep; 417 offsetT value; 418 { 419 if (value < 0) 420 { 421 value += 65536 * 4; 422 opcodep[0] |= 1; 423 } 424 425 value /= 4; 426 md_number_to_chars (opcodep + 2, value, 2); 427 } 428 429 /* Fill in the offset-related part of JMP. */ 430 431 static void 432 mmix_set_jmp_offset (opcodep, value) 433 char *opcodep; 434 offsetT value; 435 { 436 if (value < 0) 437 { 438 value += 65536 * 256 * 4; 439 opcodep[0] |= 1; 440 } 441 442 value /= 4; 443 md_number_to_chars (opcodep + 1, value, 3); 444 } 445 446 /* Fill in NOP:s for the expanded part of GETA/JMP/Bcc/PUSHJ. */ 447 448 static void 449 mmix_fill_nops (opcodep, n) 450 char *opcodep; 451 int n; 452 { 453 int i; 454 455 for (i = 0; i < n; i++) 456 md_number_to_chars (opcodep + i * 4, SWYM_INSN_BYTE << 24, 4); 457 } 458 459 /* See macro md_parse_name in tc-mmix.h. */ 460 461 int 462 mmix_current_location (fn, exp) 463 void (*fn) PARAMS ((expressionS *)); 464 expressionS *exp; 465 { 466 (*fn) (exp); 467 468 return 1; 469 } 470 471 /* Get up to three operands, filling them into the exp array. 472 General idea and code stolen from the tic80 port. */ 473 474 static int 475 get_operands (max_operands, s, exp) 476 int max_operands; 477 char *s; 478 expressionS exp[]; 479 { 480 char *p = s; 481 int numexp = 0; 482 int nextchar = ','; 483 484 while (nextchar == ',') 485 { 486 /* Skip leading whitespace */ 487 while (*p == ' ' || *p == '\t') 488 p++; 489 490 /* Check to see if we have any operands left to parse */ 491 if (*p == 0 || *p == '\n' || *p == '\r') 492 { 493 break; 494 } 495 else if (numexp == max_operands) 496 { 497 /* This seems more sane than saying "too many operands". We'll 498 get here only if the trailing trash starts with a comma. */ 499 as_bad (_("invalid operands")); 500 mmix_discard_rest_of_line (); 501 return 0; 502 } 503 504 /* Begin operand parsing at the current scan point. */ 505 506 input_line_pointer = p; 507 expression (&exp[numexp]); 508 509 if (exp[numexp].X_op == O_illegal) 510 { 511 as_bad (_("invalid operands")); 512 } 513 else if (exp[numexp].X_op == O_absent) 514 { 515 as_bad (_("missing operand")); 516 } 517 518 numexp++; 519 p = input_line_pointer; 520 521 /* Skip leading whitespace */ 522 while (*p == ' ' || *p == '\t') 523 p++; 524 nextchar = *p++; 525 } 526 527 /* If we allow "naked" comments, ignore the rest of the line. */ 528 if (nextchar != ',') 529 { 530 mmix_handle_rest_of_empty_line (); 531 input_line_pointer--; 532 } 533 534 /* Mark the end of the valid operands with an illegal expression. */ 535 exp[numexp].X_op = O_illegal; 536 537 return (numexp); 538 } 539 540 /* Get the value of a special register, or -1 if the name does not match 541 one. NAME is a null-terminated string. */ 542 543 static int 544 get_spec_regno (name) 545 char *name; 546 { 547 int i; 548 549 if (name == NULL) 550 return -1; 551 552 if (*name == ':') 553 name++; 554 555 /* Well, it's a short array and we'll most often just match the first 556 entry, rJ. */ 557 for (i = 0; mmix_spec_regs[i].name != NULL; i++) 558 if (strcmp (name, mmix_spec_regs[i].name) == 0) 559 return mmix_spec_regs[i].number; 560 561 return -1; 562 } 563 564 /* For GET and PUT, parse the register names "manually", so we don't use 565 user labels. */ 566 static int 567 get_putget_operands (insn, operands, exp) 568 struct mmix_opcode *insn; 569 char *operands; 570 expressionS exp[]; 571 { 572 expressionS *expp_reg; 573 expressionS *expp_sreg; 574 char *sregp = NULL; 575 char *sregend = operands; 576 char *p = operands; 577 char c = *sregend; 578 int regno; 579 580 /* Skip leading whitespace */ 581 while (*p == ' ' || *p == '\t') 582 p++; 583 584 input_line_pointer = p; 585 586 /* Initialize both possible operands to error state, in case we never 587 get further. */ 588 exp[0].X_op = O_illegal; 589 exp[1].X_op = O_illegal; 590 591 if (insn->operands == mmix_operands_get) 592 { 593 expp_reg = &exp[0]; 594 expp_sreg = &exp[1]; 595 596 expression (expp_reg); 597 598 p = input_line_pointer; 599 600 /* Skip whitespace */ 601 while (*p == ' ' || *p == '\t') 602 p++; 603 604 if (*p == ',') 605 { 606 p++; 607 608 /* Skip whitespace */ 609 while (*p == ' ' || *p == '\t') 610 p++; 611 sregp = p; 612 input_line_pointer = sregp; 613 c = get_symbol_end (); 614 sregend = input_line_pointer; 615 } 616 } 617 else 618 { 619 expp_sreg = &exp[0]; 620 expp_reg = &exp[1]; 621 622 sregp = p; 623 c = get_symbol_end (); 624 sregend = p = input_line_pointer; 625 *p = c; 626 627 /* Skip whitespace */ 628 while (*p == ' ' || *p == '\t') 629 p++; 630 631 if (*p == ',') 632 { 633 p++; 634 635 /* Skip whitespace */ 636 while (*p == ' ' || *p == '\t') 637 p++; 638 639 input_line_pointer = p; 640 expression (expp_reg); 641 } 642 *sregend = 0; 643 } 644 645 regno = get_spec_regno (sregp); 646 *sregend = c; 647 648 /* Let the caller issue errors; we've made sure the operands are 649 invalid. */ 650 if (expp_reg->X_op != O_illegal 651 && expp_reg->X_op != O_absent 652 && regno != -1) 653 { 654 expp_sreg->X_op = O_register; 655 expp_sreg->X_add_number = regno + 256; 656 } 657 658 return 2; 659 } 660 661 /* Handle MMIX-specific option. */ 662 663 int 664 md_parse_option (c, arg) 665 int c; 666 char *arg ATTRIBUTE_UNUSED; 667 { 668 switch (c) 669 { 670 case 'x': 671 warn_on_expansion = 0; 672 allocate_undefined_gregs_in_linker = 1; 673 break; 674 675 case OPTION_RELAX: 676 linkrelax = 1; 677 break; 678 679 case OPTION_NOEXPAND: 680 expand_op = 0; 681 break; 682 683 case OPTION_NOMERGEGREG: 684 merge_gregs = 0; 685 break; 686 687 case OPTION_NOSYMS: 688 predefined_syms = 0; 689 equated_spec_regs = 0; 690 break; 691 692 case OPTION_GNU_SYNTAX: 693 mmix_gnu_syntax = 1; 694 label_without_colon_this_line = 0; 695 break; 696 697 case OPTION_GLOBALIZE_SYMBOLS: 698 mmix_globalize_symbols = 1; 699 break; 700 701 case OPTION_FIXED_SPEC_REGS: 702 equated_spec_regs = 0; 703 break; 704 705 case OPTION_LINKER_ALLOCATED_GREGS: 706 allocate_undefined_gregs_in_linker = 1; 707 break; 708 709 case OPTION_NOPUSHJSTUBS: 710 pushj_stubs = 0; 711 break; 712 713 default: 714 return 0; 715 } 716 717 return 1; 718 } 719 720 /* Display MMIX-specific help text. */ 721 722 void 723 md_show_usage (stream) 724 FILE * stream; 725 { 726 fprintf (stream, _(" MMIX-specific command line options:\n")); 727 fprintf (stream, _("\ 728 -fixed-special-register-names\n\ 729 Allow only the original special register names.\n")); 730 fprintf (stream, _("\ 731 -globalize-symbols Make all symbols global.\n")); 732 fprintf (stream, _("\ 733 -gnu-syntax Turn off mmixal syntax compatibility.\n")); 734 fprintf (stream, _("\ 735 -relax Create linker relaxable code.\n")); 736 fprintf (stream, _("\ 737 -no-predefined-syms Do not provide mmixal built-in constants.\n\ 738 Implies -fixed-special-register-names.\n")); 739 fprintf (stream, _("\ 740 -no-expand Do not expand GETA, branches, PUSHJ or JUMP\n\ 741 into multiple instructions.\n")); 742 fprintf (stream, _("\ 743 -no-merge-gregs Do not merge GREG definitions with nearby values.\n")); 744 fprintf (stream, _("\ 745 -linker-allocated-gregs If there's no suitable GREG definition for the\ 746 operands of an instruction, let the linker resolve.\n")); 747 fprintf (stream, _("\ 748 -x Do not warn when an operand to GETA, a branch,\n\ 749 PUSHJ or JUMP is not known to be within range.\n\ 750 The linker will catch any errors. Implies\n\ 751 -linker-allocated-gregs.")); 752 } 753 754 /* Step to end of line, but don't step over the end of the line. */ 755 756 static void 757 mmix_discard_rest_of_line () 758 { 759 while (*input_line_pointer 760 && (! is_end_of_line[(unsigned char) *input_line_pointer] 761 || TC_EOL_IN_INSN (input_line_pointer))) 762 input_line_pointer++; 763 } 764 765 /* Act as demand_empty_rest_of_line if we're in strict GNU syntax mode, 766 otherwise just ignore the rest of the line (and skip the end-of-line 767 delimiter). */ 768 769 static void 770 mmix_handle_rest_of_empty_line () 771 { 772 if (mmix_gnu_syntax) 773 demand_empty_rest_of_line (); 774 else 775 { 776 mmix_discard_rest_of_line (); 777 input_line_pointer++; 778 } 779 } 780 781 /* Initialize GAS MMIX specifics. */ 782 783 void 784 mmix_md_begin () 785 { 786 int i; 787 const struct mmix_opcode *opcode; 788 789 /* We assume nobody will use this, so don't allocate any room. */ 790 obstack_begin (&mmix_sym_obstack, 0); 791 792 /* This will break the day the "lex" thingy changes. For now, it's the 793 only way to make ':' part of a name, and a name beginner. */ 794 lex_type[':'] = (LEX_NAME | LEX_BEGIN_NAME); 795 796 mmix_opcode_hash = hash_new (); 797 798 real_reg_section 799 = bfd_make_section_old_way (stdoutput, MMIX_REG_SECTION_NAME); 800 801 for (opcode = mmix_opcodes; opcode->name; opcode++) 802 hash_insert (mmix_opcode_hash, opcode->name, (char *) opcode); 803 804 /* We always insert the ordinary registers 0..255 as registers. */ 805 for (i = 0; i < 256; i++) 806 { 807 char buf[5]; 808 809 /* Alternatively, we could diddle with '$' and the following number, 810 but keeping the registers as symbols helps keep parsing simple. */ 811 sprintf (buf, "$%d", i); 812 symbol_table_insert (symbol_new (buf, reg_section, i, 813 &zero_address_frag)); 814 } 815 816 /* Insert mmixal built-in names if allowed. */ 817 if (predefined_syms) 818 { 819 for (i = 0; mmix_spec_regs[i].name != NULL; i++) 820 symbol_table_insert (symbol_new (mmix_spec_regs[i].name, 821 reg_section, 822 mmix_spec_regs[i].number + 256, 823 &zero_address_frag)); 824 825 /* FIXME: Perhaps these should be recognized as specials; as field 826 names for those instructions. */ 827 symbol_table_insert (symbol_new ("ROUND_CURRENT", reg_section, 512, 828 &zero_address_frag)); 829 symbol_table_insert (symbol_new ("ROUND_OFF", reg_section, 512 + 1, 830 &zero_address_frag)); 831 symbol_table_insert (symbol_new ("ROUND_UP", reg_section, 512 + 2, 832 &zero_address_frag)); 833 symbol_table_insert (symbol_new ("ROUND_DOWN", reg_section, 512 + 3, 834 &zero_address_frag)); 835 symbol_table_insert (symbol_new ("ROUND_NEAR", reg_section, 512 + 4, 836 &zero_address_frag)); 837 } 838 } 839 840 /* Assemble one insn in STR. */ 841 842 void 843 md_assemble (str) 844 char *str; 845 { 846 char *operands = str; 847 char modified_char = 0; 848 struct mmix_opcode *instruction; 849 fragS *opc_fragP = NULL; 850 int max_operands = 3; 851 852 /* Note that the struct frag member fr_literal in frags.h is char[], so 853 I have to make this a plain char *. */ 854 /* unsigned */ char *opcodep = NULL; 855 856 expressionS exp[4]; 857 int n_operands = 0; 858 859 /* Move to end of opcode. */ 860 for (operands = str; 861 is_part_of_name (*operands); 862 ++operands) 863 ; 864 865 if (ISSPACE (*operands)) 866 { 867 modified_char = *operands; 868 *operands++ = '\0'; 869 } 870 871 instruction = (struct mmix_opcode *) hash_find (mmix_opcode_hash, str); 872 if (instruction == NULL) 873 { 874 as_bad (_("unknown opcode: `%s'"), str); 875 876 /* Avoid "unhandled label" errors. */ 877 pending_label = NULL; 878 return; 879 } 880 881 /* Put back the character after the opcode. */ 882 if (modified_char != 0) 883 operands[-1] = modified_char; 884 885 input_line_pointer = operands; 886 887 /* Is this a mmixal pseudodirective? */ 888 if (instruction->type == mmix_type_pseudo) 889 { 890 /* For mmixal compatibility, a label for an instruction (and 891 emitting pseudo) refers to the _aligned_ address. We emit the 892 label here for the pseudos that don't handle it themselves. When 893 having an fb-label, emit it here, and increment the counter after 894 the pseudo. */ 895 switch (instruction->operands) 896 { 897 case mmix_operands_loc: 898 case mmix_operands_byte: 899 case mmix_operands_prefix: 900 case mmix_operands_local: 901 case mmix_operands_bspec: 902 case mmix_operands_espec: 903 if (current_fb_label >= 0) 904 colon (fb_label_name (current_fb_label, 1)); 905 else if (pending_label != NULL) 906 { 907 colon (pending_label); 908 pending_label = NULL; 909 } 910 break; 911 912 default: 913 break; 914 } 915 916 /* Some of the pseudos emit contents, others don't. Set a 917 contents-emitted flag when we emit something into .text */ 918 switch (instruction->operands) 919 { 920 case mmix_operands_loc: 921 /* LOC */ 922 s_loc (0); 923 break; 924 925 case mmix_operands_byte: 926 /* BYTE */ 927 mmix_byte (); 928 break; 929 930 case mmix_operands_wyde: 931 /* WYDE */ 932 mmix_cons (2); 933 break; 934 935 case mmix_operands_tetra: 936 /* TETRA */ 937 mmix_cons (4); 938 break; 939 940 case mmix_operands_octa: 941 /* OCTA */ 942 mmix_cons (8); 943 break; 944 945 case mmix_operands_prefix: 946 /* PREFIX */ 947 s_prefix (0); 948 break; 949 950 case mmix_operands_local: 951 /* LOCAL */ 952 mmix_s_local (0); 953 break; 954 955 case mmix_operands_bspec: 956 /* BSPEC */ 957 s_bspec (0); 958 break; 959 960 case mmix_operands_espec: 961 /* ESPEC */ 962 s_espec (0); 963 break; 964 965 default: 966 BAD_CASE (instruction->operands); 967 } 968 969 /* These are all working like the pseudo functions in read.c:s_..., 970 in that they step over the end-of-line marker at the end of the 971 line. We don't want that here. */ 972 input_line_pointer--; 973 974 /* Step up the fb-label counter if there was a definition on this 975 line. */ 976 if (current_fb_label >= 0) 977 { 978 fb_label_instance_inc (current_fb_label); 979 current_fb_label = -1; 980 } 981 982 /* Reset any don't-align-next-datum request, unless this was a LOC 983 directive. */ 984 if (instruction->operands != mmix_operands_loc) 985 want_unaligned = 0; 986 987 return; 988 } 989 990 /* Not a pseudo; we *will* emit contents. */ 991 if (now_seg == data_section) 992 { 993 if (lowest_data_loc != (bfd_vma) -1 && (lowest_data_loc & 3) != 0) 994 { 995 if (data_has_contents) 996 as_bad (_("specified location wasn't TETRA-aligned")); 997 else if (want_unaligned) 998 as_bad (_("unaligned data at an absolute location is not supported")); 999 1000 lowest_data_loc &= ~(bfd_vma) 3; 1001 lowest_data_loc += 4; 1002 } 1003 1004 data_has_contents = 1; 1005 } 1006 else if (now_seg == text_section) 1007 { 1008 if (lowest_text_loc != (bfd_vma) -1 && (lowest_text_loc & 3) != 0) 1009 { 1010 if (text_has_contents) 1011 as_bad (_("specified location wasn't TETRA-aligned")); 1012 else if (want_unaligned) 1013 as_bad (_("unaligned data at an absolute location is not supported")); 1014 1015 lowest_text_loc &= ~(bfd_vma) 3; 1016 lowest_text_loc += 4; 1017 } 1018 1019 text_has_contents = 1; 1020 } 1021 1022 /* After a sequence of BYTEs or WYDEs, we need to get to instruction 1023 alignment. For other pseudos, a ".p2align 2" is supposed to be 1024 inserted by the user. */ 1025 if (last_alignment < 2 && ! want_unaligned) 1026 { 1027 frag_align (2, 0, 0); 1028 record_alignment (now_seg, 2); 1029 last_alignment = 2; 1030 } 1031 else 1032 /* Reset any don't-align-next-datum request. */ 1033 want_unaligned = 0; 1034 1035 /* For mmixal compatibility, a label for an instruction (and emitting 1036 pseudo) refers to the _aligned_ address. So we have to emit the 1037 label here. */ 1038 if (pending_label != NULL) 1039 { 1040 colon (pending_label); 1041 pending_label = NULL; 1042 } 1043 1044 /* We assume that mmix_opcodes keeps having unique mnemonics for each 1045 opcode, so we don't have to iterate over more than one opcode; if the 1046 syntax does not match, then there's a syntax error. */ 1047 1048 /* Operands have little or no context and are all comma-separated; it is 1049 easier to parse each expression first. */ 1050 switch (instruction->operands) 1051 { 1052 case mmix_operands_reg_yz: 1053 case mmix_operands_pop: 1054 case mmix_operands_regaddr: 1055 case mmix_operands_pushj: 1056 case mmix_operands_get: 1057 case mmix_operands_put: 1058 case mmix_operands_set: 1059 case mmix_operands_save: 1060 case mmix_operands_unsave: 1061 max_operands = 2; 1062 break; 1063 1064 case mmix_operands_sync: 1065 case mmix_operands_jmp: 1066 case mmix_operands_resume: 1067 max_operands = 1; 1068 break; 1069 1070 /* The original 3 is fine for the rest. */ 1071 default: 1072 break; 1073 } 1074 1075 /* If this is GET or PUT, and we don't do allow those names to be 1076 equated, we need to parse the names ourselves, so we don't pick up a 1077 user label instead of the special register. */ 1078 if (! equated_spec_regs 1079 && (instruction->operands == mmix_operands_get 1080 || instruction->operands == mmix_operands_put)) 1081 n_operands = get_putget_operands (instruction, operands, exp); 1082 else 1083 n_operands = get_operands (max_operands, operands, exp); 1084 1085 /* If there's a fb-label on the current line, set that label. This must 1086 be done *after* evaluating expressions of operands, since neither a 1087 "1B" nor a "1F" refers to "1H" on the same line. */ 1088 if (current_fb_label >= 0) 1089 { 1090 fb_label_instance_inc (current_fb_label); 1091 colon (fb_label_name (current_fb_label, 0)); 1092 current_fb_label = -1; 1093 } 1094 1095 /* We also assume that the length of the instruction is at least 4, the 1096 size of an unexpanded instruction. We need a self-contained frag 1097 since we want the relocation to point to the instruction, not the 1098 variant part. */ 1099 1100 opcodep = frag_more (4); 1101 mmix_opcode_frag = opc_fragP = frag_now; 1102 frag_now->fr_opcode = opcodep; 1103 1104 /* Mark start of insn for DWARF2 debug features. */ 1105 if (OUTPUT_FLAVOR == bfd_target_elf_flavour) 1106 dwarf2_emit_insn (4); 1107 1108 md_number_to_chars (opcodep, instruction->match, 4); 1109 1110 switch (instruction->operands) 1111 { 1112 case mmix_operands_jmp: 1113 if (n_operands == 0 && ! mmix_gnu_syntax) 1114 /* Zeros are in place - nothing needs to be done when we have no 1115 operands. */ 1116 break; 1117 1118 /* Add a frag for a JMP relaxation; we need room for max four 1119 extra instructions. We don't do any work around here to check if 1120 we can determine the offset right away. */ 1121 if (n_operands != 1 || exp[0].X_op == O_register) 1122 { 1123 as_bad (_("invalid operand to opcode %s: `%s'"), 1124 instruction->name, operands); 1125 return; 1126 } 1127 1128 if (expand_op) 1129 frag_var (rs_machine_dependent, 4 * 4, 0, 1130 ENCODE_RELAX (STATE_JMP, STATE_UNDF), 1131 exp[0].X_add_symbol, 1132 exp[0].X_add_number, 1133 opcodep); 1134 else 1135 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal, 4, 1136 exp + 0, 1, BFD_RELOC_MMIX_ADDR27); 1137 break; 1138 1139 case mmix_operands_pushj: 1140 /* We take care of PUSHJ in full here. */ 1141 if (n_operands != 2 1142 || ((exp[0].X_op == O_constant || exp[0].X_op == O_register) 1143 && (exp[0].X_add_number > 255 || exp[0].X_add_number < 0))) 1144 { 1145 as_bad (_("invalid operands to opcode %s: `%s'"), 1146 instruction->name, operands); 1147 return; 1148 } 1149 1150 if (exp[0].X_op == O_register || exp[0].X_op == O_constant) 1151 opcodep[1] = exp[0].X_add_number; 1152 else 1153 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1, 1154 1, exp + 0, 0, BFD_RELOC_MMIX_REG_OR_BYTE); 1155 1156 if (expand_op) 1157 frag_var (rs_machine_dependent, PUSHJ_MAX_LEN - 4, 0, 1158 ENCODE_RELAX (STATE_PUSHJ, STATE_UNDF), 1159 exp[1].X_add_symbol, 1160 exp[1].X_add_number, 1161 opcodep); 1162 else 1163 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal, 4, 1164 exp + 1, 1, BFD_RELOC_MMIX_ADDR19); 1165 break; 1166 1167 case mmix_operands_regaddr: 1168 /* GETA/branch: Add a frag for relaxation. We don't do any work 1169 around here to check if we can determine the offset right away. */ 1170 if (n_operands != 2 || exp[1].X_op == O_register) 1171 { 1172 as_bad (_("invalid operands to opcode %s: `%s'"), 1173 instruction->name, operands); 1174 return; 1175 } 1176 1177 if (! expand_op) 1178 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal, 4, 1179 exp + 1, 1, BFD_RELOC_MMIX_ADDR19); 1180 else if (instruction->type == mmix_type_condbranch) 1181 frag_var (rs_machine_dependent, BCC_MAX_LEN - 4, 0, 1182 ENCODE_RELAX (STATE_BCC, STATE_UNDF), 1183 exp[1].X_add_symbol, 1184 exp[1].X_add_number, 1185 opcodep); 1186 else 1187 frag_var (rs_machine_dependent, GETA_MAX_LEN - 4, 0, 1188 ENCODE_RELAX (STATE_GETA, STATE_UNDF), 1189 exp[1].X_add_symbol, 1190 exp[1].X_add_number, 1191 opcodep); 1192 break; 1193 1194 default: 1195 break; 1196 } 1197 1198 switch (instruction->operands) 1199 { 1200 case mmix_operands_regs: 1201 /* We check the number of operands here, since we're in a 1202 FALLTHROUGH sequence in the next switch. */ 1203 if (n_operands != 3 || exp[2].X_op == O_constant) 1204 { 1205 as_bad (_("invalid operands to opcode %s: `%s'"), 1206 instruction->name, operands); 1207 return; 1208 } 1209 /* FALLTHROUGH. */ 1210 case mmix_operands_regs_z: 1211 if (n_operands != 3) 1212 { 1213 as_bad (_("invalid operands to opcode %s: `%s'"), 1214 instruction->name, operands); 1215 return; 1216 } 1217 /* FALLTHROUGH. */ 1218 case mmix_operands_reg_yz: 1219 case mmix_operands_roundregs_z: 1220 case mmix_operands_roundregs: 1221 case mmix_operands_regs_z_opt: 1222 case mmix_operands_neg: 1223 case mmix_operands_regaddr: 1224 case mmix_operands_get: 1225 case mmix_operands_set: 1226 case mmix_operands_save: 1227 if (n_operands < 1 1228 || (exp[0].X_op == O_register && exp[0].X_add_number > 255)) 1229 { 1230 as_bad (_("invalid operands to opcode %s: `%s'"), 1231 instruction->name, operands); 1232 return; 1233 } 1234 1235 if (exp[0].X_op == O_register) 1236 opcodep[1] = exp[0].X_add_number; 1237 else 1238 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1, 1239 1, exp + 0, 0, BFD_RELOC_MMIX_REG); 1240 break; 1241 1242 default: 1243 ; 1244 } 1245 1246 /* A corresponding once-over for those who take an 8-bit constant as 1247 their first operand. */ 1248 switch (instruction->operands) 1249 { 1250 case mmix_operands_pushgo: 1251 /* PUSHGO: X is a constant, but can be expressed as a register. 1252 We handle X here and use the common machinery of T,X,3,$ for 1253 the rest of the operands. */ 1254 if (n_operands < 2 1255 || ((exp[0].X_op == O_constant || exp[0].X_op == O_register) 1256 && (exp[0].X_add_number > 255 || exp[0].X_add_number < 0))) 1257 { 1258 as_bad (_("invalid operands to opcode %s: `%s'"), 1259 instruction->name, operands); 1260 return; 1261 } 1262 else if (exp[0].X_op == O_constant || exp[0].X_op == O_register) 1263 opcodep[1] = exp[0].X_add_number; 1264 else 1265 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1, 1266 1, exp + 0, 0, BFD_RELOC_MMIX_REG_OR_BYTE); 1267 break; 1268 1269 case mmix_operands_pop: 1270 if ((n_operands == 0 || n_operands == 1) && ! mmix_gnu_syntax) 1271 break; 1272 /* FALLTHROUGH. */ 1273 case mmix_operands_x_regs_z: 1274 if (n_operands < 1 1275 || (exp[0].X_op == O_constant 1276 && (exp[0].X_add_number > 255 1277 || exp[0].X_add_number < 0))) 1278 { 1279 as_bad (_("invalid operands to opcode %s: `%s'"), 1280 instruction->name, operands); 1281 return; 1282 } 1283 1284 if (exp[0].X_op == O_constant) 1285 opcodep[1] = exp[0].X_add_number; 1286 else 1287 /* FIXME: This doesn't bring us unsignedness checking. */ 1288 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1, 1289 1, exp + 0, 0, BFD_RELOC_8); 1290 default: 1291 ; 1292 } 1293 1294 /* Handle the rest. */ 1295 switch (instruction->operands) 1296 { 1297 case mmix_operands_set: 1298 /* SET: Either two registers, "$X,$Y", with Z field as zero, or 1299 "$X,YZ", meaning change the opcode to SETL. */ 1300 if (n_operands != 2 1301 || (exp[1].X_op == O_constant 1302 && (exp[1].X_add_number > 0xffff || exp[1].X_add_number < 0))) 1303 { 1304 as_bad (_("invalid operands to opcode %s: `%s'"), 1305 instruction->name, operands); 1306 return; 1307 } 1308 1309 if (exp[1].X_op == O_constant) 1310 { 1311 /* There's an ambiguity with "SET $0,Y" when Y isn't defined 1312 yet. To keep things simple, we assume that Y is then a 1313 register, and only change the opcode if Y is defined at this 1314 point. 1315 1316 There's no compatibility problem with mmixal, since it emits 1317 errors if the field is not defined at this point. */ 1318 md_number_to_chars (opcodep, SETL_INSN_BYTE, 1); 1319 1320 opcodep[2] = (exp[1].X_add_number >> 8) & 255; 1321 opcodep[3] = exp[1].X_add_number & 255; 1322 break; 1323 } 1324 /* FALLTHROUGH. */ 1325 case mmix_operands_x_regs_z: 1326 /* SYNCD: "X,$Y,$Z|Z". */ 1327 /* FALLTHROUGH. */ 1328 case mmix_operands_regs: 1329 /* Three registers, $X,$Y,$Z. */ 1330 /* FALLTHROUGH. */ 1331 case mmix_operands_regs_z: 1332 /* Operands "$X,$Y,$Z|Z", number of arguments checked above. */ 1333 /* FALLTHROUGH. */ 1334 case mmix_operands_pushgo: 1335 /* Operands "$X|X,$Y,$Z|Z", optional Z. */ 1336 /* FALLTHROUGH. */ 1337 case mmix_operands_regs_z_opt: 1338 /* Operands "$X,$Y,$Z|Z", with $Z|Z being optional, default 0. Any 1339 operands not completely decided yet are postponed to later in 1340 assembly (but not until link-time yet). */ 1341 1342 if ((n_operands != 2 && n_operands != 3) 1343 || (exp[1].X_op == O_register && exp[1].X_add_number > 255) 1344 || (n_operands == 3 1345 && ((exp[2].X_op == O_register 1346 && exp[2].X_add_number > 255 1347 && mmix_gnu_syntax) 1348 || (exp[2].X_op == O_constant 1349 && (exp[2].X_add_number > 255 1350 || exp[2].X_add_number < 0))))) 1351 { 1352 as_bad (_("invalid operands to opcode %s: `%s'"), 1353 instruction->name, operands); 1354 return; 1355 } 1356 1357 if (n_operands == 2) 1358 { 1359 symbolS *sym; 1360 1361 /* The last operand is immediate whenever we see just two 1362 operands. */ 1363 opcodep[0] |= IMM_OFFSET_BIT; 1364 1365 /* Now, we could either have an implied "0" as the Z operand, or 1366 it could be the constant of a "base address plus offset". It 1367 depends on whether it is allowed; only memory operations, as 1368 signified by instruction->type and "T" and "X" operand types, 1369 and it depends on whether we find a register in the second 1370 operand, exp[1]. */ 1371 if (exp[1].X_op == O_register && exp[1].X_add_number <= 255) 1372 { 1373 /* A zero then; all done. */ 1374 opcodep[2] = exp[1].X_add_number; 1375 break; 1376 } 1377 1378 /* Not known as a register. Is base address plus offset 1379 allowed, or can we assume that it is a register anyway? */ 1380 if ((instruction->operands != mmix_operands_regs_z_opt 1381 && instruction->operands != mmix_operands_x_regs_z 1382 && instruction->operands != mmix_operands_pushgo) 1383 || (instruction->type != mmix_type_memaccess_octa 1384 && instruction->type != mmix_type_memaccess_tetra 1385 && instruction->type != mmix_type_memaccess_wyde 1386 && instruction->type != mmix_type_memaccess_byte 1387 && instruction->type != mmix_type_memaccess_block 1388 && instruction->type != mmix_type_jsr 1389 && instruction->type != mmix_type_branch)) 1390 { 1391 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2, 1392 1, exp + 1, 0, BFD_RELOC_MMIX_REG); 1393 break; 1394 } 1395 1396 /* To avoid getting a NULL add_symbol for constants and then 1397 catching a SEGV in write_relocs since it doesn't handle 1398 constants well for relocs other than PC-relative, we need to 1399 pass expressions as symbols and use fix_new, not fix_new_exp. */ 1400 sym = make_expr_symbol (exp + 1); 1401 1402 /* Now we know it can be a "base address plus offset". Add 1403 proper fixup types so we can handle this later, when we've 1404 parsed everything. */ 1405 fix_new (opc_fragP, opcodep - opc_fragP->fr_literal + 2, 1406 8, sym, 0, 0, BFD_RELOC_MMIX_BASE_PLUS_OFFSET); 1407 break; 1408 } 1409 1410 if (exp[1].X_op == O_register) 1411 opcodep[2] = exp[1].X_add_number; 1412 else 1413 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2, 1414 1, exp + 1, 0, BFD_RELOC_MMIX_REG); 1415 1416 /* In mmixal compatibility mode, we allow special registers as 1417 constants for the Z operand. They have 256 added to their 1418 register numbers, so the right thing will happen if we just treat 1419 those as constants. */ 1420 if (exp[2].X_op == O_register && exp[2].X_add_number <= 255) 1421 opcodep[3] = exp[2].X_add_number; 1422 else if (exp[2].X_op == O_constant 1423 || (exp[2].X_op == O_register && exp[2].X_add_number > 255)) 1424 { 1425 opcodep[3] = exp[2].X_add_number; 1426 opcodep[0] |= IMM_OFFSET_BIT; 1427 } 1428 else 1429 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3, 1430 1, exp + 2, 0, 1431 (instruction->operands == mmix_operands_set 1432 || instruction->operands == mmix_operands_regs) 1433 ? BFD_RELOC_MMIX_REG : BFD_RELOC_MMIX_REG_OR_BYTE); 1434 break; 1435 1436 case mmix_operands_pop: 1437 /* POP, one eight and one 16-bit operand. */ 1438 if (n_operands == 0 && ! mmix_gnu_syntax) 1439 break; 1440 if (n_operands == 1 && ! mmix_gnu_syntax) 1441 goto a_single_24_bit_number_operand; 1442 /* FALLTHROUGH. */ 1443 case mmix_operands_reg_yz: 1444 /* A register and a 16-bit unsigned number. */ 1445 if (n_operands != 2 1446 || exp[1].X_op == O_register 1447 || (exp[1].X_op == O_constant 1448 && (exp[1].X_add_number > 0xffff || exp[1].X_add_number < 0))) 1449 { 1450 as_bad (_("invalid operands to opcode %s: `%s'"), 1451 instruction->name, operands); 1452 return; 1453 } 1454 1455 if (exp[1].X_op == O_constant) 1456 { 1457 opcodep[2] = (exp[1].X_add_number >> 8) & 255; 1458 opcodep[3] = exp[1].X_add_number & 255; 1459 } 1460 else 1461 /* FIXME: This doesn't bring us unsignedness checking. */ 1462 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2, 1463 2, exp + 1, 0, BFD_RELOC_16); 1464 break; 1465 1466 case mmix_operands_jmp: 1467 /* A JMP. Everything is already done. */ 1468 break; 1469 1470 case mmix_operands_roundregs: 1471 /* Two registers with optional rounding mode or constant in between. */ 1472 if ((n_operands == 3 && exp[2].X_op == O_constant) 1473 || (n_operands == 2 && exp[1].X_op == O_constant)) 1474 { 1475 as_bad (_("invalid operands to opcode %s: `%s'"), 1476 instruction->name, operands); 1477 return; 1478 } 1479 /* FALLTHROUGH. */ 1480 case mmix_operands_roundregs_z: 1481 /* Like FLOT, "$X,ROUND_MODE,$Z|Z", but the rounding mode is 1482 optional and can be the corresponding constant. */ 1483 { 1484 /* Which exp index holds the second operand (not the rounding 1485 mode). */ 1486 int op2no = n_operands - 1; 1487 1488 if ((n_operands != 2 && n_operands != 3) 1489 || ((exp[op2no].X_op == O_register 1490 && exp[op2no].X_add_number > 255) 1491 || (exp[op2no].X_op == O_constant 1492 && (exp[op2no].X_add_number > 255 1493 || exp[op2no].X_add_number < 0))) 1494 || (n_operands == 3 1495 /* We don't allow for the rounding mode to be deferred; it 1496 must be determined in the "first pass". It cannot be a 1497 symbol equated to a rounding mode, but defined after 1498 the first use. */ 1499 && ((exp[1].X_op == O_register 1500 && exp[1].X_add_number < 512) 1501 || (exp[1].X_op == O_constant 1502 && exp[1].X_add_number < 0 1503 && exp[1].X_add_number > 4) 1504 || (exp[1].X_op != O_register 1505 && exp[1].X_op != O_constant)))) 1506 { 1507 as_bad (_("invalid operands to opcode %s: `%s'"), 1508 instruction->name, operands); 1509 return; 1510 } 1511 1512 /* Add rounding mode if present. */ 1513 if (n_operands == 3) 1514 opcodep[2] = exp[1].X_add_number & 255; 1515 1516 if (exp[op2no].X_op == O_register) 1517 opcodep[3] = exp[op2no].X_add_number; 1518 else if (exp[op2no].X_op == O_constant) 1519 { 1520 opcodep[3] = exp[op2no].X_add_number; 1521 opcodep[0] |= IMM_OFFSET_BIT; 1522 } 1523 else 1524 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3, 1525 1, exp + op2no, 0, 1526 instruction->operands == mmix_operands_roundregs 1527 ? BFD_RELOC_MMIX_REG 1528 : BFD_RELOC_MMIX_REG_OR_BYTE); 1529 break; 1530 } 1531 1532 case mmix_operands_sync: 1533 a_single_24_bit_number_operand: 1534 if (n_operands != 1 1535 || exp[0].X_op == O_register 1536 || (exp[0].X_op == O_constant 1537 && (exp[0].X_add_number > 0xffffff || exp[0].X_add_number < 0))) 1538 { 1539 as_bad (_("invalid operands to opcode %s: `%s'"), 1540 instruction->name, operands); 1541 return; 1542 } 1543 1544 if (exp[0].X_op == O_constant) 1545 { 1546 opcodep[1] = (exp[0].X_add_number >> 16) & 255; 1547 opcodep[2] = (exp[0].X_add_number >> 8) & 255; 1548 opcodep[3] = exp[0].X_add_number & 255; 1549 } 1550 else 1551 /* FIXME: This doesn't bring us unsignedness checking. */ 1552 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1, 1553 3, exp + 0, 0, BFD_RELOC_24); 1554 break; 1555 1556 case mmix_operands_neg: 1557 /* Operands "$X,Y,$Z|Z"; NEG or NEGU. Y is optional, 0 is default. */ 1558 1559 if ((n_operands != 3 && n_operands != 2) 1560 || (n_operands == 3 && exp[1].X_op == O_register) 1561 || ((exp[1].X_op == O_constant || exp[1].X_op == O_register) 1562 && (exp[1].X_add_number > 255 || exp[1].X_add_number < 0)) 1563 || (n_operands == 3 1564 && ((exp[2].X_op == O_register && exp[2].X_add_number > 255) 1565 || (exp[2].X_op == O_constant 1566 && (exp[2].X_add_number > 255 1567 || exp[2].X_add_number < 0))))) 1568 { 1569 as_bad (_("invalid operands to opcode %s: `%s'"), 1570 instruction->name, operands); 1571 return; 1572 } 1573 1574 if (n_operands == 2) 1575 { 1576 if (exp[1].X_op == O_register) 1577 opcodep[3] = exp[1].X_add_number; 1578 else if (exp[1].X_op == O_constant) 1579 { 1580 opcodep[3] = exp[1].X_add_number; 1581 opcodep[0] |= IMM_OFFSET_BIT; 1582 } 1583 else 1584 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3, 1585 1, exp + 1, 0, BFD_RELOC_MMIX_REG_OR_BYTE); 1586 break; 1587 } 1588 1589 if (exp[1].X_op == O_constant) 1590 opcodep[2] = exp[1].X_add_number; 1591 else 1592 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2, 1593 1, exp + 1, 0, BFD_RELOC_8); 1594 1595 if (exp[2].X_op == O_register) 1596 opcodep[3] = exp[2].X_add_number; 1597 else if (exp[2].X_op == O_constant) 1598 { 1599 opcodep[3] = exp[2].X_add_number; 1600 opcodep[0] |= IMM_OFFSET_BIT; 1601 } 1602 else 1603 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3, 1604 1, exp + 2, 0, BFD_RELOC_MMIX_REG_OR_BYTE); 1605 break; 1606 1607 case mmix_operands_regaddr: 1608 /* A GETA/branch-type. */ 1609 break; 1610 1611 case mmix_operands_get: 1612 /* "$X,spec_reg"; GET. 1613 Like with rounding modes, we demand that the special register or 1614 symbol is already defined when we get here at the point of use. */ 1615 if (n_operands != 2 1616 || (exp[1].X_op == O_register 1617 && (exp[1].X_add_number < 256 || exp[1].X_add_number >= 512)) 1618 || (exp[1].X_op == O_constant 1619 && (exp[1].X_add_number < 0 || exp[1].X_add_number > 256)) 1620 || (exp[1].X_op != O_constant && exp[1].X_op != O_register)) 1621 { 1622 as_bad (_("invalid operands to opcode %s: `%s'"), 1623 instruction->name, operands); 1624 return; 1625 } 1626 1627 opcodep[3] = exp[1].X_add_number - 256; 1628 break; 1629 1630 case mmix_operands_put: 1631 /* "spec_reg,$Z|Z"; PUT. */ 1632 if (n_operands != 2 1633 || (exp[0].X_op == O_register 1634 && (exp[0].X_add_number < 256 || exp[0].X_add_number >= 512)) 1635 || (exp[0].X_op == O_constant 1636 && (exp[0].X_add_number < 0 || exp[0].X_add_number > 256)) 1637 || (exp[0].X_op != O_constant && exp[0].X_op != O_register)) 1638 { 1639 as_bad (_("invalid operands to opcode %s: `%s'"), 1640 instruction->name, operands); 1641 return; 1642 } 1643 1644 opcodep[1] = exp[0].X_add_number - 256; 1645 1646 /* Note that the Y field is zero. */ 1647 1648 if (exp[1].X_op == O_register) 1649 opcodep[3] = exp[1].X_add_number; 1650 else if (exp[1].X_op == O_constant) 1651 { 1652 opcodep[3] = exp[1].X_add_number; 1653 opcodep[0] |= IMM_OFFSET_BIT; 1654 } 1655 else 1656 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3, 1657 1, exp + 1, 0, BFD_RELOC_MMIX_REG_OR_BYTE); 1658 break; 1659 1660 case mmix_operands_save: 1661 /* "$X,0"; SAVE. */ 1662 if (n_operands != 2 1663 || exp[1].X_op != O_constant 1664 || exp[1].X_add_number != 0) 1665 { 1666 as_bad (_("invalid operands to opcode %s: `%s'"), 1667 instruction->name, operands); 1668 return; 1669 } 1670 break; 1671 1672 case mmix_operands_unsave: 1673 if (n_operands < 2 && ! mmix_gnu_syntax) 1674 { 1675 if (n_operands == 1) 1676 { 1677 if (exp[0].X_op == O_register) 1678 opcodep[3] = exp[0].X_add_number; 1679 else 1680 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3, 1681 1, exp, 0, BFD_RELOC_MMIX_REG); 1682 } 1683 break; 1684 } 1685 1686 /* "0,$Z"; UNSAVE. */ 1687 if (n_operands != 2 1688 || exp[0].X_op != O_constant 1689 || exp[0].X_add_number != 0 1690 || exp[1].X_op == O_constant 1691 || (exp[1].X_op == O_register 1692 && exp[1].X_add_number > 255)) 1693 { 1694 as_bad (_("invalid operands to opcode %s: `%s'"), 1695 instruction->name, operands); 1696 return; 1697 } 1698 1699 if (exp[1].X_op == O_register) 1700 opcodep[3] = exp[1].X_add_number; 1701 else 1702 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3, 1703 1, exp + 1, 0, BFD_RELOC_MMIX_REG); 1704 break; 1705 1706 case mmix_operands_xyz_opt: 1707 /* SWYM, TRIP, TRAP: zero, one, two or three operands. */ 1708 if (n_operands == 0 && ! mmix_gnu_syntax) 1709 /* Zeros are in place - nothing needs to be done for zero 1710 operands. We don't allow this in GNU syntax mode, because it 1711 was believed that the risk of missing to supply an operand is 1712 higher than the benefit of not having to specify a zero. */ 1713 ; 1714 else if (n_operands == 1 && exp[0].X_op != O_register) 1715 { 1716 if (exp[0].X_op == O_constant) 1717 { 1718 if (exp[0].X_add_number > 255*255*255 1719 || exp[0].X_add_number < 0) 1720 { 1721 as_bad (_("invalid operands to opcode %s: `%s'"), 1722 instruction->name, operands); 1723 return; 1724 } 1725 else 1726 { 1727 opcodep[1] = (exp[0].X_add_number >> 16) & 255; 1728 opcodep[2] = (exp[0].X_add_number >> 8) & 255; 1729 opcodep[3] = exp[0].X_add_number & 255; 1730 } 1731 } 1732 else 1733 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1, 1734 3, exp, 0, BFD_RELOC_24); 1735 } 1736 else if (n_operands == 2 1737 && exp[0].X_op != O_register 1738 && exp[1].X_op != O_register) 1739 { 1740 /* Two operands. */ 1741 1742 if (exp[0].X_op == O_constant) 1743 { 1744 if (exp[0].X_add_number > 255 1745 || exp[0].X_add_number < 0) 1746 { 1747 as_bad (_("invalid operands to opcode %s: `%s'"), 1748 instruction->name, operands); 1749 return; 1750 } 1751 else 1752 opcodep[1] = exp[0].X_add_number & 255; 1753 } 1754 else 1755 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1, 1756 1, exp, 0, BFD_RELOC_8); 1757 1758 if (exp[1].X_op == O_constant) 1759 { 1760 if (exp[1].X_add_number > 255*255 1761 || exp[1].X_add_number < 0) 1762 { 1763 as_bad (_("invalid operands to opcode %s: `%s'"), 1764 instruction->name, operands); 1765 return; 1766 } 1767 else 1768 { 1769 opcodep[2] = (exp[1].X_add_number >> 8) & 255; 1770 opcodep[3] = exp[1].X_add_number & 255; 1771 } 1772 } 1773 else 1774 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2, 1775 2, exp + 1, 0, BFD_RELOC_16); 1776 } 1777 else if (n_operands == 3 1778 && exp[0].X_op != O_register 1779 && exp[1].X_op != O_register 1780 && exp[2].X_op != O_register) 1781 { 1782 /* Three operands. */ 1783 1784 if (exp[0].X_op == O_constant) 1785 { 1786 if (exp[0].X_add_number > 255 1787 || exp[0].X_add_number < 0) 1788 { 1789 as_bad (_("invalid operands to opcode %s: `%s'"), 1790 instruction->name, operands); 1791 return; 1792 } 1793 else 1794 opcodep[1] = exp[0].X_add_number & 255; 1795 } 1796 else 1797 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1, 1798 1, exp, 0, BFD_RELOC_8); 1799 1800 if (exp[1].X_op == O_constant) 1801 { 1802 if (exp[1].X_add_number > 255 1803 || exp[1].X_add_number < 0) 1804 { 1805 as_bad (_("invalid operands to opcode %s: `%s'"), 1806 instruction->name, operands); 1807 return; 1808 } 1809 else 1810 opcodep[2] = exp[1].X_add_number & 255; 1811 } 1812 else 1813 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2, 1814 1, exp + 1, 0, BFD_RELOC_8); 1815 1816 if (exp[2].X_op == O_constant) 1817 { 1818 if (exp[2].X_add_number > 255 1819 || exp[2].X_add_number < 0) 1820 { 1821 as_bad (_("invalid operands to opcode %s: `%s'"), 1822 instruction->name, operands); 1823 return; 1824 } 1825 else 1826 opcodep[3] = exp[2].X_add_number & 255; 1827 } 1828 else 1829 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3, 1830 1, exp + 2, 0, BFD_RELOC_8); 1831 } 1832 else if (n_operands <= 3 1833 && (strcmp (instruction->name, "trip") == 0 1834 || strcmp (instruction->name, "trap") == 0)) 1835 { 1836 /* The meaning of operands to TRIP and TRAP are not defined, so 1837 we add combinations not handled above here as we find them. */ 1838 if (n_operands == 3) 1839 { 1840 /* Don't require non-register operands. Always generate 1841 fixups, so we don't have to copy lots of code and create 1842 maintenance problems. TRIP is supposed to be a rare 1843 instruction, so the overhead should not matter. We 1844 aren't allowed to fix_new_exp for an expression which is 1845 an O_register at this point, however. */ 1846 if (exp[0].X_op == O_register) 1847 opcodep[1] = exp[0].X_add_number; 1848 else 1849 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1, 1850 1, exp, 0, BFD_RELOC_MMIX_REG_OR_BYTE); 1851 if (exp[1].X_op == O_register) 1852 opcodep[2] = exp[1].X_add_number; 1853 else 1854 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2, 1855 1, exp + 1, 0, BFD_RELOC_MMIX_REG_OR_BYTE); 1856 if (exp[2].X_op == O_register) 1857 opcodep[3] = exp[2].X_add_number; 1858 else 1859 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3, 1860 1, exp + 2, 0, BFD_RELOC_MMIX_REG_OR_BYTE); 1861 } 1862 else if (n_operands == 2) 1863 { 1864 if (exp[0].X_op == O_register) 1865 opcodep[2] = exp[0].X_add_number; 1866 else 1867 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2, 1868 1, exp, 0, BFD_RELOC_MMIX_REG_OR_BYTE); 1869 if (exp[1].X_op == O_register) 1870 opcodep[3] = exp[1].X_add_number; 1871 else 1872 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3, 1873 1, exp + 1, 0, BFD_RELOC_MMIX_REG_OR_BYTE); 1874 } 1875 else 1876 { 1877 as_bad (_("unsupported operands to %s: `%s'"), 1878 instruction->name, operands); 1879 return; 1880 } 1881 } 1882 else 1883 { 1884 as_bad (_("invalid operands to opcode %s: `%s'"), 1885 instruction->name, operands); 1886 return; 1887 } 1888 break; 1889 1890 case mmix_operands_resume: 1891 if (n_operands == 0 && ! mmix_gnu_syntax) 1892 break; 1893 1894 if (n_operands != 1 1895 || exp[0].X_op == O_register 1896 || (exp[0].X_op == O_constant 1897 && (exp[0].X_add_number < 0 1898 || exp[0].X_add_number > 255))) 1899 { 1900 as_bad (_("invalid operands to opcode %s: `%s'"), 1901 instruction->name, operands); 1902 return; 1903 } 1904 1905 if (exp[0].X_op == O_constant) 1906 opcodep[3] = exp[0].X_add_number; 1907 else 1908 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3, 1909 1, exp + 0, 0, BFD_RELOC_8); 1910 break; 1911 1912 case mmix_operands_pushj: 1913 /* All is done for PUSHJ already. */ 1914 break; 1915 1916 default: 1917 BAD_CASE (instruction->operands); 1918 } 1919 } 1920 1921 /* For the benefit of insns that start with a digit, we assemble by way of 1922 tc_unrecognized_line too, through this function. */ 1923 1924 int 1925 mmix_assemble_return_nonzero (str) 1926 char *str; 1927 { 1928 int last_error_count = had_errors (); 1929 char *s2 = str; 1930 char c; 1931 1932 /* Normal instruction handling downcases, so we must too. */ 1933 while (ISALNUM (*s2)) 1934 { 1935 if (ISUPPER ((unsigned char) *s2)) 1936 *s2 = TOLOWER (*s2); 1937 s2++; 1938 } 1939 1940 /* Cut the line for sake of the assembly. */ 1941 for (s2 = str; *s2 && *s2 != '\n'; s2++) 1942 ; 1943 1944 c = *s2; 1945 *s2 = 0; 1946 md_assemble (str); 1947 *s2 = c; 1948 1949 return had_errors () == last_error_count; 1950 } 1951 1952 /* The PREFIX pseudo. */ 1953 1954 static void 1955 s_prefix (unused) 1956 int unused ATTRIBUTE_UNUSED; 1957 { 1958 char *p; 1959 int c; 1960 1961 SKIP_WHITESPACE (); 1962 1963 p = input_line_pointer; 1964 1965 c = get_symbol_end (); 1966 1967 /* Reseting prefix? */ 1968 if (*p == ':' && p[1] == 0) 1969 mmix_current_prefix = NULL; 1970 else 1971 { 1972 /* Put this prefix on the mmix symbols obstack. We could malloc and 1973 free it separately, but then we'd have to worry about that. 1974 People using up memory on prefixes have other problems. */ 1975 obstack_grow (&mmix_sym_obstack, p, strlen (p) + 1); 1976 p = obstack_finish (&mmix_sym_obstack); 1977 1978 /* Accumulate prefixes, and strip a leading ':'. */ 1979 if (mmix_current_prefix != NULL || *p == ':') 1980 p = mmix_prefix_name (p); 1981 1982 mmix_current_prefix = p; 1983 } 1984 1985 *input_line_pointer = c; 1986 1987 mmix_handle_rest_of_empty_line (); 1988 } 1989 1990 /* We implement prefixes by using the tc_canonicalize_symbol_name hook, 1991 and store each prefixed name on a (separate) obstack. This means that 1992 the name is on the "notes" obstack in non-prefixed form and on the 1993 mmix_sym_obstack in prefixed form, but currently it is not worth 1994 rewriting the whole GAS symbol handling to improve "hooking" to avoid 1995 that. (It might be worth a rewrite for other reasons, though). */ 1996 1997 char * 1998 mmix_prefix_name (shortname) 1999 char *shortname; 2000 { 2001 if (*shortname == ':') 2002 return shortname + 1; 2003 2004 if (mmix_current_prefix == NULL) 2005 as_fatal (_("internal: mmix_prefix_name but empty prefix")); 2006 2007 if (*shortname == '$') 2008 return shortname; 2009 2010 obstack_grow (&mmix_sym_obstack, mmix_current_prefix, 2011 strlen (mmix_current_prefix)); 2012 obstack_grow (&mmix_sym_obstack, shortname, strlen (shortname) + 1); 2013 return obstack_finish (&mmix_sym_obstack); 2014 } 2015 2016 /* The GREG pseudo. At LABEL, we have the name of a symbol that we 2017 want to make a register symbol, and which should be initialized with 2018 the value in the expression at INPUT_LINE_POINTER (defaulting to 0). 2019 Either and (perhaps less meaningful) both may be missing. LABEL must 2020 be persistent, perhaps allocated on an obstack. */ 2021 2022 static void 2023 mmix_greg_internal (label) 2024 char *label; 2025 { 2026 expressionS *expP = &mmix_raw_gregs[n_of_raw_gregs].exp; 2027 2028 /* Don't set the section to register contents section before the 2029 expression has been parsed; it may refer to the current position. */ 2030 expression (expP); 2031 2032 /* FIXME: Check that no expression refers to the register contents 2033 section. May need to be done in elf64-mmix.c. */ 2034 if (expP->X_op == O_absent) 2035 { 2036 /* Default to zero if the expression was absent. */ 2037 expP->X_op = O_constant; 2038 expP->X_add_number = 0; 2039 expP->X_unsigned = 0; 2040 expP->X_add_symbol = NULL; 2041 expP->X_op_symbol = NULL; 2042 } 2043 2044 /* We must handle prefixes here, as we save the labels and expressions 2045 to be output later. */ 2046 mmix_raw_gregs[n_of_raw_gregs].label 2047 = mmix_current_prefix == NULL ? label : mmix_prefix_name (label); 2048 2049 if (n_of_raw_gregs == MAX_GREGS - 1) 2050 as_bad (_("too many GREG registers allocated (max %d)"), MAX_GREGS); 2051 else 2052 n_of_raw_gregs++; 2053 2054 mmix_handle_rest_of_empty_line (); 2055 } 2056 2057 /* The ".greg label,expr" worker. */ 2058 2059 static void 2060 s_greg (unused) 2061 int unused ATTRIBUTE_UNUSED; 2062 { 2063 char *p; 2064 char c; 2065 p = input_line_pointer; 2066 2067 /* This will skip over what can be a symbol and zero out the next 2068 character, which we assume is a ',' or other meaningful delimiter. 2069 What comes after that is the initializer expression for the 2070 register. */ 2071 c = get_symbol_end (); 2072 2073 if (! is_end_of_line[(unsigned char) c]) 2074 input_line_pointer++; 2075 2076 if (*p) 2077 { 2078 /* The label must be persistent; it's not used until after all input 2079 has been seen. */ 2080 obstack_grow (&mmix_sym_obstack, p, strlen (p) + 1); 2081 mmix_greg_internal (obstack_finish (&mmix_sym_obstack)); 2082 } 2083 else 2084 mmix_greg_internal (NULL); 2085 } 2086 2087 /* The "BSPEC expr" worker. */ 2088 2089 static void 2090 s_bspec (unused) 2091 int unused ATTRIBUTE_UNUSED; 2092 { 2093 asection *expsec; 2094 asection *sec; 2095 char secname[sizeof (MMIX_OTHER_SPEC_SECTION_PREFIX) + 20] 2096 = MMIX_OTHER_SPEC_SECTION_PREFIX; 2097 expressionS exp; 2098 int n; 2099 2100 /* Get a constant expression which we can evaluate *now*. Supporting 2101 more complex (though assembly-time computable) expressions is 2102 feasible but Too Much Work for something of unknown usefulness like 2103 BSPEC-ESPEC. */ 2104 expsec = expression (&exp); 2105 mmix_handle_rest_of_empty_line (); 2106 2107 /* Check that we don't have another BSPEC in progress. */ 2108 if (doing_bspec) 2109 { 2110 as_bad (_("BSPEC already active. Nesting is not supported.")); 2111 return; 2112 } 2113 2114 if (exp.X_op != O_constant 2115 || expsec != absolute_section 2116 || exp.X_add_number < 0 2117 || exp.X_add_number > 65535) 2118 { 2119 as_bad (_("invalid BSPEC expression")); 2120 exp.X_add_number = 0; 2121 } 2122 2123 n = (int) exp.X_add_number; 2124 2125 sprintf (secname + strlen (MMIX_OTHER_SPEC_SECTION_PREFIX), "%d", n); 2126 sec = bfd_get_section_by_name (stdoutput, secname); 2127 if (sec == NULL) 2128 { 2129 /* We need a non-volatile name as it will be stored in the section 2130 struct. */ 2131 char *newsecname = xstrdup (secname); 2132 sec = bfd_make_section (stdoutput, newsecname); 2133 2134 if (sec == NULL) 2135 as_fatal (_("can't create section %s"), newsecname); 2136 2137 if (!bfd_set_section_flags (stdoutput, sec, 2138 bfd_get_section_flags (stdoutput, sec) 2139 | SEC_READONLY)) 2140 as_fatal (_("can't set section flags for section %s"), newsecname); 2141 } 2142 2143 /* Tell ELF about the pending section change. */ 2144 obj_elf_section_change_hook (); 2145 subseg_set (sec, 0); 2146 2147 /* Save position for missing ESPEC. */ 2148 as_where (&bspec_file, &bspec_line); 2149 2150 doing_bspec = 1; 2151 } 2152 2153 /* The "ESPEC" worker. */ 2154 2155 static void 2156 s_espec (unused) 2157 int unused ATTRIBUTE_UNUSED; 2158 { 2159 /* First, check that we *do* have a BSPEC in progress. */ 2160 if (! doing_bspec) 2161 { 2162 as_bad (_("ESPEC without preceding BSPEC")); 2163 return; 2164 } 2165 2166 mmix_handle_rest_of_empty_line (); 2167 doing_bspec = 0; 2168 2169 /* When we told ELF about the section change in s_bspec, it stored the 2170 previous section for us so we can get at it with the equivalent of a 2171 .previous pseudo. */ 2172 obj_elf_previous (0); 2173 } 2174 2175 /* The " .local expr" and " local expr" worker. We make a BFD_MMIX_LOCAL 2176 relocation against the current position against the expression. 2177 Implementing this by means of contents in a section lost. */ 2178 2179 static void 2180 mmix_s_local (unused) 2181 int unused ATTRIBUTE_UNUSED; 2182 { 2183 expressionS exp; 2184 2185 /* Don't set the section to register contents section before the 2186 expression has been parsed; it may refer to the current position in 2187 some contorted way. */ 2188 expression (&exp); 2189 2190 if (exp.X_op == O_absent) 2191 { 2192 as_bad (_("missing local expression")); 2193 return; 2194 } 2195 else if (exp.X_op == O_register) 2196 { 2197 /* fix_new_exp doesn't like O_register. Should be configurable. 2198 We're fine with a constant here, though. */ 2199 exp.X_op = O_constant; 2200 } 2201 2202 fix_new_exp (frag_now, 0, 0, &exp, 0, BFD_RELOC_MMIX_LOCAL); 2203 mmix_handle_rest_of_empty_line (); 2204 } 2205 2206 /* Set fragP->fr_var to the initial guess of the size of a relaxable insn 2207 and return it. Sizes of other instructions are not known. This 2208 function may be called multiple times. */ 2209 2210 int 2211 md_estimate_size_before_relax (fragP, segment) 2212 fragS *fragP; 2213 segT segment; 2214 { 2215 int length; 2216 2217 #define HANDLE_RELAXABLE(state) \ 2218 case ENCODE_RELAX (state, STATE_UNDF): \ 2219 if (fragP->fr_symbol != NULL \ 2220 && S_GET_SEGMENT (fragP->fr_symbol) == segment \ 2221 && !S_IS_WEAK (fragP->fr_symbol)) \ 2222 { \ 2223 /* The symbol lies in the same segment - a relaxable case. */ \ 2224 fragP->fr_subtype \ 2225 = ENCODE_RELAX (state, STATE_ZERO); \ 2226 } \ 2227 break; 2228 2229 switch (fragP->fr_subtype) 2230 { 2231 HANDLE_RELAXABLE (STATE_GETA); 2232 HANDLE_RELAXABLE (STATE_BCC); 2233 HANDLE_RELAXABLE (STATE_JMP); 2234 2235 case ENCODE_RELAX (STATE_PUSHJ, STATE_UNDF): 2236 if (fragP->fr_symbol != NULL 2237 && S_GET_SEGMENT (fragP->fr_symbol) == segment 2238 && !S_IS_WEAK (fragP->fr_symbol)) 2239 /* The symbol lies in the same segment - a relaxable case. */ 2240 fragP->fr_subtype = ENCODE_RELAX (STATE_PUSHJ, STATE_ZERO); 2241 else if (pushj_stubs) 2242 /* If we're to generate stubs, assume we can reach a stub after 2243 the section. */ 2244 fragP->fr_subtype = ENCODE_RELAX (STATE_PUSHJSTUB, STATE_ZERO); 2245 /* FALLTHROUGH. */ 2246 case ENCODE_RELAX (STATE_PUSHJ, STATE_ZERO): 2247 case ENCODE_RELAX (STATE_PUSHJSTUB, STATE_ZERO): 2248 /* We need to distinguish different relaxation rounds. */ 2249 seg_info (segment)->tc_segment_info_data.last_stubfrag = fragP; 2250 break; 2251 2252 case ENCODE_RELAX (STATE_GETA, STATE_ZERO): 2253 case ENCODE_RELAX (STATE_BCC, STATE_ZERO): 2254 case ENCODE_RELAX (STATE_JMP, STATE_ZERO): 2255 /* When relaxing a section for the second time, we don't need to do 2256 anything except making sure that fr_var is set right. */ 2257 break; 2258 2259 case STATE_GREG_DEF: 2260 length = fragP->tc_frag_data != NULL ? 0 : 8; 2261 fragP->fr_var = length; 2262 2263 /* Don't consult the relax_table; it isn't valid for this 2264 relaxation. */ 2265 return length; 2266 break; 2267 2268 default: 2269 BAD_CASE (fragP->fr_subtype); 2270 } 2271 2272 length = mmix_relax_table[fragP->fr_subtype].rlx_length; 2273 fragP->fr_var = length; 2274 2275 return length; 2276 } 2277 2278 /* Turn a string in input_line_pointer into a floating point constant of type 2279 type, and store the appropriate bytes in *litP. The number of LITTLENUMS 2280 emitted is stored in *sizeP . An error message is returned, or NULL on 2281 OK. */ 2282 2283 char * 2284 md_atof (type, litP, sizeP) 2285 int type; 2286 char *litP; 2287 int *sizeP; 2288 { 2289 int prec; 2290 LITTLENUM_TYPE words[4]; 2291 char *t; 2292 int i; 2293 2294 switch (type) 2295 { 2296 /* FIXME: Having 'f' in mmix_flt_chars (and here) makes it 2297 problematic to also have a forward reference in an expression. 2298 The testsuite wants it, and it's customary. 2299 We'll deal with the real problems when they come; we share the 2300 problem with most other ports. */ 2301 case 'f': 2302 case 'r': 2303 prec = 2; 2304 break; 2305 case 'd': 2306 prec = 4; 2307 break; 2308 default: 2309 *sizeP = 0; 2310 return _("bad call to md_atof"); 2311 } 2312 2313 t = atof_ieee (input_line_pointer, type, words); 2314 if (t) 2315 input_line_pointer = t; 2316 2317 *sizeP = prec * 2; 2318 2319 for (i = 0; i < prec; i++) 2320 { 2321 md_number_to_chars (litP, (valueT) words[i], 2); 2322 litP += 2; 2323 } 2324 return NULL; 2325 } 2326 2327 /* Convert variable-sized frags into one or more fixups. */ 2328 2329 void 2330 md_convert_frag (abfd, sec, fragP) 2331 bfd *abfd ATTRIBUTE_UNUSED; 2332 segT sec ATTRIBUTE_UNUSED; 2333 fragS *fragP; 2334 { 2335 /* Pointer to first byte in variable-sized part of the frag. */ 2336 char *var_partp; 2337 2338 /* Pointer to first opcode byte in frag. */ 2339 char *opcodep; 2340 2341 /* Size in bytes of variable-sized part of frag. */ 2342 int var_part_size = 0; 2343 2344 /* This is part of *fragP. It contains all information about addresses 2345 and offsets to varying parts. */ 2346 symbolS *symbolP; 2347 unsigned long var_part_offset; 2348 2349 /* This is the frag for the opcode. It, rather than fragP, must be used 2350 when emitting a frag for the opcode. */ 2351 fragS *opc_fragP = fragP->tc_frag_data; 2352 fixS *tmpfixP; 2353 2354 /* Where, in file space, does addr point? */ 2355 bfd_vma target_address; 2356 bfd_vma opcode_address; 2357 2358 know (fragP->fr_type == rs_machine_dependent); 2359 2360 var_part_offset = fragP->fr_fix; 2361 var_partp = fragP->fr_literal + var_part_offset; 2362 opcodep = fragP->fr_opcode; 2363 2364 symbolP = fragP->fr_symbol; 2365 2366 target_address 2367 = ((symbolP ? S_GET_VALUE (symbolP) : 0) + fragP->fr_offset); 2368 2369 /* The opcode that would be extended is the last four "fixed" bytes. */ 2370 opcode_address = fragP->fr_address + fragP->fr_fix - 4; 2371 2372 switch (fragP->fr_subtype) 2373 { 2374 case ENCODE_RELAX (STATE_PUSHJSTUB, STATE_ZERO): 2375 /* Setting the unknown bits to 0 seems the most appropriate. */ 2376 mmix_set_geta_branch_offset (opcodep, 0); 2377 tmpfixP = fix_new (opc_fragP, opcodep - opc_fragP->fr_literal, 8, 2378 fragP->fr_symbol, fragP->fr_offset, 1, 2379 BFD_RELOC_MMIX_PUSHJ_STUBBABLE); 2380 COPY_FR_WHERE_TO_FX (fragP, tmpfixP); 2381 var_part_size = 0; 2382 break; 2383 2384 case ENCODE_RELAX (STATE_GETA, STATE_ZERO): 2385 case ENCODE_RELAX (STATE_BCC, STATE_ZERO): 2386 case ENCODE_RELAX (STATE_PUSHJ, STATE_ZERO): 2387 mmix_set_geta_branch_offset (opcodep, target_address - opcode_address); 2388 if (linkrelax) 2389 { 2390 tmpfixP 2391 = fix_new (opc_fragP, opcodep - opc_fragP->fr_literal, 4, 2392 fragP->fr_symbol, fragP->fr_offset, 1, 2393 BFD_RELOC_MMIX_ADDR19); 2394 COPY_FR_WHERE_TO_FX (fragP, tmpfixP); 2395 } 2396 var_part_size = 0; 2397 break; 2398 2399 case ENCODE_RELAX (STATE_JMP, STATE_ZERO): 2400 mmix_set_jmp_offset (opcodep, target_address - opcode_address); 2401 if (linkrelax) 2402 { 2403 tmpfixP 2404 = fix_new (opc_fragP, opcodep - opc_fragP->fr_literal, 4, 2405 fragP->fr_symbol, fragP->fr_offset, 1, 2406 BFD_RELOC_MMIX_ADDR27); 2407 COPY_FR_WHERE_TO_FX (fragP, tmpfixP); 2408 } 2409 var_part_size = 0; 2410 break; 2411 2412 case STATE_GREG_DEF: 2413 if (fragP->tc_frag_data == NULL) 2414 { 2415 /* We must initialize data that's supposed to be "fixed up" to 2416 avoid emitting garbage, because md_apply_fix3 won't do 2417 anything for undefined symbols. */ 2418 md_number_to_chars (var_partp, 0, 8); 2419 tmpfixP 2420 = fix_new (fragP, var_partp - fragP->fr_literal, 8, 2421 fragP->fr_symbol, fragP->fr_offset, 0, BFD_RELOC_64); 2422 COPY_FR_WHERE_TO_FX (fragP, tmpfixP); 2423 mmix_gregs[n_of_cooked_gregs++] = tmpfixP; 2424 var_part_size = 8; 2425 } 2426 else 2427 var_part_size = 0; 2428 break; 2429 2430 #define HANDLE_MAX_RELOC(state, reloc) \ 2431 case ENCODE_RELAX (state, STATE_MAX): \ 2432 var_part_size \ 2433 = mmix_relax_table[ENCODE_RELAX (state, STATE_MAX)].rlx_length; \ 2434 mmix_fill_nops (var_partp, var_part_size / 4); \ 2435 if (warn_on_expansion) \ 2436 as_warn_where (fragP->fr_file, fragP->fr_line, \ 2437 _("operand out of range, instruction expanded")); \ 2438 tmpfixP = fix_new (fragP, var_partp - fragP->fr_literal - 4, 8, \ 2439 fragP->fr_symbol, fragP->fr_offset, 1, reloc); \ 2440 COPY_FR_WHERE_TO_FX (fragP, tmpfixP); \ 2441 break 2442 2443 HANDLE_MAX_RELOC (STATE_GETA, BFD_RELOC_MMIX_GETA); 2444 HANDLE_MAX_RELOC (STATE_BCC, BFD_RELOC_MMIX_CBRANCH); 2445 HANDLE_MAX_RELOC (STATE_PUSHJ, BFD_RELOC_MMIX_PUSHJ); 2446 HANDLE_MAX_RELOC (STATE_JMP, BFD_RELOC_MMIX_JMP); 2447 2448 default: 2449 BAD_CASE (fragP->fr_subtype); 2450 break; 2451 } 2452 2453 fragP->fr_fix += var_part_size; 2454 fragP->fr_var = 0; 2455 } 2456 2457 /* Applies the desired value to the specified location. 2458 Also sets up addends for RELA type relocations. 2459 Stolen from tc-mcore.c. 2460 2461 Note that this function isn't called when linkrelax != 0. */ 2462 2463 void 2464 md_apply_fix3 (fixP, valP, segment) 2465 fixS * fixP; 2466 valueT * valP; 2467 segT segment; 2468 { 2469 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal; 2470 /* Note: use offsetT because it is signed, valueT is unsigned. */ 2471 offsetT val = (offsetT) * valP; 2472 segT symsec 2473 = (fixP->fx_addsy == NULL 2474 ? absolute_section : S_GET_SEGMENT (fixP->fx_addsy)); 2475 2476 /* If the fix is relative to a symbol which is not defined, or, (if 2477 pcrel), not in the same segment as the fix, we cannot resolve it 2478 here. */ 2479 if (fixP->fx_addsy != NULL 2480 && (! S_IS_DEFINED (fixP->fx_addsy) 2481 || S_IS_WEAK (fixP->fx_addsy) 2482 || (fixP->fx_pcrel && symsec != segment) 2483 || (! fixP->fx_pcrel 2484 && symsec != absolute_section 2485 && ((fixP->fx_r_type != BFD_RELOC_MMIX_REG 2486 && fixP->fx_r_type != BFD_RELOC_MMIX_REG_OR_BYTE) 2487 || symsec != reg_section)))) 2488 { 2489 fixP->fx_done = 0; 2490 return; 2491 } 2492 else if (fixP->fx_r_type == BFD_RELOC_MMIX_LOCAL 2493 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT 2494 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY) 2495 { 2496 /* These are never "fixed". */ 2497 fixP->fx_done = 0; 2498 return; 2499 } 2500 else 2501 /* We assume every other relocation is "fixed". */ 2502 fixP->fx_done = 1; 2503 2504 switch (fixP->fx_r_type) 2505 { 2506 case BFD_RELOC_64: 2507 case BFD_RELOC_32: 2508 case BFD_RELOC_24: 2509 case BFD_RELOC_16: 2510 case BFD_RELOC_8: 2511 case BFD_RELOC_64_PCREL: 2512 case BFD_RELOC_32_PCREL: 2513 case BFD_RELOC_24_PCREL: 2514 case BFD_RELOC_16_PCREL: 2515 case BFD_RELOC_8_PCREL: 2516 md_number_to_chars (buf, val, fixP->fx_size); 2517 break; 2518 2519 case BFD_RELOC_MMIX_ADDR19: 2520 if (expand_op) 2521 { 2522 /* This shouldn't happen. */ 2523 BAD_CASE (fixP->fx_r_type); 2524 break; 2525 } 2526 /* FALLTHROUGH. */ 2527 case BFD_RELOC_MMIX_GETA: 2528 case BFD_RELOC_MMIX_CBRANCH: 2529 case BFD_RELOC_MMIX_PUSHJ: 2530 case BFD_RELOC_MMIX_PUSHJ_STUBBABLE: 2531 /* If this fixup is out of range, punt to the linker to emit an 2532 error. This should only happen with -no-expand. */ 2533 if (val < -(((offsetT) 1 << 19)/2) 2534 || val >= ((offsetT) 1 << 19)/2 - 1 2535 || (val & 3) != 0) 2536 { 2537 if (warn_on_expansion) 2538 as_warn_where (fixP->fx_file, fixP->fx_line, 2539 _("operand out of range")); 2540 fixP->fx_done = 0; 2541 val = 0; 2542 } 2543 mmix_set_geta_branch_offset (buf, val); 2544 break; 2545 2546 case BFD_RELOC_MMIX_ADDR27: 2547 if (expand_op) 2548 { 2549 /* This shouldn't happen. */ 2550 BAD_CASE (fixP->fx_r_type); 2551 break; 2552 } 2553 /* FALLTHROUGH. */ 2554 case BFD_RELOC_MMIX_JMP: 2555 /* If this fixup is out of range, punt to the linker to emit an 2556 error. This should only happen with -no-expand. */ 2557 if (val < -(((offsetT) 1 << 27)/2) 2558 || val >= ((offsetT) 1 << 27)/2 - 1 2559 || (val & 3) != 0) 2560 { 2561 if (warn_on_expansion) 2562 as_warn_where (fixP->fx_file, fixP->fx_line, 2563 _("operand out of range")); 2564 fixP->fx_done = 0; 2565 val = 0; 2566 } 2567 mmix_set_jmp_offset (buf, val); 2568 break; 2569 2570 case BFD_RELOC_MMIX_REG_OR_BYTE: 2571 if (fixP->fx_addsy != NULL 2572 && (S_GET_SEGMENT (fixP->fx_addsy) != reg_section 2573 || S_GET_VALUE (fixP->fx_addsy) > 255) 2574 && S_GET_SEGMENT (fixP->fx_addsy) != absolute_section) 2575 { 2576 as_bad_where (fixP->fx_file, fixP->fx_line, 2577 _("invalid operands")); 2578 /* We don't want this "symbol" appearing in output, because 2579 that will fail. */ 2580 fixP->fx_done = 1; 2581 } 2582 2583 buf[0] = val; 2584 2585 /* If this reloc is for a Z field, we need to adjust 2586 the opcode if we got a constant here. 2587 FIXME: Can we make this more robust? */ 2588 2589 if ((fixP->fx_where & 3) == 3 2590 && (fixP->fx_addsy == NULL 2591 || S_GET_SEGMENT (fixP->fx_addsy) == absolute_section)) 2592 buf[-3] |= IMM_OFFSET_BIT; 2593 break; 2594 2595 case BFD_RELOC_MMIX_REG: 2596 if (fixP->fx_addsy == NULL 2597 || S_GET_SEGMENT (fixP->fx_addsy) != reg_section 2598 || S_GET_VALUE (fixP->fx_addsy) > 255) 2599 { 2600 as_bad_where (fixP->fx_file, fixP->fx_line, 2601 _("invalid operands")); 2602 fixP->fx_done = 1; 2603 } 2604 2605 *buf = val; 2606 break; 2607 2608 case BFD_RELOC_MMIX_BASE_PLUS_OFFSET: 2609 /* These are never "fixed". */ 2610 fixP->fx_done = 0; 2611 return; 2612 2613 case BFD_RELOC_MMIX_PUSHJ_1: 2614 case BFD_RELOC_MMIX_PUSHJ_2: 2615 case BFD_RELOC_MMIX_PUSHJ_3: 2616 case BFD_RELOC_MMIX_CBRANCH_J: 2617 case BFD_RELOC_MMIX_CBRANCH_1: 2618 case BFD_RELOC_MMIX_CBRANCH_2: 2619 case BFD_RELOC_MMIX_CBRANCH_3: 2620 case BFD_RELOC_MMIX_GETA_1: 2621 case BFD_RELOC_MMIX_GETA_2: 2622 case BFD_RELOC_MMIX_GETA_3: 2623 case BFD_RELOC_MMIX_JMP_1: 2624 case BFD_RELOC_MMIX_JMP_2: 2625 case BFD_RELOC_MMIX_JMP_3: 2626 default: 2627 BAD_CASE (fixP->fx_r_type); 2628 break; 2629 } 2630 2631 if (fixP->fx_done) 2632 /* Make sure that for completed fixups we have the value around for 2633 use by e.g. mmix_frob_file. */ 2634 fixP->fx_offset = val; 2635 } 2636 2637 /* A bsearch function for looking up a value against offsets for GREG 2638 definitions. */ 2639 2640 static int 2641 cmp_greg_val_greg_symbol_fixes (p1, p2) 2642 const PTR p1; 2643 const PTR p2; 2644 { 2645 offsetT val1 = *(offsetT *) p1; 2646 offsetT val2 = ((struct mmix_symbol_greg_fixes *) p2)->offs; 2647 2648 if (val1 >= val2 && val1 < val2 + 255) 2649 return 0; 2650 2651 if (val1 > val2) 2652 return 1; 2653 2654 return -1; 2655 } 2656 2657 /* Generate a machine-dependent relocation. */ 2658 2659 arelent * 2660 tc_gen_reloc (section, fixP) 2661 asection *section ATTRIBUTE_UNUSED; 2662 fixS *fixP; 2663 { 2664 bfd_signed_vma val 2665 = fixP->fx_offset 2666 + (fixP->fx_addsy != NULL 2667 && !S_IS_WEAK (fixP->fx_addsy) 2668 && !S_IS_COMMON (fixP->fx_addsy) 2669 ? S_GET_VALUE (fixP->fx_addsy) : 0); 2670 arelent *relP; 2671 bfd_reloc_code_real_type code = BFD_RELOC_NONE; 2672 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal; 2673 symbolS *addsy = fixP->fx_addsy; 2674 asection *addsec = addsy == NULL ? NULL : S_GET_SEGMENT (addsy); 2675 asymbol *baddsy = addsy != NULL ? symbol_get_bfdsym (addsy) : NULL; 2676 bfd_vma addend 2677 = val - (baddsy == NULL || S_IS_COMMON (addsy) || S_IS_WEAK (addsy) 2678 ? 0 : bfd_asymbol_value (baddsy)); 2679 2680 /* A single " LOCAL expression" in the wrong section will not work when 2681 linking to MMO; relocations for zero-content sections are then 2682 ignored. Normally, relocations would modify section contents, and 2683 you'd never think or be able to do something like that. The 2684 relocation resulting from a LOCAL directive doesn't have an obvious 2685 and mandatory location. I can't figure out a way to do this better 2686 than just helping the user around this limitation here; hopefully the 2687 code using the local expression is around. Putting the LOCAL 2688 semantics in a relocation still seems right; a section didn't do. */ 2689 if (bfd_section_size (section->owner, section) == 0) 2690 as_bad_where 2691 (fixP->fx_file, fixP->fx_line, 2692 fixP->fx_r_type == BFD_RELOC_MMIX_LOCAL 2693 /* The BFD_RELOC_MMIX_LOCAL-specific message is supposed to be 2694 user-friendly, though a little bit non-substantial. */ 2695 ? _("directive LOCAL must be placed in code or data") 2696 : _("internal confusion: relocation in a section without contents")); 2697 2698 /* FIXME: Range tests for all these. */ 2699 switch (fixP->fx_r_type) 2700 { 2701 case BFD_RELOC_64: 2702 case BFD_RELOC_32: 2703 case BFD_RELOC_24: 2704 case BFD_RELOC_16: 2705 case BFD_RELOC_8: 2706 code = fixP->fx_r_type; 2707 2708 if (addsy == NULL || bfd_is_abs_section (addsec)) 2709 { 2710 /* Resolve this reloc now, as md_apply_fix3 would have done (not 2711 called if -linkrelax). There is no point in keeping a reloc 2712 to an absolute symbol. No reloc that is subject to 2713 relaxation must be to an absolute symbol; difference 2714 involving symbols in a specific section must be signalled as 2715 an error if the relaxing cannot be expressed; having a reloc 2716 to the resolved (now absolute) value does not help. */ 2717 md_number_to_chars (buf, val, fixP->fx_size); 2718 return NULL; 2719 } 2720 break; 2721 2722 case BFD_RELOC_64_PCREL: 2723 case BFD_RELOC_32_PCREL: 2724 case BFD_RELOC_24_PCREL: 2725 case BFD_RELOC_16_PCREL: 2726 case BFD_RELOC_8_PCREL: 2727 case BFD_RELOC_MMIX_LOCAL: 2728 case BFD_RELOC_VTABLE_INHERIT: 2729 case BFD_RELOC_VTABLE_ENTRY: 2730 case BFD_RELOC_MMIX_GETA: 2731 case BFD_RELOC_MMIX_GETA_1: 2732 case BFD_RELOC_MMIX_GETA_2: 2733 case BFD_RELOC_MMIX_GETA_3: 2734 case BFD_RELOC_MMIX_CBRANCH: 2735 case BFD_RELOC_MMIX_CBRANCH_J: 2736 case BFD_RELOC_MMIX_CBRANCH_1: 2737 case BFD_RELOC_MMIX_CBRANCH_2: 2738 case BFD_RELOC_MMIX_CBRANCH_3: 2739 case BFD_RELOC_MMIX_PUSHJ: 2740 case BFD_RELOC_MMIX_PUSHJ_1: 2741 case BFD_RELOC_MMIX_PUSHJ_2: 2742 case BFD_RELOC_MMIX_PUSHJ_3: 2743 case BFD_RELOC_MMIX_PUSHJ_STUBBABLE: 2744 case BFD_RELOC_MMIX_JMP: 2745 case BFD_RELOC_MMIX_JMP_1: 2746 case BFD_RELOC_MMIX_JMP_2: 2747 case BFD_RELOC_MMIX_JMP_3: 2748 case BFD_RELOC_MMIX_ADDR19: 2749 case BFD_RELOC_MMIX_ADDR27: 2750 code = fixP->fx_r_type; 2751 break; 2752 2753 case BFD_RELOC_MMIX_REG_OR_BYTE: 2754 /* If we have this kind of relocation to an unknown symbol or to the 2755 register contents section (that is, to a register), then we can't 2756 resolve the relocation here. */ 2757 if (addsy != NULL 2758 && (bfd_is_und_section (addsec) 2759 || strcmp (bfd_get_section_name (addsec->owner, addsec), 2760 MMIX_REG_CONTENTS_SECTION_NAME) == 0)) 2761 { 2762 code = fixP->fx_r_type; 2763 break; 2764 } 2765 2766 /* If the relocation is not to the register section or to the 2767 absolute section (a numeric value), then we have an error. */ 2768 if (addsy != NULL 2769 && (S_GET_SEGMENT (addsy) != real_reg_section 2770 || val > 255 2771 || val < 0) 2772 && ! bfd_is_abs_section (addsec)) 2773 goto badop; 2774 2775 /* Set the "immediate" bit of the insn if this relocation is to Z 2776 field when the value is a numeric value, i.e. not a register. */ 2777 if ((fixP->fx_where & 3) == 3 2778 && (addsy == NULL || bfd_is_abs_section (addsec))) 2779 buf[-3] |= IMM_OFFSET_BIT; 2780 2781 buf[0] = val; 2782 return NULL; 2783 2784 case BFD_RELOC_MMIX_BASE_PLUS_OFFSET: 2785 if (addsy != NULL 2786 && strcmp (bfd_get_section_name (addsec->owner, addsec), 2787 MMIX_REG_CONTENTS_SECTION_NAME) == 0) 2788 { 2789 /* This changed into a register; the relocation is for the 2790 register-contents section. The constant part remains zero. */ 2791 code = BFD_RELOC_MMIX_REG; 2792 break; 2793 } 2794 2795 /* If we've found out that this was indeed a register, then replace 2796 with the register number. The constant part is already zero. 2797 2798 If we encounter any other defined symbol, then we must find a 2799 suitable register and emit a reloc. */ 2800 if (addsy == NULL || addsec != real_reg_section) 2801 { 2802 struct mmix_symbol_gregs *gregs; 2803 struct mmix_symbol_greg_fixes *fix; 2804 2805 if (S_IS_DEFINED (addsy) 2806 && !bfd_is_com_section (addsec) 2807 && !S_IS_WEAK (addsy)) 2808 { 2809 if (! symbol_section_p (addsy) && ! bfd_is_abs_section (addsec)) 2810 as_fatal (_("internal: BFD_RELOC_MMIX_BASE_PLUS_OFFSET not resolved to section")); 2811 2812 /* If this is an absolute symbol sufficiently near 2813 lowest_data_loc, then we canonicalize on the data 2814 section. Note that val is signed here; we may subtract 2815 lowest_data_loc which is unsigned. Careful with those 2816 comparisons. */ 2817 if (lowest_data_loc != (bfd_vma) -1 2818 && (bfd_vma) val + 256 > lowest_data_loc 2819 && bfd_is_abs_section (addsec)) 2820 { 2821 val -= (offsetT) lowest_data_loc; 2822 addsy = section_symbol (data_section); 2823 } 2824 /* Likewise text section. */ 2825 else if (lowest_text_loc != (bfd_vma) -1 2826 && (bfd_vma) val + 256 > lowest_text_loc 2827 && bfd_is_abs_section (addsec)) 2828 { 2829 val -= (offsetT) lowest_text_loc; 2830 addsy = section_symbol (text_section); 2831 } 2832 } 2833 2834 gregs = *symbol_get_tc (addsy); 2835 2836 /* If that symbol does not have any associated GREG definitions, 2837 we can't do anything. */ 2838 if (gregs == NULL 2839 || (fix = bsearch (&val, gregs->greg_fixes, gregs->n_gregs, 2840 sizeof (gregs->greg_fixes[0]), 2841 cmp_greg_val_greg_symbol_fixes)) == NULL 2842 /* The register must not point *after* the address we want. */ 2843 || fix->offs > val 2844 /* Neither must the register point more than 255 bytes 2845 before the address we want. */ 2846 || fix->offs + 255 < val) 2847 { 2848 /* We can either let the linker allocate GREGs 2849 automatically, or emit an error. */ 2850 if (allocate_undefined_gregs_in_linker) 2851 { 2852 /* The values in baddsy and addend are right. */ 2853 code = fixP->fx_r_type; 2854 break; 2855 } 2856 else 2857 as_bad_where (fixP->fx_file, fixP->fx_line, 2858 _("no suitable GREG definition for operands")); 2859 return NULL; 2860 } 2861 else 2862 { 2863 /* Transform the base-plus-offset reloc for the actual area 2864 to a reloc for the register with the address of the area. 2865 Put addend for register in Z operand. */ 2866 buf[1] = val - fix->offs; 2867 code = BFD_RELOC_MMIX_REG; 2868 baddsy 2869 = (bfd_get_section_by_name (stdoutput, 2870 MMIX_REG_CONTENTS_SECTION_NAME) 2871 ->symbol); 2872 2873 addend = fix->fix->fx_frag->fr_address + fix->fix->fx_where; 2874 } 2875 } 2876 else if (S_GET_VALUE (addsy) > 255) 2877 as_bad_where (fixP->fx_file, fixP->fx_line, 2878 _("invalid operands")); 2879 else 2880 { 2881 *buf = val; 2882 return NULL; 2883 } 2884 break; 2885 2886 case BFD_RELOC_MMIX_REG: 2887 if (addsy != NULL 2888 && (bfd_is_und_section (addsec) 2889 || strcmp (bfd_get_section_name (addsec->owner, addsec), 2890 MMIX_REG_CONTENTS_SECTION_NAME) == 0)) 2891 { 2892 code = fixP->fx_r_type; 2893 break; 2894 } 2895 2896 if (addsy != NULL 2897 && (addsec != real_reg_section 2898 || val > 255 2899 || val < 0) 2900 && ! bfd_is_und_section (addsec)) 2901 /* Drop through to error message. */ 2902 ; 2903 else 2904 { 2905 buf[0] = val; 2906 return NULL; 2907 } 2908 /* FALLTHROUGH. */ 2909 2910 /* The others are supposed to be handled by md_apply_fix3. 2911 FIXME: ... which isn't called when -linkrelax. Move over 2912 md_apply_fix3 code here for everything reasonable. */ 2913 badop: 2914 default: 2915 as_bad_where 2916 (fixP->fx_file, fixP->fx_line, 2917 _("operands were not reducible at assembly-time")); 2918 2919 /* Unmark this symbol as used in a reloc, so we don't bump into a BFD 2920 assert when trying to output reg_section. FIXME: A gas bug. */ 2921 fixP->fx_addsy = NULL; 2922 return NULL; 2923 } 2924 2925 relP = (arelent *) xmalloc (sizeof (arelent)); 2926 assert (relP != 0); 2927 relP->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); 2928 *relP->sym_ptr_ptr = baddsy; 2929 relP->address = fixP->fx_frag->fr_address + fixP->fx_where; 2930 2931 relP->addend = addend; 2932 2933 /* If this had been a.out, we would have had a kludge for weak symbols 2934 here. */ 2935 2936 relP->howto = bfd_reloc_type_lookup (stdoutput, code); 2937 if (! relP->howto) 2938 { 2939 const char *name; 2940 2941 name = S_GET_NAME (addsy); 2942 if (name == NULL) 2943 name = _("<unknown>"); 2944 as_fatal (_("cannot generate relocation type for symbol %s, code %s"), 2945 name, bfd_get_reloc_code_name (code)); 2946 } 2947 2948 return relP; 2949 } 2950 2951 /* Do some reformatting of a line. FIXME: We could transform a mmixal 2952 line into traditional (GNU?) format, unless #NO_APP, and get rid of all 2953 ugly labels_without_colons etc. */ 2954 2955 void 2956 mmix_handle_mmixal () 2957 { 2958 char *s0 = input_line_pointer; 2959 char *s; 2960 char *label = NULL; 2961 char c; 2962 2963 if (pending_label != NULL) 2964 as_fatal (_("internal: unhandled label %s"), pending_label); 2965 2966 if (mmix_gnu_syntax) 2967 return; 2968 2969 /* If the first character is a '.', then it's a pseudodirective, not a 2970 label. Make GAS not handle label-without-colon on this line. We 2971 also don't do mmixal-specific stuff on this line. */ 2972 if (input_line_pointer[0] == '.') 2973 { 2974 label_without_colon_this_line = 0; 2975 return; 2976 } 2977 2978 /* Don't handle empty lines here. */ 2979 while (1) 2980 { 2981 if (*s0 == 0 || is_end_of_line[(unsigned int) *s0]) 2982 return; 2983 2984 if (! ISSPACE (*s0)) 2985 break; 2986 2987 s0++; 2988 } 2989 2990 /* If we're on a line with a label, check if it's a mmixal fb-label. 2991 Save an indicator and skip the label; it must be set only after all 2992 fb-labels of expressions are evaluated. */ 2993 if (ISDIGIT (input_line_pointer[0]) 2994 && input_line_pointer[1] == 'H' 2995 && ISSPACE (input_line_pointer[2])) 2996 { 2997 char *s; 2998 current_fb_label = input_line_pointer[0] - '0'; 2999 3000 /* We have to skip the label, but also preserve the newlineness of 3001 the previous character, since the caller checks that. It's a 3002 mess we blame on the caller. */ 3003 input_line_pointer[1] = input_line_pointer[-1]; 3004 input_line_pointer += 2; 3005 3006 s = input_line_pointer; 3007 while (*s && ISSPACE (*s) && ! is_end_of_line[(unsigned int) *s]) 3008 s++; 3009 3010 /* For errors emitted here, the book-keeping is off by one; the 3011 caller is about to bump the counters. Adjust the error messages. */ 3012 if (is_end_of_line[(unsigned int) *s]) 3013 { 3014 char *name; 3015 unsigned int line; 3016 as_where (&name, &line); 3017 as_bad_where (name, line + 1, 3018 _("[0-9]H labels may not appear alone on a line")); 3019 current_fb_label = -1; 3020 } 3021 if (*s == '.') 3022 { 3023 char *name; 3024 unsigned int line; 3025 as_where (&name, &line); 3026 as_bad_where (name, line + 1, 3027 _("[0-9]H labels do not mix with dot-pseudos")); 3028 current_fb_label = -1; 3029 } 3030 } 3031 else 3032 { 3033 current_fb_label = -1; 3034 if (is_name_beginner (input_line_pointer[0])) 3035 label = input_line_pointer; 3036 } 3037 3038 s0 = input_line_pointer; 3039 /* Skip over label. */ 3040 while (*s0 && is_part_of_name (*s0)) 3041 s0++; 3042 3043 /* Remove trailing ":" off labels, as they'd otherwise be considered 3044 part of the name. But don't do it for local labels. */ 3045 if (s0 != input_line_pointer && s0[-1] == ':' 3046 && (s0 - 2 != input_line_pointer 3047 || ! ISDIGIT (s0[-2]))) 3048 s0[-1] = ' '; 3049 else if (label != NULL) 3050 { 3051 /* For labels that don't end in ":", we save it so we can later give 3052 it the same alignment and address as the associated instruction. */ 3053 3054 /* Make room for the label including the ending nul. */ 3055 int len_0 = s0 - label + 1; 3056 3057 /* Save this label on the MMIX symbol obstack. Saving it on an 3058 obstack is needless for "IS"-pseudos, but it's harmless and we 3059 avoid a little code-cluttering. */ 3060 obstack_grow (&mmix_sym_obstack, label, len_0); 3061 pending_label = obstack_finish (&mmix_sym_obstack); 3062 pending_label[len_0 - 1] = 0; 3063 } 3064 3065 while (*s0 && ISSPACE (*s0) && ! is_end_of_line[(unsigned int) *s0]) 3066 s0++; 3067 3068 if (pending_label != NULL && is_end_of_line[(unsigned int) *s0]) 3069 /* Whoops, this was actually a lone label on a line. Like :-ended 3070 labels, we don't attach such labels to the next instruction or 3071 pseudo. */ 3072 pending_label = NULL; 3073 3074 /* Find local labels of operands. Look for "[0-9][FB]" where the 3075 characters before and after are not part of words. Break if a single 3076 or double quote is seen anywhere. It means we can't have local 3077 labels as part of list with mixed quoted and unquoted members for 3078 mmixal compatibility but we can't have it all. For the moment. 3079 Replace the '<N>B' or '<N>F' with MAGIC_FB_BACKWARD_CHAR<N> and 3080 MAGIC_FB_FORWARD_CHAR<N> respectively. */ 3081 3082 /* First make sure we don't have any of the magic characters on the line 3083 appearing as input. */ 3084 s = s0; 3085 while (*s) 3086 { 3087 c = *s++; 3088 if (is_end_of_line[(unsigned int) c]) 3089 break; 3090 if (c == MAGIC_FB_BACKWARD_CHAR || c == MAGIC_FB_FORWARD_CHAR) 3091 as_bad (_("invalid characters in input")); 3092 } 3093 3094 /* Scan again, this time looking for ';' after operands. */ 3095 s = s0; 3096 3097 /* Skip the insn. */ 3098 while (*s 3099 && ! ISSPACE (*s) 3100 && *s != ';' 3101 && ! is_end_of_line[(unsigned int) *s]) 3102 s++; 3103 3104 /* Skip the spaces after the insn. */ 3105 while (*s 3106 && ISSPACE (*s) 3107 && *s != ';' 3108 && ! is_end_of_line[(unsigned int) *s]) 3109 s++; 3110 3111 /* Skip the operands. While doing this, replace [0-9][BF] with 3112 (MAGIC_FB_BACKWARD_CHAR|MAGIC_FB_FORWARD_CHAR)[0-9]. */ 3113 while ((c = *s) != 0 3114 && ! ISSPACE (c) 3115 && c != ';' 3116 && ! is_end_of_line[(unsigned int) c]) 3117 { 3118 if (c == '"') 3119 { 3120 s++; 3121 3122 /* FIXME: Test-case for semi-colon in string. */ 3123 while (*s 3124 && *s != '"' 3125 && (! is_end_of_line[(unsigned int) *s] || *s == ';')) 3126 s++; 3127 3128 if (*s == '"') 3129 s++; 3130 } 3131 else if (ISDIGIT (c)) 3132 { 3133 if ((s[1] != 'B' && s[1] != 'F') 3134 || is_part_of_name (s[-1]) 3135 || is_part_of_name (s[2])) 3136 s++; 3137 else 3138 { 3139 s[0] = (s[1] == 'B' 3140 ? MAGIC_FB_BACKWARD_CHAR : MAGIC_FB_FORWARD_CHAR); 3141 s[1] = c; 3142 } 3143 } 3144 else 3145 s++; 3146 } 3147 3148 /* Skip any spaces after the operands. */ 3149 while (*s 3150 && ISSPACE (*s) 3151 && *s != ';' 3152 && !is_end_of_line[(unsigned int) *s]) 3153 s++; 3154 3155 /* If we're now looking at a semi-colon, then it's an end-of-line 3156 delimiter. */ 3157 mmix_next_semicolon_is_eoln = (*s == ';'); 3158 3159 /* Make IS into an EQU by replacing it with "= ". Only match upper-case 3160 though; let lower-case be a syntax error. */ 3161 s = s0; 3162 if (s[0] == 'I' && s[1] == 'S' && ISSPACE (s[2])) 3163 { 3164 *s = '='; 3165 s[1] = ' '; 3166 3167 /* Since labels can start without ":", we have to handle "X IS 42" 3168 in full here, or "X" will be parsed as a label to be set at ".". */ 3169 input_line_pointer = s; 3170 3171 /* Right after this function ends, line numbers will be bumped if 3172 input_line_pointer[-1] = '\n'. We want accurate line numbers for 3173 the equals call, so we bump them before the call, and make sure 3174 they aren't bumped afterwards. */ 3175 bump_line_counters (); 3176 3177 /* A fb-label is valid as an IS-label. */ 3178 if (current_fb_label >= 0) 3179 { 3180 char *fb_name; 3181 3182 /* We need to save this name on our symbol obstack, since the 3183 string we got in fb_label_name is volatile and will change 3184 with every call to fb_label_name, like those resulting from 3185 parsing the IS-operand. */ 3186 fb_name = fb_label_name (current_fb_label, 1); 3187 obstack_grow (&mmix_sym_obstack, fb_name, strlen (fb_name) + 1); 3188 equals (obstack_finish (&mmix_sym_obstack), 0); 3189 fb_label_instance_inc (current_fb_label); 3190 current_fb_label = -1; 3191 } 3192 else 3193 { 3194 if (pending_label == NULL) 3195 as_bad (_("empty label field for IS")); 3196 else 3197 equals (pending_label, 0); 3198 pending_label = NULL; 3199 } 3200 3201 /* For mmixal, we can have comments without a comment-start 3202 character. */ 3203 mmix_handle_rest_of_empty_line (); 3204 input_line_pointer--; 3205 3206 input_line_pointer[-1] = ' '; 3207 } 3208 else if (s[0] == 'G' 3209 && s[1] == 'R' 3210 && strncmp (s, "GREG", 4) == 0 3211 && (ISSPACE (s[4]) || is_end_of_line[(unsigned char) s[4]])) 3212 { 3213 input_line_pointer = s + 4; 3214 3215 /* Right after this function ends, line numbers will be bumped if 3216 input_line_pointer[-1] = '\n'. We want accurate line numbers for 3217 the s_greg call, so we bump them before the call, and make sure 3218 they aren't bumped afterwards. */ 3219 bump_line_counters (); 3220 3221 /* A fb-label is valid as a GREG-label. */ 3222 if (current_fb_label >= 0) 3223 { 3224 char *fb_name; 3225 3226 /* We need to save this name on our symbol obstack, since the 3227 string we got in fb_label_name is volatile and will change 3228 with every call to fb_label_name, like those resulting from 3229 parsing the IS-operand. */ 3230 fb_name = fb_label_name (current_fb_label, 1); 3231 3232 /* Make sure we save the canonical name and don't get bitten by 3233 prefixes. */ 3234 obstack_1grow (&mmix_sym_obstack, ':'); 3235 obstack_grow (&mmix_sym_obstack, fb_name, strlen (fb_name) + 1); 3236 mmix_greg_internal (obstack_finish (&mmix_sym_obstack)); 3237 fb_label_instance_inc (current_fb_label); 3238 current_fb_label = -1; 3239 } 3240 else 3241 mmix_greg_internal (pending_label); 3242 3243 /* Back up before the end-of-line marker that was skipped in 3244 mmix_greg_internal. */ 3245 input_line_pointer--; 3246 input_line_pointer[-1] = ' '; 3247 3248 pending_label = NULL; 3249 } 3250 else if (pending_label != NULL) 3251 { 3252 input_line_pointer += strlen (pending_label); 3253 3254 /* See comment above about getting line numbers bumped. */ 3255 input_line_pointer[-1] = '\n'; 3256 } 3257 } 3258 3259 /* Give the value of an fb-label rewritten as in mmix_handle_mmixal, when 3260 parsing an expression. 3261 3262 On valid calls, input_line_pointer points at a MAGIC_FB_BACKWARD_CHAR 3263 or MAGIC_FB_BACKWARD_CHAR, followed by an ascii digit for the label. 3264 We fill in the label as an expression. */ 3265 3266 void 3267 mmix_fb_label (expP) 3268 expressionS *expP; 3269 { 3270 symbolS *sym; 3271 char *fb_internal_name; 3272 3273 /* This doesn't happen when not using mmixal syntax. */ 3274 if (mmix_gnu_syntax 3275 || (input_line_pointer[0] != MAGIC_FB_BACKWARD_CHAR 3276 && input_line_pointer[0] != MAGIC_FB_FORWARD_CHAR)) 3277 return; 3278 3279 /* The current backward reference has augmentation 0. A forward 3280 reference has augmentation 1, unless it's the same as a fb-label on 3281 _this_ line, in which case we add one more so we don't refer to it. 3282 This is the semantics of mmixal; it differs to that of common 3283 fb-labels which refer to a here-label on the current line as a 3284 backward reference. */ 3285 fb_internal_name 3286 = fb_label_name (input_line_pointer[1] - '0', 3287 (input_line_pointer[0] == MAGIC_FB_FORWARD_CHAR ? 1 : 0) 3288 + ((input_line_pointer[1] - '0' == current_fb_label 3289 && input_line_pointer[0] == MAGIC_FB_FORWARD_CHAR) 3290 ? 1 : 0)); 3291 3292 input_line_pointer += 2; 3293 sym = symbol_find_or_make (fb_internal_name); 3294 3295 /* We don't have to clean up unrelated fields here; we just do what the 3296 expr machinery does, but *not* just what it does for [0-9][fb], since 3297 we need to treat those as ordinary symbols sometimes; see testcases 3298 err-byte2.s and fb-2.s. */ 3299 if (S_GET_SEGMENT (sym) == absolute_section) 3300 { 3301 expP->X_op = O_constant; 3302 expP->X_add_number = S_GET_VALUE (sym); 3303 } 3304 else 3305 { 3306 expP->X_op = O_symbol; 3307 expP->X_add_symbol = sym; 3308 expP->X_add_number = 0; 3309 } 3310 } 3311 3312 /* See whether we need to force a relocation into the output file. 3313 This is used to force out switch and PC relative relocations when 3314 relaxing. */ 3315 3316 int 3317 mmix_force_relocation (fixP) 3318 fixS *fixP; 3319 { 3320 if (fixP->fx_r_type == BFD_RELOC_MMIX_LOCAL 3321 || fixP->fx_r_type == BFD_RELOC_MMIX_BASE_PLUS_OFFSET) 3322 return 1; 3323 3324 if (linkrelax) 3325 return 1; 3326 3327 /* All our pcrel relocations are must-keep. Note that md_apply_fix3 is 3328 called *after* this, and will handle getting rid of the presumed 3329 reloc; a relocation isn't *forced* other than to be handled by 3330 md_apply_fix3 (or tc_gen_reloc if linkrelax). */ 3331 if (fixP->fx_pcrel) 3332 return 1; 3333 3334 return generic_force_reloc (fixP); 3335 } 3336 3337 /* The location from which a PC relative jump should be calculated, 3338 given a PC relative reloc. */ 3339 3340 long 3341 md_pcrel_from_section (fixP, sec) 3342 fixS * fixP; 3343 segT sec; 3344 { 3345 if (fixP->fx_addsy != (symbolS *) NULL 3346 && (! S_IS_DEFINED (fixP->fx_addsy) 3347 || S_GET_SEGMENT (fixP->fx_addsy) != sec)) 3348 { 3349 /* The symbol is undefined (or is defined but not in this section). 3350 Let the linker figure it out. */ 3351 return 0; 3352 } 3353 3354 return (fixP->fx_frag->fr_address + fixP->fx_where); 3355 } 3356 3357 /* Adjust the symbol table. We make reg_section relative to the real 3358 register section. */ 3359 3360 void 3361 mmix_adjust_symtab () 3362 { 3363 symbolS *sym; 3364 symbolS *regsec = section_symbol (reg_section); 3365 3366 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym)) 3367 if (S_GET_SEGMENT (sym) == reg_section) 3368 { 3369 if (sym == regsec) 3370 { 3371 if (S_IS_EXTERN (sym) || symbol_used_in_reloc_p (sym)) 3372 abort (); 3373 symbol_remove (sym, &symbol_rootP, &symbol_lastP); 3374 } 3375 else 3376 /* Change section to the *real* register section, so it gets 3377 proper treatment when writing it out. Only do this for 3378 global symbols. This also means we don't have to check for 3379 $0..$255. */ 3380 S_SET_SEGMENT (sym, real_reg_section); 3381 } 3382 } 3383 3384 /* This is the expansion of LABELS_WITHOUT_COLONS. 3385 We let md_start_line_hook tweak label_without_colon_this_line, and then 3386 this function returns the tweaked value, and sets it to 1 for the next 3387 line. FIXME: Very, very brittle. Not sure it works the way I 3388 thought at the time I first wrote this. */ 3389 3390 int 3391 mmix_label_without_colon_this_line () 3392 { 3393 int retval = label_without_colon_this_line; 3394 3395 if (! mmix_gnu_syntax) 3396 label_without_colon_this_line = 1; 3397 3398 return retval; 3399 } 3400 3401 /* This is the expansion of md_relax_frag. We go through the ordinary 3402 relax table function except when the frag is for a GREG. Then we have 3403 to check whether there's another GREG by the same value that we can 3404 join with. */ 3405 3406 long 3407 mmix_md_relax_frag (seg, fragP, stretch) 3408 segT seg; 3409 fragS *fragP; 3410 long stretch; 3411 { 3412 switch (fragP->fr_subtype) 3413 { 3414 /* Growth for this type has been handled by mmix_md_end and 3415 correctly estimated, so there's nothing more to do here. */ 3416 case STATE_GREG_DEF: 3417 return 0; 3418 3419 case ENCODE_RELAX (STATE_PUSHJ, STATE_ZERO): 3420 { 3421 /* We need to handle relaxation type ourselves, since relax_frag 3422 doesn't update fr_subtype if there's no size increase in the 3423 current section; when going from plain PUSHJ to a stub. This 3424 is otherwise functionally the same as relax_frag in write.c, 3425 simplified for this case. */ 3426 offsetT aim; 3427 addressT target; 3428 addressT address; 3429 symbolS *symbolP; 3430 target = fragP->fr_offset; 3431 address = fragP->fr_address; 3432 symbolP = fragP->fr_symbol; 3433 3434 if (symbolP) 3435 { 3436 fragS *sym_frag; 3437 3438 sym_frag = symbol_get_frag (symbolP); 3439 know (S_GET_SEGMENT (symbolP) != absolute_section 3440 || sym_frag == &zero_address_frag); 3441 target += S_GET_VALUE (symbolP); 3442 3443 /* If frag has yet to be reached on this pass, assume it will 3444 move by STRETCH just as we did. If this is not so, it will 3445 be because some frag between grows, and that will force 3446 another pass. */ 3447 3448 if (stretch != 0 3449 && sym_frag->relax_marker != fragP->relax_marker 3450 && S_GET_SEGMENT (symbolP) == seg) 3451 target += stretch; 3452 } 3453 3454 aim = target - address - fragP->fr_fix; 3455 if (aim >= PUSHJ_0B && aim <= PUSHJ_0F) 3456 { 3457 /* Target is reachable with a PUSHJ. */ 3458 segment_info_type *seginfo = seg_info (seg); 3459 3460 /* If we're at the end of a relaxation round, clear the stub 3461 counter as initialization for the next round. */ 3462 if (fragP == seginfo->tc_segment_info_data.last_stubfrag) 3463 seginfo->tc_segment_info_data.nstubs = 0; 3464 return 0; 3465 } 3466 3467 /* Not reachable. Try a stub. */ 3468 fragP->fr_subtype = ENCODE_RELAX (STATE_PUSHJSTUB, STATE_ZERO); 3469 } 3470 /* FALLTHROUGH. */ 3471 3472 /* See if this PUSHJ is redirectable to a stub. */ 3473 case ENCODE_RELAX (STATE_PUSHJSTUB, STATE_ZERO): 3474 { 3475 segment_info_type *seginfo = seg_info (seg); 3476 fragS *lastfrag = seginfo->frchainP->frch_last; 3477 relax_substateT prev_type = fragP->fr_subtype; 3478 3479 /* The last frag is always an empty frag, so it suffices to look 3480 at its address to know the ending address of this section. */ 3481 know (lastfrag->fr_type == rs_fill 3482 && lastfrag->fr_fix == 0 3483 && lastfrag->fr_var == 0); 3484 3485 /* For this PUSHJ to be relaxable into a call to a stub, the 3486 distance must be no longer than 256k bytes from the PUSHJ to 3487 the end of the section plus the maximum size of stubs so far. */ 3488 if ((lastfrag->fr_address 3489 + stretch 3490 + PUSHJ_MAX_LEN * seginfo->tc_segment_info_data.nstubs) 3491 - (fragP->fr_address + fragP->fr_fix) 3492 > GETA_0F 3493 || !pushj_stubs) 3494 fragP->fr_subtype = mmix_relax_table[prev_type].rlx_more; 3495 else 3496 seginfo->tc_segment_info_data.nstubs++; 3497 3498 /* If we're at the end of a relaxation round, clear the stub 3499 counter as initialization for the next round. */ 3500 if (fragP == seginfo->tc_segment_info_data.last_stubfrag) 3501 seginfo->tc_segment_info_data.nstubs = 0; 3502 3503 return 3504 (mmix_relax_table[fragP->fr_subtype].rlx_length 3505 - mmix_relax_table[prev_type].rlx_length); 3506 } 3507 3508 case ENCODE_RELAX (STATE_PUSHJ, STATE_MAX): 3509 { 3510 segment_info_type *seginfo = seg_info (seg); 3511 3512 /* Need to cover all STATE_PUSHJ states to act on the last stub 3513 frag (the end of this relax round; initialization for the 3514 next). */ 3515 if (fragP == seginfo->tc_segment_info_data.last_stubfrag) 3516 seginfo->tc_segment_info_data.nstubs = 0; 3517 3518 return 0; 3519 } 3520 3521 default: 3522 return relax_frag (seg, fragP, stretch); 3523 3524 case STATE_GREG_UNDF: 3525 BAD_CASE (fragP->fr_subtype); 3526 } 3527 3528 as_fatal (_("internal: unexpected relax type %d:%d"), 3529 fragP->fr_type, fragP->fr_subtype); 3530 return 0; 3531 } 3532 3533 /* Various things we punt until all input is seen. */ 3534 3535 void 3536 mmix_md_end () 3537 { 3538 fragS *fragP; 3539 symbolS *mainsym; 3540 int i; 3541 3542 /* The first frag of GREG:s going into the register contents section. */ 3543 fragS *mmix_reg_contents_frags = NULL; 3544 3545 /* Reset prefix. All labels reachable at this point must be 3546 canonicalized. */ 3547 mmix_current_prefix = NULL; 3548 3549 if (doing_bspec) 3550 as_bad_where (bspec_file, bspec_line, _("BSPEC without ESPEC.")); 3551 3552 /* Emit the low LOC setting of .text. */ 3553 if (text_has_contents && lowest_text_loc != (bfd_vma) -1) 3554 { 3555 symbolS *symbolP; 3556 char locsymbol[sizeof (":") - 1 3557 + sizeof (MMIX_LOC_SECTION_START_SYMBOL_PREFIX) - 1 3558 + sizeof (".text")]; 3559 3560 /* An exercise in non-ISO-C-ness, this one. */ 3561 sprintf (locsymbol, ":%s%s", MMIX_LOC_SECTION_START_SYMBOL_PREFIX, 3562 ".text"); 3563 symbolP 3564 = symbol_new (locsymbol, absolute_section, lowest_text_loc, 3565 &zero_address_frag); 3566 S_SET_EXTERNAL (symbolP); 3567 } 3568 3569 /* Ditto .data. */ 3570 if (data_has_contents && lowest_data_loc != (bfd_vma) -1) 3571 { 3572 symbolS *symbolP; 3573 char locsymbol[sizeof (":") - 1 3574 + sizeof (MMIX_LOC_SECTION_START_SYMBOL_PREFIX) - 1 3575 + sizeof (".data")]; 3576 3577 sprintf (locsymbol, ":%s%s", MMIX_LOC_SECTION_START_SYMBOL_PREFIX, 3578 ".data"); 3579 symbolP 3580 = symbol_new (locsymbol, absolute_section, lowest_data_loc, 3581 &zero_address_frag); 3582 S_SET_EXTERNAL (symbolP); 3583 } 3584 3585 /* Unless GNU syntax mode, set "Main" to be a function, so the 3586 disassembler doesn't get confused when we write truly 3587 mmixal-compatible code (and don't use .type). Similarly set it 3588 global (regardless of -globalize-symbols), so the linker sees it as 3589 the start symbol in ELF mode. */ 3590 mainsym = symbol_find (MMIX_START_SYMBOL_NAME); 3591 if (mainsym != NULL && ! mmix_gnu_syntax) 3592 { 3593 symbol_get_bfdsym (mainsym)->flags |= BSF_FUNCTION; 3594 S_SET_EXTERNAL (mainsym); 3595 } 3596 3597 if (n_of_raw_gregs != 0) 3598 { 3599 /* Emit GREGs. They are collected in order of appearance, but must 3600 be emitted in opposite order to both have section address regno*8 3601 and the same allocation order (within a file) as mmixal. */ 3602 segT this_segment = now_seg; 3603 subsegT this_subsegment = now_subseg; 3604 asection *regsec 3605 = bfd_make_section_old_way (stdoutput, 3606 MMIX_REG_CONTENTS_SECTION_NAME); 3607 subseg_set (regsec, 0); 3608 3609 /* Finally emit the initialization-value. Emit a variable frag, which 3610 we'll fix in md_estimate_size_before_relax. We set the initializer 3611 for the tc_frag_data field to NULL, so we can use that field for 3612 relaxation purposes. */ 3613 mmix_opcode_frag = NULL; 3614 3615 frag_grow (0); 3616 mmix_reg_contents_frags = frag_now; 3617 3618 for (i = n_of_raw_gregs - 1; i >= 0; i--) 3619 { 3620 if (mmix_raw_gregs[i].label != NULL) 3621 /* There's a symbol. Let it refer to this location in the 3622 register contents section. The symbol must be globalized 3623 separately. */ 3624 colon (mmix_raw_gregs[i].label); 3625 3626 frag_var (rs_machine_dependent, 8, 0, STATE_GREG_UNDF, 3627 make_expr_symbol (&mmix_raw_gregs[i].exp), 0, NULL); 3628 } 3629 3630 subseg_set (this_segment, this_subsegment); 3631 } 3632 3633 /* Iterate over frags resulting from GREGs and move those that evidently 3634 have the same value together and point one to another. 3635 3636 This works in time O(N^2) but since the upper bound for non-error use 3637 is 223, it's best to keep this simpler algorithm. */ 3638 for (fragP = mmix_reg_contents_frags; fragP != NULL; fragP = fragP->fr_next) 3639 { 3640 fragS **fpp; 3641 fragS *fp = NULL; 3642 fragS *osymfrag; 3643 offsetT osymval; 3644 expressionS *oexpP; 3645 symbolS *symbolP = fragP->fr_symbol; 3646 3647 if (fragP->fr_type != rs_machine_dependent 3648 || fragP->fr_subtype != STATE_GREG_UNDF) 3649 continue; 3650 3651 /* Whatever the outcome, we will have this GREG judged merged or 3652 non-merged. Since the tc_frag_data is NULL at this point, we 3653 default to non-merged. */ 3654 fragP->fr_subtype = STATE_GREG_DEF; 3655 3656 /* If we're not supposed to merge GREG definitions, then just don't 3657 look for equivalents. */ 3658 if (! merge_gregs) 3659 continue; 3660 3661 osymval = (offsetT) S_GET_VALUE (symbolP); 3662 osymfrag = symbol_get_frag (symbolP); 3663 3664 /* If the symbol isn't defined, we can't say that another symbol 3665 equals this frag, then. FIXME: We can look at the "deepest" 3666 defined name; if a = c and b = c then obviously a == b. */ 3667 if (! S_IS_DEFINED (symbolP)) 3668 continue; 3669 3670 oexpP = symbol_get_value_expression (fragP->fr_symbol); 3671 3672 /* If the initialization value is zero, then we must not merge them. */ 3673 if (oexpP->X_op == O_constant && osymval == 0) 3674 continue; 3675 3676 /* Iterate through the frags downward this one. If we find one that 3677 has the same non-zero value, move it to after this one and point 3678 to it as the equivalent. */ 3679 for (fpp = &fragP->fr_next; *fpp != NULL; fpp = &fpp[0]->fr_next) 3680 { 3681 fp = *fpp; 3682 3683 if (fp->fr_type != rs_machine_dependent 3684 || fp->fr_subtype != STATE_GREG_UNDF) 3685 continue; 3686 3687 /* Calling S_GET_VALUE may simplify the symbol, changing from 3688 expr_section etc. so call it first. */ 3689 if ((offsetT) S_GET_VALUE (fp->fr_symbol) == osymval 3690 && symbol_get_frag (fp->fr_symbol) == osymfrag) 3691 { 3692 /* Move the frag links so the one we found equivalent comes 3693 after the current one, carefully considering that 3694 sometimes fpp == &fragP->fr_next and the moves must be a 3695 NOP then. */ 3696 *fpp = fp->fr_next; 3697 fp->fr_next = fragP->fr_next; 3698 fragP->fr_next = fp; 3699 break; 3700 } 3701 } 3702 3703 if (*fpp != NULL) 3704 fragP->tc_frag_data = fp; 3705 } 3706 } 3707 3708 /* qsort function for mmix_symbol_gregs. */ 3709 3710 static int 3711 cmp_greg_symbol_fixes (parg, qarg) 3712 const PTR parg; 3713 const PTR qarg; 3714 { 3715 const struct mmix_symbol_greg_fixes *p 3716 = (const struct mmix_symbol_greg_fixes *) parg; 3717 const struct mmix_symbol_greg_fixes *q 3718 = (const struct mmix_symbol_greg_fixes *) qarg; 3719 3720 return p->offs > q->offs ? 1 : p->offs < q->offs ? -1 : 0; 3721 } 3722 3723 /* Collect GREG definitions from mmix_gregs and hang them as lists sorted 3724 on increasing offsets onto each section symbol or undefined symbol. 3725 3726 Also, remove the register convenience section so it doesn't get output 3727 as an ELF section. */ 3728 3729 void 3730 mmix_frob_file () 3731 { 3732 int i; 3733 struct mmix_symbol_gregs *all_greg_symbols[MAX_GREGS]; 3734 int n_greg_symbols = 0; 3735 3736 /* Collect all greg fixups and decorate each corresponding symbol with 3737 the greg fixups for it. */ 3738 for (i = 0; i < n_of_cooked_gregs; i++) 3739 { 3740 offsetT offs; 3741 symbolS *sym; 3742 struct mmix_symbol_gregs *gregs; 3743 fixS *fixP; 3744 3745 fixP = mmix_gregs[i]; 3746 know (fixP->fx_r_type == BFD_RELOC_64); 3747 3748 /* This case isn't doable in general anyway, methinks. */ 3749 if (fixP->fx_subsy != NULL) 3750 { 3751 as_bad_where (fixP->fx_file, fixP->fx_line, 3752 _("GREG expression too complicated")); 3753 continue; 3754 } 3755 3756 sym = fixP->fx_addsy; 3757 offs = (offsetT) fixP->fx_offset; 3758 3759 /* If the symbol is defined, then it must be resolved to a section 3760 symbol at this time, or else we don't know how to handle it. */ 3761 if (S_IS_DEFINED (sym) 3762 && !bfd_is_com_section (S_GET_SEGMENT (sym)) 3763 && !S_IS_WEAK (sym)) 3764 { 3765 if (! symbol_section_p (sym) 3766 && ! bfd_is_abs_section (S_GET_SEGMENT (sym))) 3767 as_fatal (_("internal: GREG expression not resolved to section")); 3768 3769 offs += S_GET_VALUE (sym); 3770 } 3771 3772 /* If this is an absolute symbol sufficiently near lowest_data_loc, 3773 then we canonicalize on the data section. Note that offs is 3774 signed here; we may subtract lowest_data_loc which is unsigned. 3775 Careful with those comparisons. */ 3776 if (lowest_data_loc != (bfd_vma) -1 3777 && (bfd_vma) offs + 256 > lowest_data_loc 3778 && bfd_is_abs_section (S_GET_SEGMENT (sym))) 3779 { 3780 offs -= (offsetT) lowest_data_loc; 3781 sym = section_symbol (data_section); 3782 } 3783 /* Likewise text section. */ 3784 else if (lowest_text_loc != (bfd_vma) -1 3785 && (bfd_vma) offs + 256 > lowest_text_loc 3786 && bfd_is_abs_section (S_GET_SEGMENT (sym))) 3787 { 3788 offs -= (offsetT) lowest_text_loc; 3789 sym = section_symbol (text_section); 3790 } 3791 3792 gregs = *symbol_get_tc (sym); 3793 3794 if (gregs == NULL) 3795 { 3796 gregs = xmalloc (sizeof (*gregs)); 3797 gregs->n_gregs = 0; 3798 symbol_set_tc (sym, &gregs); 3799 all_greg_symbols[n_greg_symbols++] = gregs; 3800 } 3801 3802 gregs->greg_fixes[gregs->n_gregs].fix = fixP; 3803 gregs->greg_fixes[gregs->n_gregs++].offs = offs; 3804 } 3805 3806 /* For each symbol having a GREG definition, sort those definitions on 3807 offset. */ 3808 for (i = 0; i < n_greg_symbols; i++) 3809 qsort (all_greg_symbols[i]->greg_fixes, all_greg_symbols[i]->n_gregs, 3810 sizeof (all_greg_symbols[i]->greg_fixes[0]), cmp_greg_symbol_fixes); 3811 3812 if (real_reg_section != NULL) 3813 { 3814 asection **secpp; 3815 3816 /* FIXME: Pass error state gracefully. */ 3817 if (bfd_get_section_flags (stdoutput, real_reg_section) & SEC_HAS_CONTENTS) 3818 as_fatal (_("register section has contents\n")); 3819 3820 /* Really remove the section. */ 3821 for (secpp = &stdoutput->sections; 3822 *secpp != real_reg_section; 3823 secpp = &(*secpp)->next) 3824 ; 3825 bfd_section_list_remove (stdoutput, secpp); 3826 --stdoutput->section_count; 3827 } 3828 3829 } 3830 3831 /* Provide an expression for a built-in name provided when-used. 3832 Either a symbol that is a handler; living in 0x10*[1..8] and having 3833 name [DVWIOUZX]_Handler, or a mmixal built-in symbol. 3834 3835 If the name isn't a built-in name and parsed into *EXPP, return zero. */ 3836 3837 int 3838 mmix_parse_predefined_name (name, expP) 3839 char *name; 3840 expressionS *expP; 3841 { 3842 char *canon_name; 3843 char *handler_charp; 3844 const char handler_chars[] = "DVWIOUZX"; 3845 symbolS *symp; 3846 3847 if (! predefined_syms) 3848 return 0; 3849 3850 canon_name = tc_canonicalize_symbol_name (name); 3851 3852 if (canon_name[1] == '_' 3853 && strcmp (canon_name + 2, "Handler") == 0 3854 && (handler_charp = strchr (handler_chars, *canon_name)) != NULL) 3855 { 3856 /* If the symbol doesn't exist, provide one relative to the .text 3857 section. 3858 3859 FIXME: We should provide separate sections, mapped in the linker 3860 script. */ 3861 symp = symbol_find (name); 3862 if (symp == NULL) 3863 symp = symbol_new (name, text_section, 3864 0x10 * (handler_charp + 1 - handler_chars), 3865 &zero_address_frag); 3866 } 3867 else 3868 { 3869 /* These symbols appear when referenced; needed for 3870 mmixal-compatible programs. */ 3871 unsigned int i; 3872 3873 static const struct 3874 { 3875 const char *name; 3876 valueT val; 3877 } predefined_abs_syms[] = 3878 { 3879 {"Data_Segment", (valueT) 0x20 << 56}, 3880 {"Pool_Segment", (valueT) 0x40 << 56}, 3881 {"Stack_Segment", (valueT) 0x60 << 56}, 3882 {"StdIn", 0}, 3883 {"StdOut", 1}, 3884 {"StdErr", 2}, 3885 {"TextRead", 0}, 3886 {"TextWrite", 1}, 3887 {"BinaryRead", 2}, 3888 {"BinaryWrite", 3}, 3889 {"BinaryReadWrite", 4}, 3890 {"Halt", 0}, 3891 {"Fopen", 1}, 3892 {"Fclose", 2}, 3893 {"Fread", 3}, 3894 {"Fgets", 4}, 3895 {"Fgetws", 5}, 3896 {"Fwrite", 6}, 3897 {"Fputs", 7}, 3898 {"Fputws", 8}, 3899 {"Fseek", 9}, 3900 {"Ftell", 10}, 3901 {"D_BIT", 0x80}, 3902 {"V_BIT", 0x40}, 3903 {"W_BIT", 0x20}, 3904 {"I_BIT", 0x10}, 3905 {"O_BIT", 0x08}, 3906 {"U_BIT", 0x04}, 3907 {"Z_BIT", 0x02}, 3908 {"X_BIT", 0x01}, 3909 {"Inf", 0x7ff00000} 3910 }; 3911 3912 /* If it's already in the symbol table, we shouldn't do anything. */ 3913 symp = symbol_find (name); 3914 if (symp != NULL) 3915 return 0; 3916 3917 for (i = 0; 3918 i < sizeof (predefined_abs_syms) / sizeof (predefined_abs_syms[0]); 3919 i++) 3920 if (strcmp (canon_name, predefined_abs_syms[i].name) == 0) 3921 { 3922 symbol_table_insert (symbol_new (predefined_abs_syms[i].name, 3923 absolute_section, 3924 predefined_abs_syms[i].val, 3925 &zero_address_frag)); 3926 3927 /* Let gas find the symbol we just created, through its 3928 ordinary lookup. */ 3929 return 0; 3930 } 3931 3932 /* Not one of those symbols. Let gas handle it. */ 3933 return 0; 3934 } 3935 3936 expP->X_op = O_symbol; 3937 expP->X_add_number = 0; 3938 expP->X_add_symbol = symp; 3939 expP->X_op_symbol = NULL; 3940 3941 return 1; 3942 } 3943 3944 /* Just check that we don't have a BSPEC/ESPEC pair active when changing 3945 sections "normally", and get knowledge about alignment from the new 3946 section. */ 3947 3948 void 3949 mmix_md_elf_section_change_hook () 3950 { 3951 if (doing_bspec) 3952 as_bad (_("section change from within a BSPEC/ESPEC pair is not supported")); 3953 3954 last_alignment = bfd_get_section_alignment (now_seg->owner, now_seg); 3955 want_unaligned = 0; 3956 } 3957 3958 /* The LOC worker. This is like s_org, but we have to support changing 3959 section too. */ 3960 3961 static void 3962 s_loc (ignore) 3963 int ignore ATTRIBUTE_UNUSED; 3964 { 3965 segT section; 3966 expressionS exp; 3967 char *p; 3968 symbolS *sym; 3969 offsetT off; 3970 3971 /* Must not have a BSPEC in progress. */ 3972 if (doing_bspec) 3973 { 3974 as_bad (_("directive LOC from within a BSPEC/ESPEC pair is not supported")); 3975 return; 3976 } 3977 3978 section = expression (&exp); 3979 3980 if (exp.X_op == O_illegal 3981 || exp.X_op == O_absent 3982 || exp.X_op == O_big 3983 || section == undefined_section) 3984 { 3985 as_bad (_("invalid LOC expression")); 3986 return; 3987 } 3988 3989 if (section == absolute_section) 3990 { 3991 /* Translate a constant into a suitable section. */ 3992 3993 if (exp.X_add_number < ((offsetT) 0x20 << 56)) 3994 { 3995 /* Lower than Data_Segment - assume it's .text. */ 3996 section = text_section; 3997 3998 /* Save the lowest seen location, so we can pass on this 3999 information to the linker. We don't actually org to this 4000 location here, we just pass on information to the linker so 4001 it can put the code there for us. */ 4002 4003 /* If there was already a loc (that has to be set lower than 4004 this one), we org at (this - lower). There's an implicit 4005 "LOC 0" before any entered code. FIXME: handled by spurious 4006 settings of text_has_contents. */ 4007 if (exp.X_add_number < 0 4008 || exp.X_add_number < (offsetT) lowest_text_loc) 4009 { 4010 as_bad (_("LOC expression stepping backwards is not supported")); 4011 exp.X_op = O_absent; 4012 } 4013 else 4014 { 4015 if (text_has_contents && lowest_text_loc == (bfd_vma) -1) 4016 lowest_text_loc = 0; 4017 4018 if (lowest_text_loc == (bfd_vma) -1) 4019 { 4020 lowest_text_loc = exp.X_add_number; 4021 4022 /* We want only to change the section, not set an offset. */ 4023 exp.X_op = O_absent; 4024 } 4025 else 4026 exp.X_add_number -= lowest_text_loc; 4027 } 4028 } 4029 else 4030 { 4031 /* Do the same for the .data section. */ 4032 section = data_section; 4033 4034 if (exp.X_add_number < (offsetT) lowest_data_loc) 4035 { 4036 as_bad (_("LOC expression stepping backwards is not supported")); 4037 exp.X_op = O_absent; 4038 } 4039 else 4040 { 4041 if (data_has_contents && lowest_data_loc == (bfd_vma) -1) 4042 lowest_data_loc = (bfd_vma) 0x20 << 56; 4043 4044 if (lowest_data_loc == (bfd_vma) -1) 4045 { 4046 lowest_data_loc = exp.X_add_number; 4047 4048 /* We want only to change the section, not set an offset. */ 4049 exp.X_op = O_absent; 4050 } 4051 else 4052 exp.X_add_number -= lowest_data_loc; 4053 } 4054 } 4055 } 4056 4057 if (section != now_seg) 4058 { 4059 obj_elf_section_change_hook (); 4060 subseg_set (section, 0); 4061 4062 /* Call our section change hooks using the official hook. */ 4063 md_elf_section_change_hook (); 4064 } 4065 4066 if (exp.X_op != O_absent) 4067 { 4068 if (exp.X_op != O_constant && exp.X_op != O_symbol) 4069 { 4070 /* Handle complex expressions. */ 4071 sym = make_expr_symbol (&exp); 4072 off = 0; 4073 } 4074 else 4075 { 4076 sym = exp.X_add_symbol; 4077 off = exp.X_add_number; 4078 } 4079 4080 p = frag_var (rs_org, 1, 1, (relax_substateT) 0, sym, off, (char *) 0); 4081 *p = 0; 4082 } 4083 4084 mmix_handle_rest_of_empty_line (); 4085 } 4086 4087 /* The BYTE worker. We have to support sequences of mixed "strings", 4088 numbers and other constant "first-pass" reducible expressions separated 4089 by comma. */ 4090 4091 static void 4092 mmix_byte () 4093 { 4094 unsigned int c; 4095 char *start; 4096 4097 if (now_seg == text_section) 4098 text_has_contents = 1; 4099 else if (now_seg == data_section) 4100 data_has_contents = 1; 4101 4102 do 4103 { 4104 SKIP_WHITESPACE (); 4105 switch (*input_line_pointer) 4106 { 4107 case '\"': 4108 ++input_line_pointer; 4109 start = input_line_pointer; 4110 while (is_a_char (c = next_char_of_string ())) 4111 { 4112 FRAG_APPEND_1_CHAR (c); 4113 } 4114 4115 if (input_line_pointer[-1] != '\"') 4116 { 4117 /* We will only get here in rare cases involving #NO_APP, 4118 where the unterminated string is not recognized by the 4119 preformatting pass. */ 4120 as_bad (_("unterminated string")); 4121 mmix_discard_rest_of_line (); 4122 return; 4123 } 4124 break; 4125 4126 default: 4127 { 4128 expressionS exp; 4129 segT expseg = expression (&exp); 4130 4131 /* We have to allow special register names as constant numbers. */ 4132 if ((expseg != absolute_section && expseg != reg_section) 4133 || (exp.X_op != O_constant 4134 && (exp.X_op != O_register 4135 || exp.X_add_number <= 255))) 4136 { 4137 as_bad (_("BYTE expression not a pure number")); 4138 mmix_discard_rest_of_line (); 4139 return; 4140 } 4141 else if ((exp.X_add_number > 255 && exp.X_op != O_register) 4142 || exp.X_add_number < 0) 4143 { 4144 /* Note that mmixal does not allow negative numbers in 4145 BYTE sequences, so neither should we. */ 4146 as_bad (_("BYTE expression not in the range 0..255")); 4147 mmix_discard_rest_of_line (); 4148 return; 4149 } 4150 4151 FRAG_APPEND_1_CHAR (exp.X_add_number); 4152 } 4153 break; 4154 } 4155 4156 SKIP_WHITESPACE (); 4157 c = *input_line_pointer++; 4158 } 4159 while (c == ','); 4160 4161 input_line_pointer--; 4162 4163 if (mmix_gnu_syntax) 4164 demand_empty_rest_of_line (); 4165 else 4166 { 4167 mmix_discard_rest_of_line (); 4168 /* Do like demand_empty_rest_of_line and step over the end-of-line 4169 boundary. */ 4170 input_line_pointer++; 4171 } 4172 4173 /* Make sure we align for the next instruction. */ 4174 last_alignment = 0; 4175 } 4176 4177 /* Like cons_worker, but we have to ignore "naked comments", not barf on 4178 them. Implements WYDE, TETRA and OCTA. We're a little bit more 4179 lenient than mmix_byte but FIXME: they should eventually merge. */ 4180 4181 static void 4182 mmix_cons (nbytes) 4183 int nbytes; 4184 { 4185 expressionS exp; 4186 char *start; 4187 4188 /* If we don't have any contents, then it's ok to have a specified start 4189 address that is not a multiple of the max data size. We will then 4190 align it as necessary when we get here. Otherwise, it's a fatal sin. */ 4191 if (now_seg == text_section) 4192 { 4193 if (lowest_text_loc != (bfd_vma) -1 4194 && (lowest_text_loc & (nbytes - 1)) != 0) 4195 { 4196 if (text_has_contents) 4197 as_bad (_("data item with alignment larger than location")); 4198 else if (want_unaligned) 4199 as_bad (_("unaligned data at an absolute location is not supported")); 4200 4201 lowest_text_loc &= ~((bfd_vma) nbytes - 1); 4202 lowest_text_loc += (bfd_vma) nbytes; 4203 } 4204 4205 text_has_contents = 1; 4206 } 4207 else if (now_seg == data_section) 4208 { 4209 if (lowest_data_loc != (bfd_vma) -1 4210 && (lowest_data_loc & (nbytes - 1)) != 0) 4211 { 4212 if (data_has_contents) 4213 as_bad (_("data item with alignment larger than location")); 4214 else if (want_unaligned) 4215 as_bad (_("unaligned data at an absolute location is not supported")); 4216 4217 lowest_data_loc &= ~((bfd_vma) nbytes - 1); 4218 lowest_data_loc += (bfd_vma) nbytes; 4219 } 4220 4221 data_has_contents = 1; 4222 } 4223 4224 /* Always align these unless asked not to (valid for the current pseudo). */ 4225 if (! want_unaligned) 4226 { 4227 last_alignment = nbytes == 2 ? 1 : (nbytes == 4 ? 2 : 3); 4228 frag_align (last_alignment, 0, 0); 4229 record_alignment (now_seg, last_alignment); 4230 } 4231 4232 /* For mmixal compatibility, a label for an instruction (and emitting 4233 pseudo) refers to the _aligned_ address. So we have to emit the 4234 label here. */ 4235 if (current_fb_label >= 0) 4236 colon (fb_label_name (current_fb_label, 1)); 4237 else if (pending_label != NULL) 4238 { 4239 colon (pending_label); 4240 pending_label = NULL; 4241 } 4242 4243 SKIP_WHITESPACE (); 4244 4245 if (is_end_of_line[(unsigned int) *input_line_pointer]) 4246 { 4247 /* Default to zero if the expression was absent. */ 4248 4249 exp.X_op = O_constant; 4250 exp.X_add_number = 0; 4251 exp.X_unsigned = 0; 4252 exp.X_add_symbol = NULL; 4253 exp.X_op_symbol = NULL; 4254 emit_expr (&exp, (unsigned int) nbytes); 4255 } 4256 else 4257 do 4258 { 4259 unsigned int c; 4260 4261 switch (*input_line_pointer) 4262 { 4263 /* We support strings here too; each character takes up nbytes 4264 bytes. */ 4265 case '\"': 4266 ++input_line_pointer; 4267 start = input_line_pointer; 4268 while (is_a_char (c = next_char_of_string ())) 4269 { 4270 exp.X_op = O_constant; 4271 exp.X_add_number = c; 4272 exp.X_unsigned = 1; 4273 emit_expr (&exp, (unsigned int) nbytes); 4274 } 4275 4276 if (input_line_pointer[-1] != '\"') 4277 { 4278 /* We will only get here in rare cases involving #NO_APP, 4279 where the unterminated string is not recognized by the 4280 preformatting pass. */ 4281 as_bad (_("unterminated string")); 4282 mmix_discard_rest_of_line (); 4283 return; 4284 } 4285 break; 4286 4287 default: 4288 { 4289 expression (&exp); 4290 emit_expr (&exp, (unsigned int) nbytes); 4291 SKIP_WHITESPACE (); 4292 } 4293 break; 4294 } 4295 } 4296 while (*input_line_pointer++ == ','); 4297 4298 input_line_pointer--; /* Put terminator back into stream. */ 4299 4300 mmix_handle_rest_of_empty_line (); 4301 4302 /* We don't need to step up the counter for the current_fb_label here; 4303 that's handled by the caller. */ 4304 } 4305 4306 /* The md_do_align worker. At present, we just record an alignment to 4307 nullify the automatic alignment we do for WYDE, TETRA and OCTA, as gcc 4308 does not use the unaligned macros when attribute packed is used. 4309 Arguably this is a GCC bug. */ 4310 4311 void 4312 mmix_md_do_align (n, fill, len, max) 4313 int n; 4314 char *fill ATTRIBUTE_UNUSED; 4315 int len ATTRIBUTE_UNUSED; 4316 int max ATTRIBUTE_UNUSED; 4317 { 4318 last_alignment = n; 4319 want_unaligned = n == 0; 4320 } 4321