The 2.41 release!
[binutils-gdb.git] / gas / config / tc-mmix.c
blob881534509b39bdfb597fe7493150d09ea8a4fbb7
1 /* tc-mmix.c -- Assembler for Don Knuth's MMIX.
2 Copyright (C) 2001-2023 Free Software Foundation, Inc.
4 This file is part of GAS, the GNU Assembler.
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 3, or (at your option)
9 any later version.
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.
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, 51 Franklin Street - Fifth Floor,
19 Boston, MA 02110-1301, USA. */
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.
25 One goal is to provide a superset of what mmixal does, including
26 compatible syntax, but the main purpose is to serve GCC. */
29 #include "as.h"
30 #include <limits.h>
31 #include "subsegs.h"
32 #include "elf/mmix.h"
33 #include "opcode/mmix.h"
34 #include "safe-ctype.h"
35 #include "dwarf2dbg.h"
36 #include "obstack.h"
38 /* Something to describe what we need to do with a fixup before output,
39 for example assert something of what it became or make a relocation. */
41 enum mmix_fixup_action
43 mmix_fixup_byte,
44 mmix_fixup_register,
45 mmix_fixup_register_or_adjust_for_byte
48 static int get_spec_regno (char *);
49 static int get_operands (int, char *, expressionS *);
50 static int get_putget_operands (struct mmix_opcode *, char *, expressionS *);
51 static void s_prefix (int);
52 static void s_greg (int);
53 static void s_loc (int);
54 static void s_bspec (int);
55 static void s_espec (int);
56 static void mmix_s_local (int);
57 static void mmix_greg_internal (char *);
58 static void mmix_set_geta_branch_offset (char *, offsetT);
59 static void mmix_set_jmp_offset (char *, offsetT);
60 static void mmix_fill_nops (char *, int);
61 static int cmp_greg_symbol_fixes (const void *, const void *);
62 static int cmp_greg_val_greg_symbol_fixes (const void *, const void *);
63 static void mmix_handle_rest_of_empty_line (void);
64 static void mmix_discard_rest_of_line (void);
65 static void mmix_byte (void);
66 static void mmix_cons (int);
68 /* Continue the tradition of symbols.c; use control characters to enforce
69 magic. These are used when replacing e.g. 8F and 8B so we can handle
70 such labels correctly with the common parser hooks. */
71 #define MAGIC_FB_BACKWARD_CHAR '\003'
72 #define MAGIC_FB_FORWARD_CHAR '\004'
74 /* Copy the location of a frag to a fix. */
75 #define COPY_FR_WHERE_TO_FX(FRAG, FIX) \
76 do \
77 { \
78 (FIX)->fx_file = (FRAG)->fr_file; \
79 (FIX)->fx_line = (FRAG)->fr_line; \
80 } \
81 while (0)
83 const char *md_shortopts = "x";
84 static int current_fb_label = -1;
85 static char *pending_label = NULL;
87 static bfd_vma lowest_text_loc = (bfd_vma) -1;
88 static int text_has_contents = 0;
90 /* The alignment of the previous instruction, and a boolean for whether we
91 want to avoid aligning the next WYDE, TETRA, OCTA or insn. */
92 static int last_alignment = 0;
93 static int want_unaligned = 0;
95 static bfd_vma lowest_data_loc = (bfd_vma) -1;
96 static int data_has_contents = 0;
98 /* The fragS of the instruction being assembled. Only valid from within
99 md_assemble. */
100 fragS *mmix_opcode_frag = NULL;
102 /* Raw GREGs as appearing in input. These may be fewer than the number
103 after relaxing. */
104 static int n_of_raw_gregs = 0;
105 static struct
107 char *label;
108 expressionS exp;
109 } mmix_raw_gregs[MAX_GREGS];
111 static struct loc_assert_s
113 segT old_seg;
114 symbolS *loc_sym;
115 fragS *frag;
116 struct loc_assert_s *next;
117 } *loc_asserts = NULL;
119 /* Fixups for all unique GREG registers. We store the fixups here in
120 md_convert_frag, then we use the array to convert
121 BFD_RELOC_MMIX_BASE_PLUS_OFFSET fixups in tc_gen_reloc. The index is
122 just a running number and is not supposed to be correlated to a
123 register number. */
124 static fixS *mmix_gregs[MAX_GREGS];
125 static int n_of_cooked_gregs = 0;
127 /* Pointing to the register section we use for output. */
128 static asection *real_reg_section;
130 /* For each symbol; unknown or section symbol, we keep a list of GREG
131 definitions sorted on increasing offset. It seems no use keeping count
132 to allocate less room than the maximum number of gregs when we've found
133 one for a section or symbol. */
134 struct mmix_symbol_gregs
136 int n_gregs;
137 struct mmix_symbol_greg_fixes
139 fixS *fix;
141 /* A signed type, since we may have GREGs pointing slightly before the
142 contents of a section. */
143 offsetT offs;
144 } greg_fixes[MAX_GREGS];
147 /* Should read insert a colon on something that starts in column 0 on
148 this line? */
149 static int label_without_colon_this_line = 1;
151 /* Should we automatically expand instructions into multiple insns in
152 order to generate working code? */
153 static int expand_op = 1;
155 /* Should we warn when expanding operands? FIXME: test-cases for when -x
156 is absent. */
157 static int warn_on_expansion = 1;
159 /* Should we merge non-zero GREG register definitions? */
160 static int merge_gregs = 1;
162 /* Should we pass on undefined BFD_RELOC_MMIX_BASE_PLUS_OFFSET relocs
163 (missing suitable GREG definitions) to the linker? */
164 static int allocate_undefined_gregs_in_linker = 0;
166 /* Should we emit built-in symbols? */
167 static int predefined_syms = 1;
169 /* Should we allow anything but the listed special register name
170 (e.g. equated symbols)? */
171 static int equated_spec_regs = 1;
173 /* Do we require standard GNU syntax? */
174 int mmix_gnu_syntax = 0;
176 /* Do we globalize all symbols? */
177 int mmix_globalize_symbols = 0;
179 /* When expanding insns, do we want to expand PUSHJ as a call to a stub
180 (or else as a series of insns)? */
181 int pushj_stubs = 1;
183 /* Do we know that the next semicolon is at the end of the operands field
184 (in mmixal mode; constant 1 in GNU mode)? */
185 int mmix_next_semicolon_is_eoln = 1;
187 /* Do we have a BSPEC in progress? */
188 static int doing_bspec = 0;
189 static const char *bspec_file;
190 static unsigned int bspec_line;
192 struct option md_longopts[] =
194 #define OPTION_RELAX (OPTION_MD_BASE)
195 #define OPTION_NOEXPAND (OPTION_RELAX + 1)
196 #define OPTION_NOMERGEGREG (OPTION_NOEXPAND + 1)
197 #define OPTION_NOSYMS (OPTION_NOMERGEGREG + 1)
198 #define OPTION_GNU_SYNTAX (OPTION_NOSYMS + 1)
199 #define OPTION_GLOBALIZE_SYMBOLS (OPTION_GNU_SYNTAX + 1)
200 #define OPTION_FIXED_SPEC_REGS (OPTION_GLOBALIZE_SYMBOLS + 1)
201 #define OPTION_LINKER_ALLOCATED_GREGS (OPTION_FIXED_SPEC_REGS + 1)
202 #define OPTION_NOPUSHJSTUBS (OPTION_LINKER_ALLOCATED_GREGS + 1)
203 {"linkrelax", no_argument, NULL, OPTION_RELAX},
204 {"no-expand", no_argument, NULL, OPTION_NOEXPAND},
205 {"no-merge-gregs", no_argument, NULL, OPTION_NOMERGEGREG},
206 {"no-predefined-syms", no_argument, NULL, OPTION_NOSYMS},
207 {"gnu-syntax", no_argument, NULL, OPTION_GNU_SYNTAX},
208 {"globalize-symbols", no_argument, NULL, OPTION_GLOBALIZE_SYMBOLS},
209 {"fixed-special-register-names", no_argument, NULL,
210 OPTION_FIXED_SPEC_REGS},
211 {"linker-allocated-gregs", no_argument, NULL,
212 OPTION_LINKER_ALLOCATED_GREGS},
213 {"no-pushj-stubs", no_argument, NULL, OPTION_NOPUSHJSTUBS},
214 {"no-stubs", no_argument, NULL, OPTION_NOPUSHJSTUBS},
215 {NULL, no_argument, NULL, 0}
218 size_t md_longopts_size = sizeof (md_longopts);
220 static htab_t mmix_opcode_hash;
222 /* We use these when implementing the PREFIX pseudo. */
223 char *mmix_current_prefix;
224 struct obstack mmix_sym_obstack;
227 /* For MMIX, we encode the relax_substateT:s (in e.g. fr_substate) as one
228 bit length, and the relax-type shifted on top of that. There seems to
229 be no point in making the relaxation more fine-grained; the linker does
230 that better and we might interfere by changing non-optimal relaxations
231 into other insns that cannot be relaxed as easily.
233 Groups for MMIX relaxing:
235 1. GETA
236 extra length: zero or three insns.
238 2. Bcc
239 extra length: zero or five insns.
241 3. PUSHJ
242 extra length: zero or four insns.
243 Special handling to deal with transition to PUSHJSTUB.
245 4. JMP
246 extra length: zero or four insns.
248 5. GREG
249 special handling, allocates a named global register unless another
250 is within reach for all uses.
252 6. PUSHJSTUB
253 special handling (mostly) for external references; assumes the
254 linker will generate a stub if target is no longer than 256k from
255 the end of the section plus max size of previous stubs. Zero or
256 four insns. */
258 #define STATE_GETA (1)
259 #define STATE_BCC (2)
260 #define STATE_PUSHJ (3)
261 #define STATE_JMP (4)
262 #define STATE_GREG (5)
263 #define STATE_PUSHJSTUB (6)
265 /* No fine-grainedness here. */
266 #define STATE_LENGTH_MASK (1)
268 #define STATE_ZERO (0)
269 #define STATE_MAX (1)
271 /* More descriptive name for convenience. */
272 /* FIXME: We should start on something different, not MAX. */
273 #define STATE_UNDF STATE_MAX
275 /* FIXME: For GREG, we must have other definitions; UNDF == MAX isn't
276 appropriate; we need it the other way round. This value together with
277 fragP->tc_frag_data shows what state the frag is in: tc_frag_data
278 non-NULL means 0, NULL means 8 bytes. */
279 #define STATE_GREG_UNDF ENCODE_RELAX (STATE_GREG, STATE_ZERO)
280 #define STATE_GREG_DEF ENCODE_RELAX (STATE_GREG, STATE_MAX)
282 /* These displacements are relative to the address following the opcode
283 word of the instruction. The catch-all states have zero for "reach"
284 and "next" entries. */
286 #define GETA_0F (65536 * 4 - 8)
287 #define GETA_0B (-65536 * 4 - 4)
289 #define GETA_MAX_LEN 4 * 4
290 #define GETA_3F 0
291 #define GETA_3B 0
293 #define BCC_0F GETA_0F
294 #define BCC_0B GETA_0B
296 #define BCC_MAX_LEN 6 * 4
297 #define BCC_5F GETA_3F
298 #define BCC_5B GETA_3B
300 #define PUSHJ_0F GETA_0F
301 #define PUSHJ_0B GETA_0B
303 #define PUSHJ_MAX_LEN 5 * 4
304 #define PUSHJ_4F GETA_3F
305 #define PUSHJ_4B GETA_3B
307 /* We'll very rarely have sections longer than LONG_MAX, but we'll make a
308 feeble attempt at getting 64-bit values. */
309 #define PUSHJSTUB_MAX ((offsetT) (((addressT) -1) >> 1))
310 #define PUSHJSTUB_MIN (-PUSHJSTUB_MAX - 1)
312 #define JMP_0F (65536 * 256 * 4 - 8)
313 #define JMP_0B (-65536 * 256 * 4 - 4)
315 #define JMP_MAX_LEN 5 * 4
316 #define JMP_4F 0
317 #define JMP_4B 0
319 #define RELAX_ENCODE_SHIFT 1
320 #define ENCODE_RELAX(what, length) (((what) << RELAX_ENCODE_SHIFT) + (length))
322 const relax_typeS mmix_relax_table[] =
324 /* Error sentinel (0, 0). */
325 {1, 1, 0, 0},
327 /* Unused (0, 1). */
328 {1, 1, 0, 0},
330 /* GETA (1, 0). */
331 {GETA_0F, GETA_0B, 0, ENCODE_RELAX (STATE_GETA, STATE_MAX)},
333 /* GETA (1, 1). */
334 {GETA_3F, GETA_3B,
335 GETA_MAX_LEN - 4, 0},
337 /* BCC (2, 0). */
338 {BCC_0F, BCC_0B, 0, ENCODE_RELAX (STATE_BCC, STATE_MAX)},
340 /* BCC (2, 1). */
341 {BCC_5F, BCC_5B,
342 BCC_MAX_LEN - 4, 0},
344 /* PUSHJ (3, 0). Next state is actually PUSHJSTUB (6, 0). */
345 {PUSHJ_0F, PUSHJ_0B, 0, ENCODE_RELAX (STATE_PUSHJSTUB, STATE_ZERO)},
347 /* PUSHJ (3, 1). */
348 {PUSHJ_4F, PUSHJ_4B,
349 PUSHJ_MAX_LEN - 4, 0},
351 /* JMP (4, 0). */
352 {JMP_0F, JMP_0B, 0, ENCODE_RELAX (STATE_JMP, STATE_MAX)},
354 /* JMP (4, 1). */
355 {JMP_4F, JMP_4B,
356 JMP_MAX_LEN - 4, 0},
358 /* GREG (5, 0), (5, 1), though the table entry isn't used. */
359 {0, 0, 0, 0}, {0, 0, 0, 0},
361 /* PUSHJSTUB (6, 0). PUSHJ (3, 0) uses the range, so we set it to infinite. */
362 {PUSHJSTUB_MAX, PUSHJSTUB_MIN,
363 0, ENCODE_RELAX (STATE_PUSHJ, STATE_MAX)},
364 /* PUSHJSTUB (6, 1) isn't used. */
365 {0, 0, PUSHJ_MAX_LEN, 0}
368 const pseudo_typeS md_pseudo_table[] =
370 /* Support " .greg sym,expr" syntax. */
371 {"greg", s_greg, 0},
373 /* Support " .bspec expr" syntax. */
374 {"bspec", s_bspec, 1},
376 /* Support " .espec" syntax. */
377 {"espec", s_espec, 1},
379 /* Support " .local $45" syntax. */
380 {"local", mmix_s_local, 1},
382 {NULL, 0, 0}
385 const char mmix_comment_chars[] = "%!";
387 /* A ':' is a valid symbol character in mmixal. It's the prefix
388 delimiter, but other than that, it works like a symbol character,
389 except that we strip one off at the beginning of symbols. An '@' is a
390 symbol by itself (for the current location); space around it must not
391 be stripped. */
392 const char mmix_symbol_chars[] = ":@";
394 const char line_comment_chars[] = "*#";
396 const char line_separator_chars[] = ";";
398 const char EXP_CHARS[] = "eE";
400 const char FLT_CHARS[] = "rf";
403 /* Fill in the offset-related part of GETA or Bcc. */
405 static void
406 mmix_set_geta_branch_offset (char *opcodep, offsetT value)
408 if (value < 0)
410 value += 65536 * 4;
411 opcodep[0] |= 1;
414 value /= 4;
415 md_number_to_chars (opcodep + 2, value, 2);
418 /* Fill in the offset-related part of JMP. */
420 static void
421 mmix_set_jmp_offset (char *opcodep, offsetT value)
423 if (value < 0)
425 value += 65536 * 256 * 4;
426 opcodep[0] |= 1;
429 value /= 4;
430 md_number_to_chars (opcodep + 1, value, 3);
433 /* Fill in NOP:s for the expanded part of GETA/JMP/Bcc/PUSHJ. */
435 static void
436 mmix_fill_nops (char *opcodep, int n)
438 int i;
440 for (i = 0; i < n; i++)
441 md_number_to_chars (opcodep + i * 4, SWYM_INSN_BYTE << 24, 4);
444 /* See macro md_parse_name in tc-mmix.h. */
447 mmix_current_location (void (*fn) (expressionS *), expressionS *exp)
449 (*fn) (exp);
451 return 1;
454 /* Get up to three operands, filling them into the exp array.
455 General idea and code stolen from the tic80 port. */
457 static int
458 get_operands (int max_operands, char *s, expressionS *exp)
460 char *p = s;
461 int numexp = 0;
462 int nextchar = ',';
464 while (nextchar == ',')
466 /* Skip leading whitespace */
467 while (*p == ' ' || *p == '\t')
468 p++;
470 /* Check to see if we have any operands left to parse */
471 if (*p == 0 || *p == '\n' || *p == '\r')
473 break;
475 else if (numexp == max_operands)
477 /* This seems more sane than saying "too many operands". We'll
478 get here only if the trailing trash starts with a comma. */
479 as_bad (_("invalid operands"));
480 mmix_discard_rest_of_line ();
481 return 0;
484 /* Begin operand parsing at the current scan point. */
486 input_line_pointer = p;
487 expression (&exp[numexp]);
489 if (exp[numexp].X_op == O_illegal)
491 as_bad (_("invalid operands"));
493 else if (exp[numexp].X_op == O_absent)
495 as_bad (_("missing operand"));
498 numexp++;
499 p = input_line_pointer;
501 /* Skip leading whitespace */
502 while (*p == ' ' || *p == '\t')
503 p++;
504 nextchar = *p++;
507 /* If we allow "naked" comments, ignore the rest of the line. */
508 if (nextchar != ',')
510 mmix_handle_rest_of_empty_line ();
511 input_line_pointer--;
514 /* Mark the end of the valid operands with an illegal expression. */
515 exp[numexp].X_op = O_illegal;
517 return (numexp);
520 /* Get the value of a special register, or -1 if the name does not match
521 one. NAME is a null-terminated string. */
523 static int
524 get_spec_regno (char *name)
526 int i;
528 if (name == NULL)
529 return -1;
531 if (*name == ':')
532 name++;
534 /* Well, it's a short array and we'll most often just match the first
535 entry, rJ. */
536 for (i = 0; mmix_spec_regs[i].name != NULL; i++)
537 if (strcmp (name, mmix_spec_regs[i].name) == 0)
538 return mmix_spec_regs[i].number;
540 return -1;
543 /* For GET and PUT, parse the register names "manually", so we don't use
544 user labels. */
545 static int
546 get_putget_operands (struct mmix_opcode *insn, char *operands,
547 expressionS *exp)
549 expressionS *expp_reg;
550 expressionS *expp_sreg;
551 char *sregp = NULL;
552 char *sregend = operands;
553 char *p = operands;
554 char c = *sregend;
555 int regno;
557 /* Skip leading whitespace */
558 while (*p == ' ' || *p == '\t')
559 p++;
561 input_line_pointer = p;
563 /* Initialize both possible operands to error state, in case we never
564 get further. */
565 exp[0].X_op = O_illegal;
566 exp[1].X_op = O_illegal;
568 if (insn->operands == mmix_operands_get)
570 expp_reg = &exp[0];
571 expp_sreg = &exp[1];
573 expression (expp_reg);
575 p = input_line_pointer;
577 /* Skip whitespace */
578 while (*p == ' ' || *p == '\t')
579 p++;
581 if (*p == ',')
583 p++;
585 /* Skip whitespace */
586 while (*p == ' ' || *p == '\t')
587 p++;
588 sregp = p;
589 input_line_pointer = sregp;
590 c = get_symbol_name (&sregp);
591 sregend = input_line_pointer;
592 if (c == '"')
593 ++ input_line_pointer;
596 else
598 expp_sreg = &exp[0];
599 expp_reg = &exp[1];
601 c = get_symbol_name (&sregp);
602 sregend = input_line_pointer;
603 restore_line_pointer (c);
604 p = input_line_pointer;
606 /* Skip whitespace */
607 while (*p == ' ' || *p == '\t')
608 p++;
610 if (*p == ',')
612 p++;
614 /* Skip whitespace */
615 while (*p == ' ' || *p == '\t')
616 p++;
618 input_line_pointer = p;
619 expression (expp_reg);
621 *sregend = 0;
624 regno = get_spec_regno (sregp);
625 *sregend = c;
627 resolve_register (expp_reg);
629 /* Let the caller issue errors; we've made sure the operands are
630 invalid. */
631 if (expp_reg->X_op != O_illegal
632 && expp_reg->X_op != O_absent
633 && regno != -1)
635 expp_sreg->X_op = O_register;
636 expp_sreg->X_add_number = regno + 256;
639 return 2;
642 /* Handle MMIX-specific option. */
645 md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED)
647 switch (c)
649 case 'x':
650 warn_on_expansion = 0;
651 allocate_undefined_gregs_in_linker = 1;
652 break;
654 case OPTION_RELAX:
655 linkrelax = 1;
656 break;
658 case OPTION_NOEXPAND:
659 expand_op = 0;
660 break;
662 case OPTION_NOMERGEGREG:
663 merge_gregs = 0;
664 break;
666 case OPTION_NOSYMS:
667 predefined_syms = 0;
668 equated_spec_regs = 0;
669 break;
671 case OPTION_GNU_SYNTAX:
672 mmix_gnu_syntax = 1;
673 label_without_colon_this_line = 0;
674 break;
676 case OPTION_GLOBALIZE_SYMBOLS:
677 mmix_globalize_symbols = 1;
678 break;
680 case OPTION_FIXED_SPEC_REGS:
681 equated_spec_regs = 0;
682 break;
684 case OPTION_LINKER_ALLOCATED_GREGS:
685 allocate_undefined_gregs_in_linker = 1;
686 break;
688 case OPTION_NOPUSHJSTUBS:
689 pushj_stubs = 0;
690 break;
692 default:
693 return 0;
696 return 1;
699 /* Display MMIX-specific help text. */
701 void
702 md_show_usage (FILE * stream)
704 fprintf (stream, _(" MMIX-specific command line options:\n"));
705 fprintf (stream, _("\
706 -fixed-special-register-names\n\
707 Allow only the original special register names.\n"));
708 fprintf (stream, _("\
709 -globalize-symbols Make all symbols global.\n"));
710 fprintf (stream, _("\
711 -gnu-syntax Turn off mmixal syntax compatibility.\n"));
712 fprintf (stream, _("\
713 -relax Create linker relaxable code.\n"));
714 fprintf (stream, _("\
715 -no-predefined-syms Do not provide mmixal built-in constants.\n\
716 Implies -fixed-special-register-names.\n"));
717 fprintf (stream, _("\
718 -no-expand Do not expand GETA, branches, PUSHJ or JUMP\n\
719 into multiple instructions.\n"));
720 fprintf (stream, _("\
721 -no-merge-gregs Do not merge GREG definitions with nearby values.\n"));
722 fprintf (stream, _("\
723 -linker-allocated-gregs If there's no suitable GREG definition for the\
724 operands of an instruction, let the linker resolve.\n"));
725 fprintf (stream, _("\
726 -x Do not warn when an operand to GETA, a branch,\n\
727 PUSHJ or JUMP is not known to be within range.\n\
728 The linker will catch any errors. Implies\n\
729 -linker-allocated-gregs."));
732 /* Step to end of line, but don't step over the end of the line. */
734 static void
735 mmix_discard_rest_of_line (void)
737 while (*input_line_pointer
738 && (! is_end_of_line[(unsigned char) *input_line_pointer]
739 || TC_EOL_IN_INSN (input_line_pointer)))
740 input_line_pointer++;
743 /* Act as demand_empty_rest_of_line if we're in strict GNU syntax mode,
744 otherwise just ignore the rest of the line (and skip the end-of-line
745 delimiter). */
747 static void
748 mmix_handle_rest_of_empty_line (void)
750 if (mmix_gnu_syntax)
751 demand_empty_rest_of_line ();
752 else
754 mmix_discard_rest_of_line ();
755 input_line_pointer++;
759 /* Initialize GAS MMIX specifics. */
761 void
762 mmix_md_begin (void)
764 int i;
765 const struct mmix_opcode *opcode;
767 /* We assume nobody will use this, so don't allocate any room. */
768 obstack_begin (&mmix_sym_obstack, 0);
770 /* This will break the day the "lex" thingy changes. For now, it's the
771 only way to make ':' part of a name, and a name beginner. */
772 lex_type[':'] = (LEX_NAME | LEX_BEGIN_NAME);
774 mmix_opcode_hash = str_htab_create ();
776 real_reg_section
777 = bfd_make_section_old_way (stdoutput, MMIX_REG_SECTION_NAME);
779 for (opcode = mmix_opcodes; opcode->name; opcode++)
780 str_hash_insert (mmix_opcode_hash, opcode->name, opcode, 0);
782 /* We always insert the ordinary registers 0..255 as registers. */
783 for (i = 0; i < 256; i++)
785 char buf[16];
787 /* Alternatively, we could diddle with '$' and the following number,
788 but keeping the registers as symbols helps keep parsing simple. */
789 sprintf (buf, "$%d", i);
790 symbol_table_insert (symbol_new (buf, reg_section,
791 &zero_address_frag, i));
794 /* Insert mmixal built-in names if allowed. */
795 if (predefined_syms)
797 for (i = 0; mmix_spec_regs[i].name != NULL; i++)
798 symbol_table_insert (symbol_new (mmix_spec_regs[i].name,
799 reg_section,
800 &zero_address_frag,
801 mmix_spec_regs[i].number + 256));
803 /* FIXME: Perhaps these should be recognized as specials; as field
804 names for those instructions. */
805 symbol_table_insert (symbol_new ("ROUND_CURRENT", reg_section,
806 &zero_address_frag, 512));
807 symbol_table_insert (symbol_new ("ROUND_OFF", reg_section,
808 &zero_address_frag, 512 + 1));
809 symbol_table_insert (symbol_new ("ROUND_UP", reg_section,
810 &zero_address_frag, 512 + 2));
811 symbol_table_insert (symbol_new ("ROUND_DOWN", reg_section,
812 &zero_address_frag, 512 + 3));
813 symbol_table_insert (symbol_new ("ROUND_NEAR", reg_section,
814 &zero_address_frag, 512 + 4));
818 /* Assemble one insn in STR. */
820 void
821 md_assemble (char *str)
823 char *operands = str;
824 char modified_char = 0;
825 struct mmix_opcode *instruction;
826 fragS *opc_fragP = NULL;
827 int max_operands = 3;
829 /* Note that the struct frag member fr_literal in frags.h is char[], so
830 I have to make this a plain char *. */
831 /* unsigned */ char *opcodep = NULL;
833 expressionS exp[4];
834 int n_operands = 0;
836 /* Move to end of opcode. */
837 for (operands = str;
838 is_part_of_name (*operands);
839 ++operands)
842 if (ISSPACE (*operands))
844 modified_char = *operands;
845 *operands++ = '\0';
848 instruction = (struct mmix_opcode *) str_hash_find (mmix_opcode_hash, str);
849 if (instruction == NULL)
851 as_bad (_("unknown opcode: `%s'"), str);
853 /* Avoid "unhandled label" errors. */
854 pending_label = NULL;
855 return;
858 /* Put back the character after the opcode. */
859 if (modified_char != 0)
860 operands[-1] = modified_char;
862 input_line_pointer = operands;
864 /* Is this a mmixal pseudodirective? */
865 if (instruction->type == mmix_type_pseudo)
867 /* For mmixal compatibility, a label for an instruction (and
868 emitting pseudo) refers to the _aligned_ address. We emit the
869 label here for the pseudos that don't handle it themselves. When
870 having an fb-label, emit it here, and increment the counter after
871 the pseudo. */
872 switch (instruction->operands)
874 case mmix_operands_loc:
875 case mmix_operands_byte:
876 case mmix_operands_prefix:
877 case mmix_operands_local:
878 case mmix_operands_bspec:
879 case mmix_operands_espec:
880 if (current_fb_label >= 0)
881 colon (fb_label_name (current_fb_label, 1));
882 else if (pending_label != NULL)
884 colon (pending_label);
885 pending_label = NULL;
887 break;
889 default:
890 break;
893 /* Some of the pseudos emit contents, others don't. Set a
894 contents-emitted flag when we emit something into .text */
895 switch (instruction->operands)
897 case mmix_operands_loc:
898 /* LOC */
899 s_loc (0);
900 break;
902 case mmix_operands_byte:
903 /* BYTE */
904 mmix_byte ();
905 break;
907 case mmix_operands_wyde:
908 /* WYDE */
909 mmix_cons (2);
910 break;
912 case mmix_operands_tetra:
913 /* TETRA */
914 mmix_cons (4);
915 break;
917 case mmix_operands_octa:
918 /* OCTA */
919 mmix_cons (8);
920 break;
922 case mmix_operands_prefix:
923 /* PREFIX */
924 s_prefix (0);
925 break;
927 case mmix_operands_local:
928 /* LOCAL */
929 mmix_s_local (0);
930 break;
932 case mmix_operands_bspec:
933 /* BSPEC */
934 s_bspec (0);
935 break;
937 case mmix_operands_espec:
938 /* ESPEC */
939 s_espec (0);
940 break;
942 default:
943 BAD_CASE (instruction->operands);
946 /* These are all working like the pseudo functions in read.c:s_...,
947 in that they step over the end-of-line marker at the end of the
948 line. We don't want that here. */
949 input_line_pointer--;
951 /* Step up the fb-label counter if there was a definition on this
952 line. */
953 if (current_fb_label >= 0)
955 fb_label_instance_inc (current_fb_label);
956 current_fb_label = -1;
959 /* Reset any don't-align-next-datum request, unless this was a LOC
960 directive. */
961 if (instruction->operands != mmix_operands_loc)
962 want_unaligned = 0;
964 return;
967 /* Not a pseudo; we *will* emit contents. */
968 if (now_seg == data_section)
970 if (lowest_data_loc != (bfd_vma) -1 && (lowest_data_loc & 3) != 0)
972 if (data_has_contents)
973 as_bad (_("specified location wasn't TETRA-aligned"));
974 else if (want_unaligned)
975 as_bad (_("unaligned data at an absolute location is not supported"));
977 lowest_data_loc &= ~(bfd_vma) 3;
978 lowest_data_loc += 4;
981 data_has_contents = 1;
983 else if (now_seg == text_section)
985 if (lowest_text_loc != (bfd_vma) -1 && (lowest_text_loc & 3) != 0)
987 if (text_has_contents)
988 as_bad (_("specified location wasn't TETRA-aligned"));
989 else if (want_unaligned)
990 as_bad (_("unaligned data at an absolute location is not supported"));
992 lowest_text_loc &= ~(bfd_vma) 3;
993 lowest_text_loc += 4;
996 text_has_contents = 1;
999 /* After a sequence of BYTEs or WYDEs, we need to get to instruction
1000 alignment. For other pseudos, a ".p2align 2" is supposed to be
1001 inserted by the user. */
1002 if (last_alignment < 2 && ! want_unaligned)
1004 frag_align (2, 0, 0);
1005 record_alignment (now_seg, 2);
1006 last_alignment = 2;
1008 else
1009 /* Reset any don't-align-next-datum request. */
1010 want_unaligned = 0;
1012 /* For mmixal compatibility, a label for an instruction (and emitting
1013 pseudo) refers to the _aligned_ address. So we have to emit the
1014 label here. */
1015 if (pending_label != NULL)
1017 colon (pending_label);
1018 pending_label = NULL;
1021 /* We assume that mmix_opcodes keeps having unique mnemonics for each
1022 opcode, so we don't have to iterate over more than one opcode; if the
1023 syntax does not match, then there's a syntax error. */
1025 /* Operands have little or no context and are all comma-separated; it is
1026 easier to parse each expression first. */
1027 switch (instruction->operands)
1029 case mmix_operands_reg_yz:
1030 case mmix_operands_pop:
1031 case mmix_operands_regaddr:
1032 case mmix_operands_pushj:
1033 case mmix_operands_get:
1034 case mmix_operands_put:
1035 case mmix_operands_set:
1036 case mmix_operands_save:
1037 case mmix_operands_unsave:
1038 max_operands = 2;
1039 break;
1041 case mmix_operands_sync:
1042 case mmix_operands_jmp:
1043 case mmix_operands_resume:
1044 max_operands = 1;
1045 break;
1047 /* The original 3 is fine for the rest. */
1048 default:
1049 break;
1052 /* If this is GET or PUT, and we don't do allow those names to be
1053 equated, we need to parse the names ourselves, so we don't pick up a
1054 user label instead of the special register. */
1055 if (! equated_spec_regs
1056 && (instruction->operands == mmix_operands_get
1057 || instruction->operands == mmix_operands_put))
1058 n_operands = get_putget_operands (instruction, operands, exp);
1059 else
1060 n_operands = get_operands (max_operands, operands, exp);
1062 /* If there's a fb-label on the current line, set that label. This must
1063 be done *after* evaluating expressions of operands, since neither a
1064 "1B" nor a "1F" refers to "1H" on the same line. */
1065 if (current_fb_label >= 0)
1067 fb_label_instance_inc (current_fb_label);
1068 colon (fb_label_name (current_fb_label, 0));
1069 current_fb_label = -1;
1072 /* We also assume that the length of the instruction is at least 4, the
1073 size of an unexpanded instruction. We need a self-contained frag
1074 since we want the relocation to point to the instruction, not the
1075 variant part. */
1077 opcodep = frag_more (4);
1078 mmix_opcode_frag = opc_fragP = frag_now;
1079 frag_now->fr_opcode = opcodep;
1081 /* Mark start of insn for DWARF2 debug features. */
1082 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1083 dwarf2_emit_insn (4);
1085 md_number_to_chars (opcodep, instruction->match, 4);
1087 switch (instruction->operands)
1089 case mmix_operands_jmp:
1090 if (n_operands == 0 && ! mmix_gnu_syntax)
1091 /* Zeros are in place - nothing needs to be done when we have no
1092 operands. */
1093 break;
1095 /* Add a frag for a JMP relaxation; we need room for max four
1096 extra instructions. We don't do any work around here to check if
1097 we can determine the offset right away. */
1098 if (n_operands != 1 || exp[0].X_op == O_register)
1100 as_bad (_("invalid operand to opcode %s: `%s'"),
1101 instruction->name, operands);
1102 return;
1105 if (expand_op)
1106 frag_var (rs_machine_dependent, 4 * 4, 0,
1107 ENCODE_RELAX (STATE_JMP, STATE_UNDF),
1108 exp[0].X_add_symbol,
1109 exp[0].X_add_number,
1110 opcodep);
1111 else
1112 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal, 4,
1113 exp + 0, 1, BFD_RELOC_MMIX_ADDR27);
1114 break;
1116 case mmix_operands_pushj:
1117 /* We take care of PUSHJ in full here. */
1118 if (n_operands != 2
1119 || ((exp[0].X_op == O_constant || exp[0].X_op == O_register)
1120 && (exp[0].X_add_number > 255 || exp[0].X_add_number < 0)))
1122 as_bad (_("invalid operands to opcode %s: `%s'"),
1123 instruction->name, operands);
1124 return;
1127 if (exp[0].X_op == O_register || exp[0].X_op == O_constant)
1128 opcodep[1] = exp[0].X_add_number;
1129 else
1130 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1,
1131 1, exp + 0, 0, BFD_RELOC_MMIX_REG_OR_BYTE);
1133 if (expand_op)
1134 frag_var (rs_machine_dependent, PUSHJ_MAX_LEN - 4, 0,
1135 ENCODE_RELAX (STATE_PUSHJ, STATE_UNDF),
1136 exp[1].X_add_symbol,
1137 exp[1].X_add_number,
1138 opcodep);
1139 else
1140 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal, 4,
1141 exp + 1, 1, BFD_RELOC_MMIX_ADDR19);
1142 break;
1144 case mmix_operands_regaddr:
1145 /* GETA/branch: Add a frag for relaxation. We don't do any work
1146 around here to check if we can determine the offset right away. */
1147 if (n_operands != 2 || exp[1].X_op == O_register)
1149 as_bad (_("invalid operands to opcode %s: `%s'"),
1150 instruction->name, operands);
1151 return;
1154 if (! expand_op)
1155 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal, 4,
1156 exp + 1, 1, BFD_RELOC_MMIX_ADDR19);
1157 else if (instruction->type == mmix_type_condbranch)
1158 frag_var (rs_machine_dependent, BCC_MAX_LEN - 4, 0,
1159 ENCODE_RELAX (STATE_BCC, STATE_UNDF),
1160 exp[1].X_add_symbol,
1161 exp[1].X_add_number,
1162 opcodep);
1163 else
1164 frag_var (rs_machine_dependent, GETA_MAX_LEN - 4, 0,
1165 ENCODE_RELAX (STATE_GETA, STATE_UNDF),
1166 exp[1].X_add_symbol,
1167 exp[1].X_add_number,
1168 opcodep);
1169 break;
1171 default:
1172 break;
1175 switch (instruction->operands)
1177 case mmix_operands_regs:
1178 /* We check the number of operands here, since we're in a
1179 FALLTHROUGH sequence in the next switch. */
1180 if (n_operands != 3 || exp[2].X_op == O_constant)
1182 as_bad (_("invalid operands to opcode %s: `%s'"),
1183 instruction->name, operands);
1184 return;
1186 /* FALLTHROUGH. */
1187 case mmix_operands_regs_z:
1188 if (n_operands != 3)
1190 as_bad (_("invalid operands to opcode %s: `%s'"),
1191 instruction->name, operands);
1192 return;
1194 /* FALLTHROUGH. */
1195 case mmix_operands_reg_yz:
1196 case mmix_operands_roundregs_z:
1197 case mmix_operands_roundregs:
1198 case mmix_operands_regs_z_opt:
1199 case mmix_operands_neg:
1200 case mmix_operands_regaddr:
1201 case mmix_operands_get:
1202 case mmix_operands_set:
1203 case mmix_operands_save:
1204 if (n_operands < 1
1205 || (exp[0].X_op == O_register && exp[0].X_add_number > 255))
1207 as_bad (_("invalid operands to opcode %s: `%s'"),
1208 instruction->name, operands);
1209 return;
1212 if (exp[0].X_op == O_register)
1213 opcodep[1] = exp[0].X_add_number;
1214 else
1215 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1,
1216 1, exp + 0, 0, BFD_RELOC_MMIX_REG);
1217 break;
1219 default:
1223 /* A corresponding once-over for those who take an 8-bit constant as
1224 their first operand. */
1225 switch (instruction->operands)
1227 case mmix_operands_pushgo:
1228 /* PUSHGO: X is a constant, but can be expressed as a register.
1229 We handle X here and use the common machinery of T,X,3,$ for
1230 the rest of the operands. */
1231 if (n_operands < 2
1232 || ((exp[0].X_op == O_constant || exp[0].X_op == O_register)
1233 && (exp[0].X_add_number > 255 || exp[0].X_add_number < 0)))
1235 as_bad (_("invalid operands to opcode %s: `%s'"),
1236 instruction->name, operands);
1237 return;
1239 else if (exp[0].X_op == O_constant || exp[0].X_op == O_register)
1240 opcodep[1] = exp[0].X_add_number;
1241 else
1242 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1,
1243 1, exp + 0, 0, BFD_RELOC_MMIX_REG_OR_BYTE);
1244 break;
1246 case mmix_operands_pop:
1247 if ((n_operands == 0 || n_operands == 1) && ! mmix_gnu_syntax)
1248 break;
1249 /* FALLTHROUGH. */
1250 case mmix_operands_x_regs_z:
1251 if (n_operands < 1
1252 || (exp[0].X_op == O_constant
1253 && (exp[0].X_add_number > 255
1254 || exp[0].X_add_number < 0)))
1256 as_bad (_("invalid operands to opcode %s: `%s'"),
1257 instruction->name, operands);
1258 return;
1261 if (exp[0].X_op == O_constant)
1262 opcodep[1] = exp[0].X_add_number;
1263 else
1264 /* FIXME: This doesn't bring us unsignedness checking. */
1265 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1,
1266 1, exp + 0, 0, BFD_RELOC_8);
1267 default:
1271 /* Handle the rest. */
1272 switch (instruction->operands)
1274 case mmix_operands_set:
1275 /* SET: Either two registers, "$X,$Y", with Z field as zero, or
1276 "$X,YZ", meaning change the opcode to SETL. */
1277 if (n_operands != 2
1278 || (exp[1].X_op == O_constant
1279 && (exp[1].X_add_number > 0xffff || exp[1].X_add_number < 0)))
1281 as_bad (_("invalid operands to opcode %s: `%s'"),
1282 instruction->name, operands);
1283 return;
1286 if (exp[1].X_op == O_constant)
1288 /* There's an ambiguity with "SET $0,Y" when Y isn't defined
1289 yet. To keep things simple, we assume that Y is then a
1290 register, and only change the opcode if Y is defined at this
1291 point.
1293 There's no compatibility problem with mmixal, since it emits
1294 errors if the field is not defined at this point. */
1295 md_number_to_chars (opcodep, SETL_INSN_BYTE, 1);
1297 opcodep[2] = (exp[1].X_add_number >> 8) & 255;
1298 opcodep[3] = exp[1].X_add_number & 255;
1299 break;
1301 /* FALLTHROUGH. */
1302 case mmix_operands_x_regs_z:
1303 /* SYNCD: "X,$Y,$Z|Z". */
1304 /* FALLTHROUGH. */
1305 case mmix_operands_regs:
1306 /* Three registers, $X,$Y,$Z. */
1307 /* FALLTHROUGH. */
1308 case mmix_operands_regs_z:
1309 /* Operands "$X,$Y,$Z|Z", number of arguments checked above. */
1310 /* FALLTHROUGH. */
1311 case mmix_operands_pushgo:
1312 /* Operands "$X|X,$Y,$Z|Z", optional Z. */
1313 /* FALLTHROUGH. */
1314 case mmix_operands_regs_z_opt:
1315 /* Operands "$X,$Y,$Z|Z", with $Z|Z being optional, default 0. Any
1316 operands not completely decided yet are postponed to later in
1317 assembly (but not until link-time yet). */
1319 if ((n_operands != 2 && n_operands != 3)
1320 || (exp[1].X_op == O_register && exp[1].X_add_number > 255)
1321 || (n_operands == 3
1322 && ((exp[2].X_op == O_register
1323 && exp[2].X_add_number > 255
1324 && mmix_gnu_syntax)
1325 || (exp[2].X_op == O_constant
1326 && (exp[2].X_add_number > 255
1327 || exp[2].X_add_number < 0)))))
1329 as_bad (_("invalid operands to opcode %s: `%s'"),
1330 instruction->name, operands);
1331 return;
1334 if (n_operands == 2)
1336 symbolS *sym;
1337 fixS *tmpfixP;
1339 /* The last operand is immediate whenever we see just two
1340 operands. */
1341 opcodep[0] |= IMM_OFFSET_BIT;
1343 /* Now, we could either have an implied "0" as the Z operand, or
1344 it could be the constant of a "base address plus offset". It
1345 depends on whether it is allowed; only memory operations, as
1346 signified by instruction->type and "T" and "X" operand types,
1347 and it depends on whether we find a register in the second
1348 operand, exp[1]. */
1349 if (exp[1].X_op == O_register && exp[1].X_add_number <= 255)
1351 /* A zero then; all done. */
1352 opcodep[2] = exp[1].X_add_number;
1353 break;
1356 /* Not known as a register. Is base address plus offset
1357 allowed, or can we assume that it is a register anyway? */
1358 if ((instruction->operands != mmix_operands_regs_z_opt
1359 && instruction->operands != mmix_operands_x_regs_z
1360 && instruction->operands != mmix_operands_pushgo)
1361 || (instruction->type != mmix_type_memaccess_octa
1362 && instruction->type != mmix_type_memaccess_tetra
1363 && instruction->type != mmix_type_memaccess_wyde
1364 && instruction->type != mmix_type_memaccess_byte
1365 && instruction->type != mmix_type_memaccess_block
1366 && instruction->type != mmix_type_jsr
1367 && instruction->type != mmix_type_branch))
1369 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
1370 1, exp + 1, 0, BFD_RELOC_MMIX_REG);
1371 break;
1374 /* To avoid getting a NULL add_symbol for constants and then
1375 catching a SEGV in write_relocs since it doesn't handle
1376 constants well for relocs other than PC-relative, we need to
1377 pass expressions as symbols and use fix_new, not fix_new_exp. */
1378 sym = make_expr_symbol (exp + 1);
1380 /* Mark the symbol as being OK for a reloc. */
1381 symbol_get_bfdsym (sym)->flags |= BSF_KEEP;
1383 /* Now we know it can be a "base address plus offset". Add
1384 proper fixup types so we can handle this later, when we've
1385 parsed everything. */
1386 tmpfixP
1387 = fix_new (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
1388 1, sym, 0, 0, BFD_RELOC_MMIX_BASE_PLUS_OFFSET);
1389 /* This is a non-trivial fixup: the ->fx_offset will not
1390 reflect the stored value, so the generic overflow test
1391 doesn't apply. */
1392 tmpfixP->fx_no_overflow = 1;
1393 break;
1396 if (exp[1].X_op == O_register)
1397 opcodep[2] = exp[1].X_add_number;
1398 else
1399 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
1400 1, exp + 1, 0, BFD_RELOC_MMIX_REG);
1402 /* In mmixal compatibility mode, we allow special registers as
1403 constants for the Z operand. They have 256 added to their
1404 register numbers, so the right thing will happen if we just treat
1405 those as constants. */
1406 if (exp[2].X_op == O_register && exp[2].X_add_number <= 255)
1407 opcodep[3] = exp[2].X_add_number;
1408 else if (exp[2].X_op == O_constant
1409 || (exp[2].X_op == O_register && exp[2].X_add_number > 255))
1411 opcodep[3] = exp[2].X_add_number;
1412 opcodep[0] |= IMM_OFFSET_BIT;
1414 else
1415 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3,
1416 1, exp + 2, 0,
1417 (instruction->operands == mmix_operands_set
1418 || instruction->operands == mmix_operands_regs)
1419 ? BFD_RELOC_MMIX_REG : BFD_RELOC_MMIX_REG_OR_BYTE);
1420 break;
1422 case mmix_operands_pop:
1423 /* POP, one eight and one 16-bit operand. */
1424 if (n_operands == 0 && ! mmix_gnu_syntax)
1425 break;
1426 if (n_operands == 1 && ! mmix_gnu_syntax)
1427 goto a_single_24_bit_number_operand;
1428 /* FALLTHROUGH. */
1429 case mmix_operands_reg_yz:
1430 /* A register and a 16-bit unsigned number. */
1431 if (n_operands != 2
1432 || exp[1].X_op == O_register
1433 || (exp[1].X_op == O_constant
1434 && (exp[1].X_add_number > 0xffff || exp[1].X_add_number < 0)))
1436 as_bad (_("invalid operands to opcode %s: `%s'"),
1437 instruction->name, operands);
1438 return;
1441 if (exp[1].X_op == O_constant)
1443 opcodep[2] = (exp[1].X_add_number >> 8) & 255;
1444 opcodep[3] = exp[1].X_add_number & 255;
1446 else
1447 /* FIXME: This doesn't bring us unsignedness checking. */
1448 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
1449 2, exp + 1, 0, BFD_RELOC_16);
1450 break;
1452 case mmix_operands_jmp:
1453 /* A JMP. Everything is already done. */
1454 break;
1456 case mmix_operands_roundregs:
1457 /* Two registers with optional rounding mode or constant in between. */
1458 if ((n_operands == 3 && exp[2].X_op == O_constant)
1459 || (n_operands == 2 && exp[1].X_op == O_constant))
1461 as_bad (_("invalid operands to opcode %s: `%s'"),
1462 instruction->name, operands);
1463 return;
1465 /* FALLTHROUGH. */
1466 case mmix_operands_roundregs_z:
1467 /* Like FLOT, "$X,ROUND_MODE,$Z|Z", but the rounding mode is
1468 optional and can be the corresponding constant. */
1470 /* Which exp index holds the second operand (not the rounding
1471 mode). */
1472 int op2no = n_operands - 1;
1474 if ((n_operands != 2 && n_operands != 3)
1475 || ((exp[op2no].X_op == O_register
1476 && exp[op2no].X_add_number > 255)
1477 || (exp[op2no].X_op == O_constant
1478 && (exp[op2no].X_add_number > 255
1479 || exp[op2no].X_add_number < 0)))
1480 || (n_operands == 3
1481 /* We don't allow for the rounding mode to be deferred; it
1482 must be determined in the "first pass". It cannot be a
1483 symbol equated to a rounding mode, but defined after
1484 the first use. */
1485 && ((exp[1].X_op == O_register
1486 && exp[1].X_add_number < 512)
1487 || (exp[1].X_op == O_constant
1488 && (exp[1].X_add_number < 0
1489 || exp[1].X_add_number > 4))
1490 || (exp[1].X_op != O_register
1491 && exp[1].X_op != O_constant))))
1493 as_bad (_("invalid operands to opcode %s: `%s'"),
1494 instruction->name, operands);
1495 return;
1498 /* Add rounding mode if present. */
1499 if (n_operands == 3)
1500 opcodep[2] = exp[1].X_add_number & 255;
1502 if (exp[op2no].X_op == O_register)
1503 opcodep[3] = exp[op2no].X_add_number;
1504 else if (exp[op2no].X_op == O_constant)
1506 opcodep[3] = exp[op2no].X_add_number;
1507 opcodep[0] |= IMM_OFFSET_BIT;
1509 else
1510 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3,
1511 1, exp + op2no, 0,
1512 instruction->operands == mmix_operands_roundregs
1513 ? BFD_RELOC_MMIX_REG
1514 : BFD_RELOC_MMIX_REG_OR_BYTE);
1515 break;
1518 case mmix_operands_sync:
1519 a_single_24_bit_number_operand:
1520 if (n_operands != 1
1521 || exp[0].X_op == O_register
1522 || (exp[0].X_op == O_constant
1523 && (exp[0].X_add_number > 0xffffff || exp[0].X_add_number < 0)))
1525 as_bad (_("invalid operands to opcode %s: `%s'"),
1526 instruction->name, operands);
1527 return;
1530 if (exp[0].X_op == O_constant)
1532 opcodep[1] = (exp[0].X_add_number >> 16) & 255;
1533 opcodep[2] = (exp[0].X_add_number >> 8) & 255;
1534 opcodep[3] = exp[0].X_add_number & 255;
1536 else
1537 /* FIXME: This doesn't bring us unsignedness checking. */
1538 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1,
1539 3, exp + 0, 0, BFD_RELOC_24);
1540 break;
1542 case mmix_operands_neg:
1543 /* Operands "$X,Y,$Z|Z"; NEG or NEGU. Y is optional, 0 is default. */
1545 if ((n_operands != 3 && n_operands != 2)
1546 || (n_operands == 3 && exp[1].X_op == O_register)
1547 || ((exp[1].X_op == O_constant || exp[1].X_op == O_register)
1548 && (exp[1].X_add_number > 255 || exp[1].X_add_number < 0))
1549 || (n_operands == 3
1550 && ((exp[2].X_op == O_register && exp[2].X_add_number > 255)
1551 || (exp[2].X_op == O_constant
1552 && (exp[2].X_add_number > 255
1553 || exp[2].X_add_number < 0)))))
1555 as_bad (_("invalid operands to opcode %s: `%s'"),
1556 instruction->name, operands);
1557 return;
1560 if (n_operands == 2)
1562 if (exp[1].X_op == O_register)
1563 opcodep[3] = exp[1].X_add_number;
1564 else if (exp[1].X_op == O_constant)
1566 opcodep[3] = exp[1].X_add_number;
1567 opcodep[0] |= IMM_OFFSET_BIT;
1569 else
1570 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3,
1571 1, exp + 1, 0, BFD_RELOC_MMIX_REG_OR_BYTE);
1572 break;
1575 if (exp[1].X_op == O_constant)
1576 opcodep[2] = exp[1].X_add_number;
1577 else
1578 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
1579 1, exp + 1, 0, BFD_RELOC_8);
1581 if (exp[2].X_op == O_register)
1582 opcodep[3] = exp[2].X_add_number;
1583 else if (exp[2].X_op == O_constant)
1585 opcodep[3] = exp[2].X_add_number;
1586 opcodep[0] |= IMM_OFFSET_BIT;
1588 else
1589 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3,
1590 1, exp + 2, 0, BFD_RELOC_MMIX_REG_OR_BYTE);
1591 break;
1593 case mmix_operands_regaddr:
1594 /* A GETA/branch-type. */
1595 break;
1597 case mmix_operands_get:
1598 /* "$X,spec_reg"; GET.
1599 Like with rounding modes, we demand that the special register or
1600 symbol is already defined when we get here at the point of use. */
1601 if (n_operands != 2
1602 || (exp[1].X_op == O_register
1603 && (exp[1].X_add_number < 256 || exp[1].X_add_number >= 512))
1604 || (exp[1].X_op == O_constant
1605 && (exp[1].X_add_number < 0 || exp[1].X_add_number > 256))
1606 || (exp[1].X_op != O_constant && exp[1].X_op != O_register))
1608 as_bad (_("invalid operands to opcode %s: `%s'"),
1609 instruction->name, operands);
1610 return;
1613 opcodep[3] = exp[1].X_add_number - 256;
1614 break;
1616 case mmix_operands_put:
1617 /* "spec_reg,$Z|Z"; PUT. */
1618 if (n_operands != 2
1619 || (exp[0].X_op == O_register
1620 && (exp[0].X_add_number < 256 || exp[0].X_add_number >= 512))
1621 || (exp[0].X_op == O_constant
1622 && (exp[0].X_add_number < 0 || exp[0].X_add_number > 256))
1623 || (exp[0].X_op != O_constant && exp[0].X_op != O_register))
1625 as_bad (_("invalid operands to opcode %s: `%s'"),
1626 instruction->name, operands);
1627 return;
1630 opcodep[1] = exp[0].X_add_number - 256;
1632 /* Note that the Y field is zero. */
1634 if (exp[1].X_op == O_register)
1635 opcodep[3] = exp[1].X_add_number;
1636 else if (exp[1].X_op == O_constant)
1638 opcodep[3] = exp[1].X_add_number;
1639 opcodep[0] |= IMM_OFFSET_BIT;
1641 else
1642 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3,
1643 1, exp + 1, 0, BFD_RELOC_MMIX_REG_OR_BYTE);
1644 break;
1646 case mmix_operands_save:
1647 /* "$X,0"; SAVE. */
1648 if (n_operands != 2
1649 || exp[1].X_op != O_constant
1650 || exp[1].X_add_number != 0)
1652 as_bad (_("invalid operands to opcode %s: `%s'"),
1653 instruction->name, operands);
1654 return;
1656 break;
1658 case mmix_operands_unsave:
1659 if (n_operands < 2 && ! mmix_gnu_syntax)
1661 if (n_operands == 1)
1663 if (exp[0].X_op == O_register)
1664 opcodep[3] = exp[0].X_add_number;
1665 else
1666 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3,
1667 1, exp, 0, BFD_RELOC_MMIX_REG);
1669 break;
1672 /* "0,$Z"; UNSAVE. */
1673 if (n_operands != 2
1674 || exp[0].X_op != O_constant
1675 || exp[0].X_add_number != 0
1676 || exp[1].X_op == O_constant
1677 || (exp[1].X_op == O_register
1678 && exp[1].X_add_number > 255))
1680 as_bad (_("invalid operands to opcode %s: `%s'"),
1681 instruction->name, operands);
1682 return;
1685 if (exp[1].X_op == O_register)
1686 opcodep[3] = exp[1].X_add_number;
1687 else
1688 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3,
1689 1, exp + 1, 0, BFD_RELOC_MMIX_REG);
1690 break;
1692 case mmix_operands_xyz_opt:
1693 /* SWYM, TRIP, TRAP: zero, one, two or three operands. It's
1694 unspecified whether operands are registers or constants, but
1695 when we find register syntax, we require operands to be literal and
1696 within 0..255. */
1697 if (n_operands == 0 && ! mmix_gnu_syntax)
1698 /* Zeros are in place - nothing needs to be done for zero
1699 operands. We don't allow this in GNU syntax mode, because it
1700 was believed that the risk of missing to supply an operand is
1701 higher than the benefit of not having to specify a zero. */
1703 else if (n_operands == 1 && exp[0].X_op != O_register)
1705 if (exp[0].X_op == O_constant)
1707 if (exp[0].X_add_number > 255*256*256
1708 || exp[0].X_add_number < 0)
1710 as_bad (_("invalid operands to opcode %s: `%s'"),
1711 instruction->name, operands);
1712 return;
1714 else
1716 opcodep[1] = (exp[0].X_add_number >> 16) & 255;
1717 opcodep[2] = (exp[0].X_add_number >> 8) & 255;
1718 opcodep[3] = exp[0].X_add_number & 255;
1721 else
1722 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1,
1723 3, exp, 0, BFD_RELOC_24);
1725 else if (n_operands == 2
1726 && exp[0].X_op != O_register
1727 && exp[1].X_op != O_register)
1729 /* Two operands. */
1731 if (exp[0].X_op == O_constant)
1733 if (exp[0].X_add_number > 255
1734 || exp[0].X_add_number < 0)
1736 as_bad (_("invalid operands to opcode %s: `%s'"),
1737 instruction->name, operands);
1738 return;
1740 else
1741 opcodep[1] = exp[0].X_add_number & 255;
1743 else
1744 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1,
1745 1, exp, 0, BFD_RELOC_8);
1747 if (exp[1].X_op == O_constant)
1749 if (exp[1].X_add_number > 255*256
1750 || exp[1].X_add_number < 0)
1752 as_bad (_("invalid operands to opcode %s: `%s'"),
1753 instruction->name, operands);
1754 return;
1756 else
1758 opcodep[2] = (exp[1].X_add_number >> 8) & 255;
1759 opcodep[3] = exp[1].X_add_number & 255;
1762 else
1763 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
1764 2, exp + 1, 0, BFD_RELOC_16);
1766 else if (n_operands == 3
1767 && exp[0].X_op != O_register
1768 && exp[1].X_op != O_register
1769 && exp[2].X_op != O_register)
1771 /* Three operands. */
1773 if (exp[0].X_op == O_constant)
1775 if (exp[0].X_add_number > 255
1776 || exp[0].X_add_number < 0)
1778 as_bad (_("invalid operands to opcode %s: `%s'"),
1779 instruction->name, operands);
1780 return;
1782 else
1783 opcodep[1] = exp[0].X_add_number & 255;
1785 else
1786 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1,
1787 1, exp, 0, BFD_RELOC_8);
1789 if (exp[1].X_op == O_constant)
1791 if (exp[1].X_add_number > 255
1792 || exp[1].X_add_number < 0)
1794 as_bad (_("invalid operands to opcode %s: `%s'"),
1795 instruction->name, operands);
1796 return;
1798 else
1799 opcodep[2] = exp[1].X_add_number & 255;
1801 else
1802 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
1803 1, exp + 1, 0, BFD_RELOC_8);
1805 if (exp[2].X_op == O_constant)
1807 if (exp[2].X_add_number > 255
1808 || exp[2].X_add_number < 0)
1810 as_bad (_("invalid operands to opcode %s: `%s'"),
1811 instruction->name, operands);
1812 return;
1814 else
1815 opcodep[3] = exp[2].X_add_number & 255;
1817 else
1818 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3,
1819 1, exp + 2, 0, BFD_RELOC_8);
1821 else
1823 /* We can't get here for other cases. */
1824 gas_assert (n_operands <= 3);
1826 /* The meaning of operands to TRIP and TRAP is not defined (and
1827 SWYM operands aren't enforced in mmixal, so let's avoid
1828 that). We add combinations not handled above here as we find
1829 them and as they're reported. */
1830 if (n_operands == 3)
1832 /* Don't require non-register operands. Always generate
1833 fixups, so we don't have to copy lots of code and create
1834 maintenance problems. TRIP is supposed to be a rare
1835 instruction, so the overhead should not matter. We
1836 aren't allowed to fix_new_exp for an expression which is
1837 an O_register at this point, however.
1839 Don't use BFD_RELOC_MMIX_REG_OR_BYTE as that modifies
1840 the insn for a register in the Z field and we want
1841 consistency. */
1842 if (exp[0].X_op == O_register)
1843 opcodep[1] = exp[0].X_add_number;
1844 else
1845 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1,
1846 1, exp, 0, BFD_RELOC_8);
1847 if (exp[1].X_op == O_register)
1848 opcodep[2] = exp[1].X_add_number;
1849 else
1850 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
1851 1, exp + 1, 0, BFD_RELOC_8);
1852 if (exp[2].X_op == O_register)
1853 opcodep[3] = exp[2].X_add_number;
1854 else
1855 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3,
1856 1, exp + 2, 0, BFD_RELOC_8);
1858 else if (n_operands == 2)
1860 if (exp[0].X_op == O_register)
1861 opcodep[1] = exp[0].X_add_number;
1862 else
1863 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1,
1864 1, exp, 0, BFD_RELOC_8);
1865 if (exp[1].X_op == O_register)
1866 opcodep[3] = exp[1].X_add_number;
1867 else
1868 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
1869 2, exp + 1, 0, BFD_RELOC_16);
1871 else
1873 /* We can't get here for other cases. */
1874 gas_assert (n_operands == 1 && exp[0].X_op == O_register);
1876 opcodep[3] = exp[0].X_add_number;
1879 break;
1881 case mmix_operands_resume:
1882 if (n_operands == 0 && ! mmix_gnu_syntax)
1883 break;
1885 if (n_operands != 1
1886 || exp[0].X_op == O_register
1887 || (exp[0].X_op == O_constant
1888 && (exp[0].X_add_number < 0
1889 || exp[0].X_add_number > 255)))
1891 as_bad (_("invalid operands to opcode %s: `%s'"),
1892 instruction->name, operands);
1893 return;
1896 if (exp[0].X_op == O_constant)
1897 opcodep[3] = exp[0].X_add_number;
1898 else
1899 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3,
1900 1, exp + 0, 0, BFD_RELOC_8);
1901 break;
1903 case mmix_operands_pushj:
1904 /* All is done for PUSHJ already. */
1905 break;
1907 default:
1908 BAD_CASE (instruction->operands);
1912 /* For the benefit of insns that start with a digit, we assemble by way of
1913 tc_unrecognized_line too, through this function. */
1916 mmix_assemble_return_nonzero (char *str)
1918 int last_error_count = had_errors ();
1919 char *s2 = str;
1920 char c;
1922 /* Normal instruction handling downcases, so we must too. */
1923 while (ISALNUM (*s2))
1925 if (ISUPPER ((unsigned char) *s2))
1926 *s2 = TOLOWER (*s2);
1927 s2++;
1930 /* Cut the line for sake of the assembly. */
1931 for (s2 = str; *s2 && *s2 != '\n'; s2++)
1934 c = *s2;
1935 *s2 = 0;
1936 md_assemble (str);
1937 *s2 = c;
1939 return had_errors () == last_error_count;
1942 /* The PREFIX pseudo. */
1944 static void
1945 s_prefix (int unused ATTRIBUTE_UNUSED)
1947 char *p;
1948 int c;
1950 SKIP_WHITESPACE ();
1952 c = get_symbol_name (&p);
1954 /* Resetting prefix? */
1955 if (*p == ':' && p[1] == 0)
1956 mmix_current_prefix = NULL;
1957 else
1959 /* Put this prefix on the mmix symbols obstack. We could malloc and
1960 free it separately, but then we'd have to worry about that.
1961 People using up memory on prefixes have other problems. */
1962 obstack_grow (&mmix_sym_obstack, p, strlen (p) + 1);
1963 p = obstack_finish (&mmix_sym_obstack);
1965 /* Accumulate prefixes, and strip a leading ':'. */
1966 if (mmix_current_prefix != NULL || *p == ':')
1967 p = mmix_prefix_name (p);
1969 mmix_current_prefix = p;
1972 (void) restore_line_pointer (c);
1974 mmix_handle_rest_of_empty_line ();
1977 /* We implement prefixes by using the tc_canonicalize_symbol_name hook,
1978 and store each prefixed name on a (separate) obstack. This means that
1979 the name is on the "notes" obstack in non-prefixed form and on the
1980 mmix_sym_obstack in prefixed form, but currently it is not worth
1981 rewriting the whole GAS symbol handling to improve "hooking" to avoid
1982 that. (It might be worth a rewrite for other reasons, though). */
1984 char *
1985 mmix_prefix_name (char *shortname)
1987 if (*shortname == ':')
1988 return shortname + 1;
1990 if (mmix_current_prefix == NULL)
1991 as_fatal (_("internal: mmix_prefix_name but empty prefix"));
1993 if (*shortname == '$')
1994 return shortname;
1996 obstack_grow (&mmix_sym_obstack, mmix_current_prefix,
1997 strlen (mmix_current_prefix));
1998 obstack_grow (&mmix_sym_obstack, shortname, strlen (shortname) + 1);
1999 return obstack_finish (&mmix_sym_obstack);
2002 /* The GREG pseudo. At LABEL, we have the name of a symbol that we
2003 want to make a register symbol, and which should be initialized with
2004 the value in the expression at INPUT_LINE_POINTER (defaulting to 0).
2005 Either and (perhaps less meaningful) both may be missing. LABEL must
2006 be persistent, perhaps allocated on an obstack. */
2008 static void
2009 mmix_greg_internal (char *label)
2011 expressionS *expP = &mmix_raw_gregs[n_of_raw_gregs].exp;
2012 segT section;
2014 /* Don't set the section to register contents section before the
2015 expression has been parsed; it may refer to the current position. */
2016 section = expression (expP);
2018 /* FIXME: Check that no expression refers to the register contents
2019 section. May need to be done in elf64-mmix.c. */
2020 if (expP->X_op == O_absent)
2022 /* Default to zero if the expression was absent. */
2023 expP->X_op = O_constant;
2024 expP->X_add_number = 0;
2025 expP->X_unsigned = 0;
2026 expP->X_add_symbol = NULL;
2027 expP->X_op_symbol = NULL;
2030 if (section == undefined_section)
2032 /* This is an error or a LOC with an expression involving
2033 forward references. For the expression to be correctly
2034 evaluated, we need to force a proper symbol; gas loses track
2035 of the segment for "local symbols". */
2036 if (expP->X_op == O_add)
2038 symbol_get_value_expression (expP->X_op_symbol);
2039 symbol_get_value_expression (expP->X_add_symbol);
2041 else
2043 gas_assert (expP->X_op == O_symbol);
2044 symbol_get_value_expression (expP->X_add_symbol);
2048 /* We must handle prefixes here, as we save the labels and expressions
2049 to be output later. */
2050 mmix_raw_gregs[n_of_raw_gregs].label
2051 = mmix_current_prefix == NULL ? label : mmix_prefix_name (label);
2053 if (n_of_raw_gregs == MAX_GREGS - 1)
2054 as_bad (_("too many GREG registers allocated (max %d)"), MAX_GREGS);
2055 else
2056 n_of_raw_gregs++;
2058 mmix_handle_rest_of_empty_line ();
2061 /* The ".greg label,expr" worker. */
2063 static void
2064 s_greg (int unused ATTRIBUTE_UNUSED)
2066 char *p;
2067 char c;
2069 /* This will skip over what can be a symbol and zero out the next
2070 character, which we assume is a ',' or other meaningful delimiter.
2071 What comes after that is the initializer expression for the
2072 register. */
2073 c = get_symbol_name (&p);
2075 if (c == '"')
2076 c = * ++ input_line_pointer;
2078 if (! is_end_of_line[(unsigned char) c])
2079 input_line_pointer++;
2081 if (*p)
2083 /* The label must be persistent; it's not used until after all input
2084 has been seen. */
2085 obstack_grow (&mmix_sym_obstack, p, strlen (p) + 1);
2086 mmix_greg_internal (obstack_finish (&mmix_sym_obstack));
2088 else
2089 mmix_greg_internal (NULL);
2092 /* The "BSPEC expr" worker. */
2094 static void
2095 s_bspec (int unused ATTRIBUTE_UNUSED)
2097 asection *expsec;
2098 asection *sec;
2099 char secname[sizeof (MMIX_OTHER_SPEC_SECTION_PREFIX) + 20]
2100 = MMIX_OTHER_SPEC_SECTION_PREFIX;
2101 expressionS exp;
2102 int n;
2104 /* Get a constant expression which we can evaluate *now*. Supporting
2105 more complex (though assembly-time computable) expressions is
2106 feasible but Too Much Work for something of unknown usefulness like
2107 BSPEC-ESPEC. */
2108 expsec = expression (&exp);
2109 mmix_handle_rest_of_empty_line ();
2111 /* Check that we don't have another BSPEC in progress. */
2112 if (doing_bspec)
2114 as_bad (_("BSPEC already active. Nesting is not supported."));
2115 return;
2118 if (exp.X_op != O_constant
2119 || expsec != absolute_section
2120 || exp.X_add_number < 0
2121 || exp.X_add_number > 65535)
2123 as_bad (_("invalid BSPEC expression"));
2124 exp.X_add_number = 0;
2127 n = (int) exp.X_add_number;
2129 sprintf (secname + strlen (MMIX_OTHER_SPEC_SECTION_PREFIX), "%d", n);
2130 sec = bfd_get_section_by_name (stdoutput, secname);
2131 if (sec == NULL)
2133 /* We need a non-volatile name as it will be stored in the section
2134 struct. */
2135 char *newsecname = xstrdup (secname);
2136 sec = bfd_make_section (stdoutput, newsecname);
2138 if (sec == NULL)
2139 as_fatal (_("can't create section %s"), newsecname);
2141 if (!bfd_set_section_flags (sec,
2142 bfd_section_flags (sec) | SEC_READONLY))
2143 as_fatal (_("can't set section flags for section %s"), newsecname);
2146 /* Tell ELF about the pending section change. */
2147 obj_elf_section_change_hook ();
2148 subseg_set (sec, 0);
2150 /* Save position for missing ESPEC. */
2151 bspec_file = as_where (&bspec_line);
2153 doing_bspec = 1;
2156 /* The "ESPEC" worker. */
2158 static void
2159 s_espec (int unused ATTRIBUTE_UNUSED)
2161 /* First, check that we *do* have a BSPEC in progress. */
2162 if (! doing_bspec)
2164 as_bad (_("ESPEC without preceding BSPEC"));
2165 return;
2168 mmix_handle_rest_of_empty_line ();
2169 doing_bspec = 0;
2171 /* When we told ELF about the section change in s_bspec, it stored the
2172 previous section for us so we can get at it with the equivalent of a
2173 .previous pseudo. */
2174 obj_elf_previous (0);
2177 /* The " .local expr" and " local expr" worker. We make a BFD_MMIX_LOCAL
2178 relocation against the current position against the expression.
2179 Implementing this by means of contents in a section lost. */
2181 static void
2182 mmix_s_local (int unused ATTRIBUTE_UNUSED)
2184 expressionS exp;
2186 /* Don't set the section to register contents section before the
2187 expression has been parsed; it may refer to the current position in
2188 some contorted way. */
2189 expression (&exp);
2191 if (exp.X_op == O_absent)
2193 as_bad (_("missing local expression"));
2194 return;
2196 else if (exp.X_op == O_register)
2198 /* fix_new_exp doesn't like O_register. Should be configurable.
2199 We're fine with a constant here, though. */
2200 exp.X_op = O_constant;
2203 fix_new_exp (frag_now, 0, 0, &exp, 0, BFD_RELOC_MMIX_LOCAL);
2204 mmix_handle_rest_of_empty_line ();
2207 /* Set fragP->fr_var to the initial guess of the size of a relaxable insn
2208 and return it. Sizes of other instructions are not known. This
2209 function may be called multiple times. */
2212 md_estimate_size_before_relax (fragS *fragP, segT segment)
2214 int length;
2216 #define HANDLE_RELAXABLE(state) \
2217 case ENCODE_RELAX (state, STATE_UNDF): \
2218 if (fragP->fr_symbol != NULL \
2219 && S_GET_SEGMENT (fragP->fr_symbol) == segment \
2220 && !S_IS_WEAK (fragP->fr_symbol)) \
2222 /* The symbol lies in the same segment - a relaxable case. */ \
2223 fragP->fr_subtype \
2224 = ENCODE_RELAX (state, STATE_ZERO); \
2226 break;
2228 switch (fragP->fr_subtype)
2230 HANDLE_RELAXABLE (STATE_GETA);
2231 HANDLE_RELAXABLE (STATE_BCC);
2232 HANDLE_RELAXABLE (STATE_JMP);
2234 case ENCODE_RELAX (STATE_PUSHJ, STATE_UNDF):
2235 if (fragP->fr_symbol != NULL
2236 && S_GET_SEGMENT (fragP->fr_symbol) == segment
2237 && !S_IS_WEAK (fragP->fr_symbol))
2238 /* The symbol lies in the same segment - a relaxable case. */
2239 fragP->fr_subtype = ENCODE_RELAX (STATE_PUSHJ, STATE_ZERO);
2240 else if (pushj_stubs)
2241 /* If we're to generate stubs, assume we can reach a stub after
2242 the section. */
2243 fragP->fr_subtype = ENCODE_RELAX (STATE_PUSHJSTUB, STATE_ZERO);
2244 /* FALLTHROUGH. */
2245 case ENCODE_RELAX (STATE_PUSHJ, STATE_ZERO):
2246 case ENCODE_RELAX (STATE_PUSHJSTUB, STATE_ZERO):
2247 /* We need to distinguish different relaxation rounds. */
2248 seg_info (segment)->tc_segment_info_data.last_stubfrag = fragP;
2249 break;
2251 case ENCODE_RELAX (STATE_GETA, STATE_ZERO):
2252 case ENCODE_RELAX (STATE_BCC, STATE_ZERO):
2253 case ENCODE_RELAX (STATE_JMP, STATE_ZERO):
2254 /* When relaxing a section for the second time, we don't need to do
2255 anything except making sure that fr_var is set right. */
2256 break;
2258 case STATE_GREG_DEF:
2259 length = fragP->tc_frag_data != NULL ? 0 : 8;
2260 fragP->fr_var = length;
2262 /* Don't consult the relax_table; it isn't valid for this
2263 relaxation. */
2264 return length;
2265 break;
2267 default:
2268 BAD_CASE (fragP->fr_subtype);
2271 length = mmix_relax_table[fragP->fr_subtype].rlx_length;
2272 fragP->fr_var = length;
2274 return length;
2277 /* Turn a string in input_line_pointer into a floating point constant of type
2278 type, and store the appropriate bytes in *litP. The number of LITTLENUMS
2279 emitted is stored in *sizeP . An error message is returned, or NULL on
2280 OK. */
2282 const char *
2283 md_atof (int type, char *litP, int *sizeP)
2285 if (type == 'r')
2286 type = 'f';
2287 /* FIXME: Having 'f' in FLT_CHARS (and here) makes it
2288 problematic to also have a forward reference in an expression.
2289 The testsuite wants it, and it's customary.
2290 We'll deal with the real problems when they come; we share the
2291 problem with most other ports. */
2292 return ieee_md_atof (type, litP, sizeP, true);
2295 /* Convert variable-sized frags into one or more fixups. */
2297 void
2298 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec ATTRIBUTE_UNUSED,
2299 fragS *fragP)
2301 /* Pointer to first byte in variable-sized part of the frag. */
2302 char *var_partp;
2304 /* Pointer to first opcode byte in frag. */
2305 char *opcodep;
2307 /* Size in bytes of variable-sized part of frag. */
2308 int var_part_size = 0;
2310 /* This is part of *fragP. It contains all information about addresses
2311 and offsets to varying parts. */
2312 symbolS *symbolP;
2313 unsigned long var_part_offset;
2315 /* This is the frag for the opcode. It, rather than fragP, must be used
2316 when emitting a frag for the opcode. */
2317 fragS *opc_fragP = fragP->tc_frag_data;
2318 fixS *tmpfixP;
2320 /* Where, in file space, does addr point? */
2321 bfd_vma target_address;
2322 bfd_vma opcode_address;
2324 know (fragP->fr_type == rs_machine_dependent);
2326 var_part_offset = fragP->fr_fix;
2327 var_partp = fragP->fr_literal + var_part_offset;
2328 opcodep = fragP->fr_opcode;
2330 symbolP = fragP->fr_symbol;
2332 target_address
2333 = ((symbolP ? S_GET_VALUE (symbolP) : 0) + fragP->fr_offset);
2335 /* The opcode that would be extended is the last four "fixed" bytes. */
2336 opcode_address = fragP->fr_address + fragP->fr_fix - 4;
2338 switch (fragP->fr_subtype)
2340 case ENCODE_RELAX (STATE_PUSHJSTUB, STATE_ZERO):
2341 /* Setting the unknown bits to 0 seems the most appropriate. */
2342 mmix_set_geta_branch_offset (opcodep, 0);
2343 tmpfixP = fix_new (opc_fragP, opcodep - opc_fragP->fr_literal, 4,
2344 fragP->fr_symbol, fragP->fr_offset, 1,
2345 BFD_RELOC_MMIX_PUSHJ_STUBBABLE);
2346 COPY_FR_WHERE_TO_FX (fragP, tmpfixP);
2347 var_part_size = 0;
2349 /* This is a non-trivial fixup; we'll be calling a generated
2350 stub, whose address fits into the fixup. The actual target,
2351 as reflected by the fixup value, is further away than fits
2352 into the fixup, so the generic overflow test doesn't
2353 apply. */
2354 tmpfixP->fx_no_overflow = 1;
2355 break;
2357 case ENCODE_RELAX (STATE_GETA, STATE_ZERO):
2358 case ENCODE_RELAX (STATE_BCC, STATE_ZERO):
2359 case ENCODE_RELAX (STATE_PUSHJ, STATE_ZERO):
2360 mmix_set_geta_branch_offset (opcodep, target_address - opcode_address);
2361 if (linkrelax)
2363 tmpfixP
2364 = fix_new (opc_fragP, opcodep - opc_fragP->fr_literal, 4,
2365 fragP->fr_symbol, fragP->fr_offset, 1,
2366 BFD_RELOC_MMIX_ADDR19);
2367 COPY_FR_WHERE_TO_FX (fragP, tmpfixP);
2369 var_part_size = 0;
2370 break;
2372 case ENCODE_RELAX (STATE_JMP, STATE_ZERO):
2373 mmix_set_jmp_offset (opcodep, target_address - opcode_address);
2374 if (linkrelax)
2376 tmpfixP
2377 = fix_new (opc_fragP, opcodep - opc_fragP->fr_literal, 4,
2378 fragP->fr_symbol, fragP->fr_offset, 1,
2379 BFD_RELOC_MMIX_ADDR27);
2380 COPY_FR_WHERE_TO_FX (fragP, tmpfixP);
2382 var_part_size = 0;
2383 break;
2385 case STATE_GREG_DEF:
2386 if (fragP->tc_frag_data == NULL)
2388 /* We must initialize data that's supposed to be "fixed up" to
2389 avoid emitting garbage, because md_apply_fix won't do
2390 anything for undefined symbols. */
2391 md_number_to_chars (var_partp, 0, 8);
2392 tmpfixP
2393 = fix_new (fragP, var_partp - fragP->fr_literal, 8,
2394 fragP->fr_symbol, fragP->fr_offset, 0, BFD_RELOC_64);
2395 COPY_FR_WHERE_TO_FX (fragP, tmpfixP);
2396 mmix_gregs[n_of_cooked_gregs++] = tmpfixP;
2397 var_part_size = 8;
2399 else
2400 var_part_size = 0;
2401 break;
2403 #define HANDLE_MAX_RELOC(state, reloc) \
2404 case ENCODE_RELAX (state, STATE_MAX): \
2405 var_part_size \
2406 = mmix_relax_table[ENCODE_RELAX (state, STATE_MAX)].rlx_length; \
2407 mmix_fill_nops (var_partp, var_part_size / 4); \
2408 if (warn_on_expansion) \
2409 as_warn_where (fragP->fr_file, fragP->fr_line, \
2410 _("operand out of range, instruction expanded")); \
2411 tmpfixP = fix_new (fragP, var_partp - fragP->fr_literal - 4, 8, \
2412 fragP->fr_symbol, fragP->fr_offset, 1, reloc); \
2413 COPY_FR_WHERE_TO_FX (fragP, tmpfixP); \
2414 break
2416 HANDLE_MAX_RELOC (STATE_GETA, BFD_RELOC_MMIX_GETA);
2417 HANDLE_MAX_RELOC (STATE_BCC, BFD_RELOC_MMIX_CBRANCH);
2418 HANDLE_MAX_RELOC (STATE_PUSHJ, BFD_RELOC_MMIX_PUSHJ);
2419 HANDLE_MAX_RELOC (STATE_JMP, BFD_RELOC_MMIX_JMP);
2421 default:
2422 BAD_CASE (fragP->fr_subtype);
2423 break;
2426 fragP->fr_fix += var_part_size;
2427 fragP->fr_var = 0;
2430 /* Applies the desired value to the specified location.
2431 Also sets up addends for RELA type relocations.
2432 Stolen from tc-mcore.c.
2434 Note that this function isn't called when linkrelax != 0. */
2436 void
2437 md_apply_fix (fixS *fixP, valueT *valP, segT segment)
2439 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
2440 /* Note: use offsetT because it is signed, valueT is unsigned. */
2441 offsetT val = (offsetT) * valP;
2442 segT symsec
2443 = (fixP->fx_addsy == NULL
2444 ? absolute_section : S_GET_SEGMENT (fixP->fx_addsy));
2446 /* If the fix is relative to a symbol which is not defined, or, (if
2447 pcrel), not in the same segment as the fix, we cannot resolve it
2448 here. */
2449 if (fixP->fx_addsy != NULL
2450 && (! S_IS_DEFINED (fixP->fx_addsy)
2451 || S_IS_WEAK (fixP->fx_addsy)
2452 || (fixP->fx_pcrel && symsec != segment)
2453 || (! fixP->fx_pcrel
2454 && symsec != absolute_section
2455 && ((fixP->fx_r_type != BFD_RELOC_MMIX_REG
2456 && fixP->fx_r_type != BFD_RELOC_MMIX_REG_OR_BYTE)
2457 || symsec != reg_section))))
2459 fixP->fx_done = 0;
2460 return;
2462 else if (fixP->fx_r_type == BFD_RELOC_MMIX_LOCAL
2463 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2464 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2466 /* These are never "fixed". */
2467 fixP->fx_done = 0;
2468 return;
2470 else
2471 /* We assume every other relocation is "fixed". */
2472 fixP->fx_done = 1;
2474 switch (fixP->fx_r_type)
2476 case BFD_RELOC_64:
2477 case BFD_RELOC_32:
2478 case BFD_RELOC_24:
2479 case BFD_RELOC_16:
2480 case BFD_RELOC_8:
2481 case BFD_RELOC_64_PCREL:
2482 case BFD_RELOC_32_PCREL:
2483 case BFD_RELOC_24_PCREL:
2484 case BFD_RELOC_16_PCREL:
2485 case BFD_RELOC_8_PCREL:
2486 md_number_to_chars (buf, val, fixP->fx_size);
2487 break;
2489 case BFD_RELOC_MMIX_ADDR19:
2490 if (expand_op)
2492 /* This shouldn't happen. */
2493 BAD_CASE (fixP->fx_r_type);
2494 break;
2496 /* FALLTHROUGH. */
2497 case BFD_RELOC_MMIX_GETA:
2498 case BFD_RELOC_MMIX_CBRANCH:
2499 case BFD_RELOC_MMIX_PUSHJ:
2500 case BFD_RELOC_MMIX_PUSHJ_STUBBABLE:
2501 /* If this fixup is out of range, punt to the linker to emit an
2502 error. This should only happen with -no-expand. */
2503 if (val < -(((offsetT) 1 << 19)/2)
2504 || val >= ((offsetT) 1 << 19)/2 - 1
2505 || (val & 3) != 0)
2507 if (warn_on_expansion)
2508 as_warn_where (fixP->fx_file, fixP->fx_line,
2509 _("operand out of range"));
2510 fixP->fx_done = 0;
2511 val = 0;
2513 mmix_set_geta_branch_offset (buf, val);
2514 break;
2516 case BFD_RELOC_MMIX_ADDR27:
2517 if (expand_op)
2519 /* This shouldn't happen. */
2520 BAD_CASE (fixP->fx_r_type);
2521 break;
2523 /* FALLTHROUGH. */
2524 case BFD_RELOC_MMIX_JMP:
2525 /* If this fixup is out of range, punt to the linker to emit an
2526 error. This should only happen with -no-expand. */
2527 if (val < -(((offsetT) 1 << 27)/2)
2528 || val >= ((offsetT) 1 << 27)/2 - 1
2529 || (val & 3) != 0)
2531 if (warn_on_expansion)
2532 as_warn_where (fixP->fx_file, fixP->fx_line,
2533 _("operand out of range"));
2534 fixP->fx_done = 0;
2535 val = 0;
2537 mmix_set_jmp_offset (buf, val);
2538 break;
2540 case BFD_RELOC_MMIX_REG_OR_BYTE:
2541 if (fixP->fx_addsy != NULL
2542 && (S_GET_SEGMENT (fixP->fx_addsy) != reg_section
2543 || S_GET_VALUE (fixP->fx_addsy) > 255)
2544 && S_GET_SEGMENT (fixP->fx_addsy) != absolute_section)
2546 as_bad_where (fixP->fx_file, fixP->fx_line,
2547 _("invalid operands"));
2548 /* We don't want this "symbol" appearing in output, because
2549 that will fail. */
2550 fixP->fx_done = 1;
2553 buf[0] = val;
2555 /* If this reloc is for a Z field, we need to adjust
2556 the opcode if we got a constant here.
2557 FIXME: Can we make this more robust? */
2559 if ((fixP->fx_where & 3) == 3
2560 && (fixP->fx_addsy == NULL
2561 || S_GET_SEGMENT (fixP->fx_addsy) == absolute_section))
2562 buf[-3] |= IMM_OFFSET_BIT;
2563 break;
2565 case BFD_RELOC_MMIX_REG:
2566 if (fixP->fx_addsy == NULL
2567 || S_GET_SEGMENT (fixP->fx_addsy) != reg_section
2568 || S_GET_VALUE (fixP->fx_addsy) > 255)
2570 as_bad_where (fixP->fx_file, fixP->fx_line,
2571 _("invalid operands"));
2572 fixP->fx_done = 1;
2575 *buf = val;
2576 break;
2578 case BFD_RELOC_MMIX_BASE_PLUS_OFFSET:
2579 /* These are never "fixed". */
2580 fixP->fx_done = 0;
2581 return;
2583 case BFD_RELOC_MMIX_PUSHJ_1:
2584 case BFD_RELOC_MMIX_PUSHJ_2:
2585 case BFD_RELOC_MMIX_PUSHJ_3:
2586 case BFD_RELOC_MMIX_CBRANCH_J:
2587 case BFD_RELOC_MMIX_CBRANCH_1:
2588 case BFD_RELOC_MMIX_CBRANCH_2:
2589 case BFD_RELOC_MMIX_CBRANCH_3:
2590 case BFD_RELOC_MMIX_GETA_1:
2591 case BFD_RELOC_MMIX_GETA_2:
2592 case BFD_RELOC_MMIX_GETA_3:
2593 case BFD_RELOC_MMIX_JMP_1:
2594 case BFD_RELOC_MMIX_JMP_2:
2595 case BFD_RELOC_MMIX_JMP_3:
2596 default:
2597 BAD_CASE (fixP->fx_r_type);
2598 break;
2601 if (fixP->fx_done)
2602 /* Make sure that for completed fixups we have the value around for
2603 use by e.g. mmix_frob_file. */
2604 fixP->fx_offset = val;
2607 /* A bsearch function for looking up a value against offsets for GREG
2608 definitions. */
2610 static int
2611 cmp_greg_val_greg_symbol_fixes (const void *p1, const void *p2)
2613 offsetT val1 = *(offsetT *) p1;
2614 offsetT val2 = ((struct mmix_symbol_greg_fixes *) p2)->offs;
2616 if (val1 >= val2 && val1 < val2 + 255)
2617 return 0;
2619 if (val1 > val2)
2620 return 1;
2622 return -1;
2625 /* Generate a machine-dependent relocation. */
2627 arelent *
2628 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixP)
2630 bfd_signed_vma val
2631 = fixP->fx_offset
2632 + (fixP->fx_addsy != NULL
2633 && !S_IS_WEAK (fixP->fx_addsy)
2634 && !S_IS_COMMON (fixP->fx_addsy)
2635 ? S_GET_VALUE (fixP->fx_addsy) : 0);
2636 arelent *relP;
2637 bfd_reloc_code_real_type code = BFD_RELOC_NONE;
2638 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
2639 symbolS *addsy = fixP->fx_addsy;
2640 asection *addsec = addsy == NULL ? NULL : S_GET_SEGMENT (addsy);
2641 asymbol *baddsy = addsy != NULL ? symbol_get_bfdsym (addsy) : NULL;
2642 bfd_vma addend
2643 = val - (baddsy == NULL || S_IS_COMMON (addsy) || S_IS_WEAK (addsy)
2644 ? 0 : bfd_asymbol_value (baddsy));
2646 /* A single " LOCAL expression" in the wrong section will not work when
2647 linking to MMO; relocations for zero-content sections are then
2648 ignored. Normally, relocations would modify section contents, and
2649 you'd never think or be able to do something like that. The
2650 relocation resulting from a LOCAL directive doesn't have an obvious
2651 and mandatory location. I can't figure out a way to do this better
2652 than just helping the user around this limitation here; hopefully the
2653 code using the local expression is around. Putting the LOCAL
2654 semantics in a relocation still seems right; a section didn't do. */
2655 if (bfd_section_size (section) == 0)
2656 as_bad_where
2657 (fixP->fx_file, fixP->fx_line,
2658 fixP->fx_r_type == BFD_RELOC_MMIX_LOCAL
2659 /* The BFD_RELOC_MMIX_LOCAL-specific message is supposed to be
2660 user-friendly, though a little bit non-substantial. */
2661 ? _("directive LOCAL must be placed in code or data")
2662 : _("internal confusion: relocation in a section without contents"));
2664 /* FIXME: Range tests for all these. */
2665 switch (fixP->fx_r_type)
2667 case BFD_RELOC_64:
2668 case BFD_RELOC_32:
2669 case BFD_RELOC_24:
2670 case BFD_RELOC_16:
2671 case BFD_RELOC_8:
2672 code = fixP->fx_r_type;
2674 if (addsy == NULL || bfd_is_abs_section (addsec))
2676 /* Resolve this reloc now, as md_apply_fix would have done (not
2677 called if -linkrelax). There is no point in keeping a reloc
2678 to an absolute symbol. No reloc that is subject to
2679 relaxation must be to an absolute symbol; difference
2680 involving symbols in a specific section must be signalled as
2681 an error if the relaxing cannot be expressed; having a reloc
2682 to the resolved (now absolute) value does not help. */
2683 md_number_to_chars (buf, val, fixP->fx_size);
2684 return NULL;
2686 break;
2688 case BFD_RELOC_64_PCREL:
2689 case BFD_RELOC_32_PCREL:
2690 case BFD_RELOC_24_PCREL:
2691 case BFD_RELOC_16_PCREL:
2692 case BFD_RELOC_8_PCREL:
2693 case BFD_RELOC_MMIX_LOCAL:
2694 case BFD_RELOC_VTABLE_INHERIT:
2695 case BFD_RELOC_VTABLE_ENTRY:
2696 case BFD_RELOC_MMIX_GETA:
2697 case BFD_RELOC_MMIX_GETA_1:
2698 case BFD_RELOC_MMIX_GETA_2:
2699 case BFD_RELOC_MMIX_GETA_3:
2700 case BFD_RELOC_MMIX_CBRANCH:
2701 case BFD_RELOC_MMIX_CBRANCH_J:
2702 case BFD_RELOC_MMIX_CBRANCH_1:
2703 case BFD_RELOC_MMIX_CBRANCH_2:
2704 case BFD_RELOC_MMIX_CBRANCH_3:
2705 case BFD_RELOC_MMIX_PUSHJ:
2706 case BFD_RELOC_MMIX_PUSHJ_1:
2707 case BFD_RELOC_MMIX_PUSHJ_2:
2708 case BFD_RELOC_MMIX_PUSHJ_3:
2709 case BFD_RELOC_MMIX_PUSHJ_STUBBABLE:
2710 case BFD_RELOC_MMIX_JMP:
2711 case BFD_RELOC_MMIX_JMP_1:
2712 case BFD_RELOC_MMIX_JMP_2:
2713 case BFD_RELOC_MMIX_JMP_3:
2714 case BFD_RELOC_MMIX_ADDR19:
2715 case BFD_RELOC_MMIX_ADDR27:
2716 code = fixP->fx_r_type;
2717 break;
2719 case BFD_RELOC_MMIX_REG_OR_BYTE:
2720 /* If we have this kind of relocation to an unknown symbol or to the
2721 register contents section (that is, to a register), then we can't
2722 resolve the relocation here. */
2723 if (addsy != NULL
2724 && (bfd_is_und_section (addsec)
2725 || strcmp (bfd_section_name (addsec),
2726 MMIX_REG_CONTENTS_SECTION_NAME) == 0))
2728 code = fixP->fx_r_type;
2729 break;
2732 /* If the relocation is not to the register section or to the
2733 absolute section (a numeric value), then we have an error. */
2734 if (addsy != NULL
2735 && (S_GET_SEGMENT (addsy) != real_reg_section
2736 || val > 255
2737 || val < 0)
2738 && ! bfd_is_abs_section (addsec))
2739 goto badop;
2741 /* Set the "immediate" bit of the insn if this relocation is to Z
2742 field when the value is a numeric value, i.e. not a register. */
2743 if ((fixP->fx_where & 3) == 3
2744 && (addsy == NULL || bfd_is_abs_section (addsec)))
2745 buf[-3] |= IMM_OFFSET_BIT;
2747 buf[0] = val;
2748 return NULL;
2750 case BFD_RELOC_MMIX_BASE_PLUS_OFFSET:
2751 if (addsy != NULL
2752 && strcmp (bfd_section_name (addsec),
2753 MMIX_REG_CONTENTS_SECTION_NAME) == 0)
2755 /* This changed into a register; the relocation is for the
2756 register-contents section. The constant part remains zero. */
2757 code = BFD_RELOC_MMIX_REG;
2758 break;
2761 /* If we've found out that this was indeed a register, then replace
2762 with the register number. The constant part is already zero.
2764 If we encounter any other defined symbol, then we must find a
2765 suitable register and emit a reloc. */
2766 if (addsy == NULL || addsec != real_reg_section)
2768 struct mmix_symbol_gregs *gregs;
2769 struct mmix_symbol_greg_fixes *fix;
2771 if (S_IS_DEFINED (addsy)
2772 && !bfd_is_com_section (addsec)
2773 && !S_IS_WEAK (addsy))
2775 if (! symbol_section_p (addsy) && ! bfd_is_abs_section (addsec))
2776 as_fatal (_("internal: BFD_RELOC_MMIX_BASE_PLUS_OFFSET not resolved to section"));
2778 /* If this is an absolute symbol sufficiently near
2779 lowest_data_loc, then we canonicalize on the data
2780 section. Note that val is signed here; we may subtract
2781 lowest_data_loc which is unsigned. Careful with those
2782 comparisons. */
2783 if (lowest_data_loc != (bfd_vma) -1
2784 && (bfd_vma) val + 256 > lowest_data_loc
2785 && bfd_is_abs_section (addsec))
2787 val -= (offsetT) lowest_data_loc;
2788 addsy = section_symbol (data_section);
2790 /* Likewise text section. */
2791 else if (lowest_text_loc != (bfd_vma) -1
2792 && (bfd_vma) val + 256 > lowest_text_loc
2793 && bfd_is_abs_section (addsec))
2795 val -= (offsetT) lowest_text_loc;
2796 addsy = section_symbol (text_section);
2800 gregs = *symbol_get_tc (addsy);
2802 /* If that symbol does not have any associated GREG definitions,
2803 we can't do anything. */
2804 if (gregs == NULL
2805 || (fix = bsearch (&val, gregs->greg_fixes, gregs->n_gregs,
2806 sizeof (gregs->greg_fixes[0]),
2807 cmp_greg_val_greg_symbol_fixes)) == NULL
2808 /* The register must not point *after* the address we want. */
2809 || fix->offs > val
2810 /* Neither must the register point more than 255 bytes
2811 before the address we want. */
2812 || fix->offs + 255 < val)
2814 /* We can either let the linker allocate GREGs
2815 automatically, or emit an error. */
2816 if (allocate_undefined_gregs_in_linker)
2818 /* The values in baddsy and addend are right. */
2819 code = fixP->fx_r_type;
2820 break;
2822 else
2823 as_bad_where (fixP->fx_file, fixP->fx_line,
2824 _("no suitable GREG definition for operands"));
2825 return NULL;
2827 else
2829 /* Transform the base-plus-offset reloc for the actual area
2830 to a reloc for the register with the address of the area.
2831 Put addend for register in Z operand. */
2832 buf[1] = val - fix->offs;
2833 code = BFD_RELOC_MMIX_REG;
2834 baddsy
2835 = (bfd_get_section_by_name (stdoutput,
2836 MMIX_REG_CONTENTS_SECTION_NAME)
2837 ->symbol);
2839 addend = fix->fix->fx_frag->fr_address + fix->fix->fx_where;
2842 else if (S_GET_VALUE (addsy) > 255)
2843 as_bad_where (fixP->fx_file, fixP->fx_line,
2844 _("invalid operands"));
2845 else
2847 *buf = val;
2848 return NULL;
2850 break;
2852 case BFD_RELOC_MMIX_REG:
2853 if (addsy != NULL
2854 && (bfd_is_und_section (addsec)
2855 || strcmp (bfd_section_name (addsec),
2856 MMIX_REG_CONTENTS_SECTION_NAME) == 0))
2858 code = fixP->fx_r_type;
2859 break;
2862 if (addsy != NULL
2863 && (addsec != real_reg_section
2864 || val > 255
2865 || val < 0)
2866 && ! bfd_is_und_section (addsec))
2867 /* Drop through to error message. */
2869 else
2871 buf[0] = val;
2872 return NULL;
2874 /* FALLTHROUGH. */
2876 /* The others are supposed to be handled by md_apply_fix.
2877 FIXME: ... which isn't called when -linkrelax. Move over
2878 md_apply_fix code here for everything reasonable. */
2879 badop:
2880 default:
2881 as_bad_where
2882 (fixP->fx_file, fixP->fx_line,
2883 _("operands were not reducible at assembly-time"));
2885 /* Unmark this symbol as used in a reloc, so we don't bump into a BFD
2886 assert when trying to output reg_section. FIXME: A gas bug. */
2887 fixP->fx_addsy = NULL;
2888 return NULL;
2891 relP = XNEW (arelent);
2892 gas_assert (relP != 0);
2893 relP->sym_ptr_ptr = XNEW (asymbol *);
2894 *relP->sym_ptr_ptr = baddsy;
2895 relP->address = fixP->fx_frag->fr_address + fixP->fx_where;
2897 relP->addend = addend;
2899 /* If this had been a.out, we would have had a kludge for weak symbols
2900 here. */
2902 relP->howto = bfd_reloc_type_lookup (stdoutput, code);
2903 if (! relP->howto)
2905 const char *name;
2907 name = S_GET_NAME (addsy);
2908 if (name == NULL)
2909 name = _("<unknown>");
2910 as_fatal (_("cannot generate relocation type for symbol %s, code %s"),
2911 name, bfd_get_reloc_code_name (code));
2914 return relP;
2917 /* Do some reformatting of a line. FIXME: We could transform a mmixal
2918 line into traditional (GNU?) format, unless #NO_APP, and get rid of all
2919 ugly labels_without_colons etc. */
2921 void
2922 mmix_handle_mmixal (void)
2924 char *insn;
2925 char *s = input_line_pointer;
2926 char *label = NULL;
2927 char c;
2929 if (pending_label != NULL)
2930 as_fatal (_("internal: unhandled label %s"), pending_label);
2932 if (mmix_gnu_syntax)
2933 return;
2935 /* If we're on a line with a label, check if it's a mmixal fb-label.
2936 Save an indicator and skip the label; it must be set only after all
2937 fb-labels of expressions are evaluated. */
2938 if (ISDIGIT (s[0]) && s[1] == 'H' && ISSPACE (s[2]))
2940 current_fb_label = s[0] - '0';
2942 /* We have to skip the label, but also preserve the newlineness of
2943 the previous character, since the caller checks that. It's a
2944 mess we blame on the caller. */
2945 s[1] = s[-1];
2946 s += 2;
2947 input_line_pointer = s;
2949 while (*s && ISSPACE (*s) && ! is_end_of_line[(unsigned int) *s])
2950 s++;
2952 /* For errors emitted here, the book-keeping is off by one; the
2953 caller is about to bump the counters. Adjust the error messages. */
2954 if (is_end_of_line[(unsigned int) *s])
2956 unsigned int line;
2957 const char * name = as_where (&line);
2958 as_bad_where (name, line + 1,
2959 _("[0-9]H labels may not appear alone on a line"));
2960 current_fb_label = -1;
2962 if (*s == '.')
2964 unsigned int line;
2965 const char * name = as_where (&line);
2966 as_bad_where (name, line + 1,
2967 _("[0-9]H labels do not mix with dot-pseudos"));
2968 current_fb_label = -1;
2971 /* Back off to the last space before the opcode so we don't handle
2972 the opcode as a label. */
2973 s--;
2975 else
2976 current_fb_label = -1;
2978 if (*s == '.')
2980 /* If the first character is a '.', then it's a pseudodirective, not a
2981 label. Make GAS not handle label-without-colon on this line. We
2982 also don't do mmixal-specific stuff on this line. */
2983 label_without_colon_this_line = 0;
2984 return;
2987 if (*s == 0 || is_end_of_line[(unsigned int) *s])
2988 /* We avoid handling empty lines here. */
2989 return;
2991 if (is_name_beginner (*s))
2992 label = s;
2994 /* If there is a label, skip over it. */
2995 while (*s && is_part_of_name (*s))
2996 s++;
2998 /* Find the start of the instruction or pseudo following the label,
2999 if there is one. */
3000 for (insn = s;
3001 *insn && ISSPACE (*insn) && ! is_end_of_line[(unsigned int) *insn];
3002 insn++)
3003 /* Empty */
3006 /* Remove a trailing ":" off labels, as they'd otherwise be considered
3007 part of the name. But don't do this for local labels. */
3008 if (s != input_line_pointer && s[-1] == ':'
3009 && (s - 2 != input_line_pointer
3010 || ! ISDIGIT (s[-2])))
3011 s[-1] = ' ';
3012 else if (label != NULL
3013 /* For a lone label on a line, we don't attach it to the next
3014 instruction or MMIXAL-pseudo (getting its alignment). Thus
3015 is acts like a "normal" :-ended label. Ditto if it's
3016 followed by a non-MMIXAL pseudo. */
3017 && !is_end_of_line[(unsigned int) *insn]
3018 && *insn != '.')
3020 /* For labels that don't end in ":", we save it so we can later give
3021 it the same alignment and address as the associated instruction. */
3023 /* Make room for the label including the ending nul. */
3024 size_t len_0 = s - label + 1;
3026 /* Save this label on the MMIX symbol obstack. Saving it on an
3027 obstack is needless for "IS"-pseudos, but it's harmless and we
3028 avoid a little code-cluttering. */
3029 obstack_grow (&mmix_sym_obstack, label, len_0);
3030 pending_label = obstack_finish (&mmix_sym_obstack);
3031 pending_label[len_0 - 1] = 0;
3034 /* If we have a non-MMIXAL pseudo, we have not business with the rest of
3035 the line. */
3036 if (*insn == '.')
3037 return;
3039 /* Find local labels of operands. Look for "[0-9][FB]" where the
3040 characters before and after are not part of words. Break if a single
3041 or double quote is seen anywhere. It means we can't have local
3042 labels as part of list with mixed quoted and unquoted members for
3043 mmixal compatibility but we can't have it all. For the moment.
3044 Replace the '<N>B' or '<N>F' with MAGIC_FB_BACKWARD_CHAR<N> and
3045 MAGIC_FB_FORWARD_CHAR<N> respectively. */
3047 /* First make sure we don't have any of the magic characters on the line
3048 appearing as input. */
3049 while (*s)
3051 c = *s++;
3052 if (is_end_of_line[(unsigned int) c])
3053 break;
3054 if (c == MAGIC_FB_BACKWARD_CHAR || c == MAGIC_FB_FORWARD_CHAR)
3055 as_bad (_("invalid characters in input"));
3058 /* Scan again, this time looking for ';' after operands. */
3059 s = insn;
3061 /* Skip the insn. */
3062 while (*s
3063 && ! ISSPACE (*s)
3064 && *s != ';'
3065 && ! is_end_of_line[(unsigned int) *s])
3066 s++;
3068 /* Skip the spaces after the insn. */
3069 while (*s
3070 && ISSPACE (*s)
3071 && *s != ';'
3072 && ! is_end_of_line[(unsigned int) *s])
3073 s++;
3075 /* Skip the operands. While doing this, replace [0-9][BF] with
3076 (MAGIC_FB_BACKWARD_CHAR|MAGIC_FB_FORWARD_CHAR)[0-9]. */
3077 while ((c = *s) != 0
3078 && ! ISSPACE (c)
3079 && c != ';'
3080 && ! is_end_of_line[(unsigned int) c])
3082 if (c == '"')
3084 s++;
3086 /* FIXME: Test-case for semi-colon in string. */
3087 while (*s
3088 && *s != '"'
3089 && (! is_end_of_line[(unsigned int) *s] || *s == ';'))
3090 s++;
3092 if (*s == '"')
3093 s++;
3095 else if (ISDIGIT (c))
3097 if ((s[1] != 'B' && s[1] != 'F')
3098 || is_part_of_name (s[-1])
3099 || is_part_of_name (s[2])
3100 /* Don't treat e.g. #1F as a local-label reference. */
3101 || (s != input_line_pointer && s[-1] == '#'))
3102 s++;
3103 else
3105 s[0] = (s[1] == 'B'
3106 ? MAGIC_FB_BACKWARD_CHAR : MAGIC_FB_FORWARD_CHAR);
3107 s[1] = c;
3110 else
3111 s++;
3114 /* Skip any spaces after the operands. */
3115 while (*s
3116 && ISSPACE (*s)
3117 && *s != ';'
3118 && !is_end_of_line[(unsigned int) *s])
3119 s++;
3121 /* If we're now looking at a semi-colon, then it's an end-of-line
3122 delimiter. */
3123 mmix_next_semicolon_is_eoln = (*s == ';');
3125 /* Make IS into an EQU by replacing it with "= ". Only match upper-case
3126 though; let lower-case be a syntax error. */
3127 s = insn;
3128 if (s[0] == 'I' && s[1] == 'S' && ISSPACE (s[2]))
3130 *s = '=';
3131 s[1] = ' ';
3133 /* Since labels can start without ":", we have to handle "X IS 42"
3134 in full here, or "X" will be parsed as a label to be set at ".". */
3135 input_line_pointer = s;
3137 /* Right after this function ends, line numbers will be bumped if
3138 input_line_pointer[-1] = '\n'. We want accurate line numbers for
3139 the equals call, so we bump them before the call, and make sure
3140 they aren't bumped afterwards. */
3141 bump_line_counters ();
3143 /* A fb-label is valid as an IS-label. */
3144 if (current_fb_label >= 0)
3146 char *fb_name;
3148 /* We need to save this name on our symbol obstack, since the
3149 string we got in fb_label_name is volatile and will change
3150 with every call to fb_label_name, like those resulting from
3151 parsing the IS-operand. */
3152 fb_name = fb_label_name (current_fb_label, 1);
3153 obstack_grow (&mmix_sym_obstack, fb_name, strlen (fb_name) + 1);
3154 equals (obstack_finish (&mmix_sym_obstack), 0);
3155 fb_label_instance_inc (current_fb_label);
3156 current_fb_label = -1;
3158 else
3160 if (pending_label == NULL)
3161 as_bad (_("empty label field for IS"));
3162 else
3163 equals (pending_label, 0);
3164 pending_label = NULL;
3167 /* For mmixal, we can have comments without a comment-start
3168 character. */
3169 mmix_handle_rest_of_empty_line ();
3170 input_line_pointer--;
3172 input_line_pointer[-1] = ' ';
3174 else if (s[0] == 'G'
3175 && s[1] == 'R'
3176 && startswith (s, "GREG")
3177 && (ISSPACE (s[4]) || is_end_of_line[(unsigned char) s[4]]))
3179 input_line_pointer = s + 4;
3181 /* Right after this function ends, line numbers will be bumped if
3182 input_line_pointer[-1] = '\n'. We want accurate line numbers for
3183 the s_greg call, so we bump them before the call, and make sure
3184 they aren't bumped afterwards. */
3185 bump_line_counters ();
3187 /* A fb-label is valid as a GREG-label. */
3188 if (current_fb_label >= 0)
3190 char *fb_name;
3192 /* We need to save this name on our symbol obstack, since the
3193 string we got in fb_label_name is volatile and will change
3194 with every call to fb_label_name, like those resulting from
3195 parsing the IS-operand. */
3196 fb_name = fb_label_name (current_fb_label, 1);
3198 /* Make sure we save the canonical name and don't get bitten by
3199 prefixes. */
3200 obstack_1grow (&mmix_sym_obstack, ':');
3201 obstack_grow (&mmix_sym_obstack, fb_name, strlen (fb_name) + 1);
3202 mmix_greg_internal (obstack_finish (&mmix_sym_obstack));
3203 fb_label_instance_inc (current_fb_label);
3204 current_fb_label = -1;
3206 else
3207 mmix_greg_internal (pending_label);
3209 /* Back up before the end-of-line marker that was skipped in
3210 mmix_greg_internal. */
3211 input_line_pointer--;
3212 input_line_pointer[-1] = ' ';
3214 pending_label = NULL;
3216 else if (pending_label != NULL)
3218 input_line_pointer += strlen (pending_label);
3220 /* See comment above about getting line numbers bumped. */
3221 input_line_pointer[-1] = '\n';
3225 /* Give the value of an fb-label rewritten as in mmix_handle_mmixal, when
3226 parsing an expression.
3228 On valid calls, input_line_pointer points at a MAGIC_FB_BACKWARD_CHAR
3229 or MAGIC_FB_BACKWARD_CHAR, followed by an ascii digit for the label.
3230 We fill in the label as an expression. */
3232 void
3233 mmix_fb_label (expressionS *expP)
3235 symbolS *sym;
3236 char *fb_internal_name;
3238 /* This doesn't happen when not using mmixal syntax. */
3239 if (mmix_gnu_syntax
3240 || (input_line_pointer[0] != MAGIC_FB_BACKWARD_CHAR
3241 && input_line_pointer[0] != MAGIC_FB_FORWARD_CHAR))
3242 return;
3244 /* The current backward reference has augmentation 0. A forward
3245 reference has augmentation 1, unless it's the same as a fb-label on
3246 _this_ line, in which case we add one more so we don't refer to it.
3247 This is the semantics of mmixal; it differs to that of common
3248 fb-labels which refer to a here-label on the current line as a
3249 backward reference. */
3250 fb_internal_name
3251 = fb_label_name (input_line_pointer[1] - '0',
3252 (input_line_pointer[0] == MAGIC_FB_FORWARD_CHAR ? 1 : 0)
3253 + ((input_line_pointer[1] - '0' == current_fb_label
3254 && input_line_pointer[0] == MAGIC_FB_FORWARD_CHAR)
3255 ? 1 : 0));
3257 input_line_pointer += 2;
3258 sym = symbol_find_or_make (fb_internal_name);
3260 /* We don't have to clean up unrelated fields here; we just do what the
3261 expr machinery does, but *not* just what it does for [0-9][fb], since
3262 we need to treat those as ordinary symbols sometimes; see testcases
3263 err-byte2.s and fb-2.s. */
3264 if (S_GET_SEGMENT (sym) == absolute_section)
3266 expP->X_op = O_constant;
3267 expP->X_add_number = S_GET_VALUE (sym);
3269 else
3271 expP->X_op = O_symbol;
3272 expP->X_add_symbol = sym;
3273 expP->X_add_number = 0;
3277 /* See whether we need to force a relocation into the output file.
3278 This is used to force out switch and PC relative relocations when
3279 relaxing. */
3282 mmix_force_relocation (fixS *fixP)
3284 if (fixP->fx_r_type == BFD_RELOC_MMIX_LOCAL
3285 || fixP->fx_r_type == BFD_RELOC_MMIX_BASE_PLUS_OFFSET)
3286 return 1;
3288 if (linkrelax)
3289 return 1;
3291 /* All our pcrel relocations are must-keep. Note that md_apply_fix is
3292 called *after* this, and will handle getting rid of the presumed
3293 reloc; a relocation isn't *forced* other than to be handled by
3294 md_apply_fix (or tc_gen_reloc if linkrelax). */
3295 if (fixP->fx_pcrel)
3296 return 1;
3298 return generic_force_reloc (fixP);
3301 /* The location from which a PC relative jump should be calculated,
3302 given a PC relative reloc. */
3304 long
3305 md_pcrel_from_section (fixS *fixP, segT sec)
3307 if (fixP->fx_addsy != (symbolS *) NULL
3308 && (! S_IS_DEFINED (fixP->fx_addsy)
3309 || S_GET_SEGMENT (fixP->fx_addsy) != sec))
3311 /* The symbol is undefined (or is defined but not in this section).
3312 Let the linker figure it out. */
3313 return 0;
3316 return (fixP->fx_frag->fr_address + fixP->fx_where);
3319 /* Adjust the symbol table. We make reg_section relative to the real
3320 register section. */
3322 void
3323 mmix_adjust_symtab (void)
3325 symbolS *sym;
3326 symbolS *regsec = section_symbol (reg_section);
3328 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
3329 if (S_GET_SEGMENT (sym) == reg_section)
3331 if (sym == regsec)
3333 if (S_IS_EXTERNAL (sym) || symbol_used_in_reloc_p (sym))
3334 abort ();
3335 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
3337 else
3338 /* Change section to the *real* register section, so it gets
3339 proper treatment when writing it out. Only do this for
3340 global symbols. This also means we don't have to check for
3341 $0..$255. */
3342 S_SET_SEGMENT (sym, real_reg_section);
3346 /* This is the expansion of LABELS_WITHOUT_COLONS.
3347 We let md_start_line_hook tweak label_without_colon_this_line, and then
3348 this function returns the tweaked value, and sets it to 1 for the next
3349 line. FIXME: Very, very brittle. Not sure it works the way I
3350 thought at the time I first wrote this. */
3353 mmix_label_without_colon_this_line (void)
3355 int retval = label_without_colon_this_line;
3357 if (! mmix_gnu_syntax)
3358 label_without_colon_this_line = 1;
3360 return retval;
3363 /* This is the expansion of md_relax_frag. We go through the ordinary
3364 relax table function except when the frag is for a GREG. Then we have
3365 to check whether there's another GREG by the same value that we can
3366 join with. */
3368 long
3369 mmix_md_relax_frag (segT seg, fragS *fragP, long stretch)
3371 switch (fragP->fr_subtype)
3373 /* Growth for this type has been handled by mmix_md_finish and
3374 correctly estimated, so there's nothing more to do here. */
3375 case STATE_GREG_DEF:
3376 return 0;
3378 case ENCODE_RELAX (STATE_PUSHJ, STATE_ZERO):
3380 /* We need to handle relaxation type ourselves, since relax_frag
3381 doesn't update fr_subtype if there's no size increase in the
3382 current section; when going from plain PUSHJ to a stub. This
3383 is otherwise functionally the same as relax_frag in write.c,
3384 simplified for this case. */
3385 offsetT aim;
3386 addressT target;
3387 addressT address;
3388 symbolS *symbolP;
3389 target = fragP->fr_offset;
3390 address = fragP->fr_address;
3391 symbolP = fragP->fr_symbol;
3393 if (symbolP)
3395 fragS *sym_frag;
3397 sym_frag = symbol_get_frag (symbolP);
3398 know (S_GET_SEGMENT (symbolP) != absolute_section
3399 || sym_frag == &zero_address_frag);
3400 target += S_GET_VALUE (symbolP);
3402 /* If frag has yet to be reached on this pass, assume it will
3403 move by STRETCH just as we did. If this is not so, it will
3404 be because some frag between grows, and that will force
3405 another pass. */
3407 if (stretch != 0
3408 && sym_frag->relax_marker != fragP->relax_marker
3409 && S_GET_SEGMENT (symbolP) == seg)
3410 target += stretch;
3413 aim = target - address - fragP->fr_fix;
3414 if (aim >= PUSHJ_0B && aim <= PUSHJ_0F)
3416 /* Target is reachable with a PUSHJ. */
3417 segment_info_type *seginfo = seg_info (seg);
3419 /* If we're at the end of a relaxation round, clear the stub
3420 counter as initialization for the next round. */
3421 if (fragP == seginfo->tc_segment_info_data.last_stubfrag)
3422 seginfo->tc_segment_info_data.nstubs = 0;
3423 return 0;
3426 /* Not reachable. Try a stub. */
3427 fragP->fr_subtype = ENCODE_RELAX (STATE_PUSHJSTUB, STATE_ZERO);
3429 /* FALLTHROUGH. */
3431 /* See if this PUSHJ is redirectable to a stub. */
3432 case ENCODE_RELAX (STATE_PUSHJSTUB, STATE_ZERO):
3434 segment_info_type *seginfo = seg_info (seg);
3435 fragS *lastfrag = seginfo->frchainP->frch_last;
3436 relax_substateT prev_type = fragP->fr_subtype;
3438 /* The last frag is always an empty frag, so it suffices to look
3439 at its address to know the ending address of this section. */
3440 know (lastfrag->fr_type == rs_fill
3441 && lastfrag->fr_fix == 0
3442 && lastfrag->fr_var == 0);
3444 /* For this PUSHJ to be relaxable into a call to a stub, the
3445 distance must be no longer than 256k bytes from the PUSHJ to
3446 the end of the section plus the maximum size of stubs so far. */
3447 if ((lastfrag->fr_address
3448 + stretch
3449 + PUSHJ_MAX_LEN * seginfo->tc_segment_info_data.nstubs)
3450 - (fragP->fr_address + fragP->fr_fix)
3451 > GETA_0F
3452 || !pushj_stubs)
3453 fragP->fr_subtype = mmix_relax_table[prev_type].rlx_more;
3454 else
3455 seginfo->tc_segment_info_data.nstubs++;
3457 /* If we're at the end of a relaxation round, clear the stub
3458 counter as initialization for the next round. */
3459 if (fragP == seginfo->tc_segment_info_data.last_stubfrag)
3460 seginfo->tc_segment_info_data.nstubs = 0;
3462 return
3463 (mmix_relax_table[fragP->fr_subtype].rlx_length
3464 - mmix_relax_table[prev_type].rlx_length);
3467 case ENCODE_RELAX (STATE_PUSHJ, STATE_MAX):
3469 segment_info_type *seginfo = seg_info (seg);
3471 /* Need to cover all STATE_PUSHJ states to act on the last stub
3472 frag (the end of this relax round; initialization for the
3473 next). */
3474 if (fragP == seginfo->tc_segment_info_data.last_stubfrag)
3475 seginfo->tc_segment_info_data.nstubs = 0;
3477 return 0;
3480 default:
3481 return relax_frag (seg, fragP, stretch);
3483 case STATE_GREG_UNDF:
3484 BAD_CASE (fragP->fr_subtype);
3487 as_fatal (_("internal: unexpected relax type %d:%d"),
3488 fragP->fr_type, fragP->fr_subtype);
3489 return 0;
3492 /* Various things we punt until all input is seen. */
3494 void
3495 mmix_md_finish (void)
3497 fragS *fragP;
3498 symbolS *mainsym;
3499 asection *regsec;
3500 struct loc_assert_s *loc_assert;
3501 int i;
3503 /* The first frag of GREG:s going into the register contents section. */
3504 fragS *mmix_reg_contents_frags = NULL;
3506 /* Reset prefix. All labels reachable at this point must be
3507 canonicalized. */
3508 mmix_current_prefix = NULL;
3510 if (doing_bspec)
3511 as_bad_where (bspec_file, bspec_line, _("BSPEC without ESPEC."));
3513 /* Emit the low LOC setting of .text. */
3514 if (text_has_contents && lowest_text_loc != (bfd_vma) -1)
3516 symbolS *symbolP;
3517 char locsymbol[sizeof (":") - 1
3518 + sizeof (MMIX_LOC_SECTION_START_SYMBOL_PREFIX) - 1
3519 + sizeof (".text")];
3521 /* An exercise in non-ISO-C-ness, this one. */
3522 sprintf (locsymbol, ":%s%s", MMIX_LOC_SECTION_START_SYMBOL_PREFIX,
3523 ".text");
3524 symbolP
3525 = symbol_new (locsymbol, absolute_section, &zero_address_frag,
3526 lowest_text_loc);
3527 S_SET_EXTERNAL (symbolP);
3530 /* Ditto .data. */
3531 if (data_has_contents && lowest_data_loc != (bfd_vma) -1)
3533 symbolS *symbolP;
3534 char locsymbol[sizeof (":") - 1
3535 + sizeof (MMIX_LOC_SECTION_START_SYMBOL_PREFIX) - 1
3536 + sizeof (".data")];
3538 sprintf (locsymbol, ":%s%s", MMIX_LOC_SECTION_START_SYMBOL_PREFIX,
3539 ".data");
3540 symbolP
3541 = symbol_new (locsymbol, absolute_section, &zero_address_frag,
3542 lowest_data_loc);
3543 S_SET_EXTERNAL (symbolP);
3546 /* Unless GNU syntax mode, set "Main" to be a function, so the
3547 disassembler doesn't get confused when we write truly
3548 mmixal-compatible code (and don't use .type). Similarly set it
3549 global (regardless of -globalize-symbols), so the linker sees it as
3550 the start symbol in ELF mode. */
3551 mainsym = symbol_find (MMIX_START_SYMBOL_NAME);
3552 if (mainsym != NULL && ! mmix_gnu_syntax)
3554 symbol_get_bfdsym (mainsym)->flags |= BSF_FUNCTION;
3555 S_SET_EXTERNAL (mainsym);
3558 /* Check that we didn't LOC into the unknown, or rather that when it
3559 was unknown, we actually change sections. */
3560 for (loc_assert = loc_asserts;
3561 loc_assert != NULL;
3562 loc_assert = loc_assert->next)
3564 segT actual_seg;
3566 resolve_symbol_value (loc_assert->loc_sym);
3567 actual_seg = S_GET_SEGMENT (loc_assert->loc_sym);
3568 if (actual_seg != loc_assert->old_seg)
3570 const char *fnam;
3571 unsigned int line;
3572 int e_valid = expr_symbol_where (loc_assert->loc_sym, &fnam, &line);
3574 gas_assert (e_valid == 1);
3575 as_bad_where (fnam, line,
3576 _("LOC to section unknown or indeterminable "
3577 "at first pass"));
3579 /* Patch up the generic location data to avoid cascading
3580 error messages from later passes. (See original in
3581 write.c:relax_segment.) */
3582 fragP = loc_assert->frag;
3583 fragP->fr_type = rs_align;
3584 fragP->fr_subtype = 0;
3585 fragP->fr_offset = 0;
3586 fragP->fr_fix = 0;
3590 if (n_of_raw_gregs != 0)
3592 /* Emit GREGs. They are collected in order of appearance, but must
3593 be emitted in opposite order to both have section address regno*8
3594 and the same allocation order (within a file) as mmixal. */
3595 segT this_segment = now_seg;
3596 subsegT this_subsegment = now_subseg;
3598 regsec = bfd_make_section_old_way (stdoutput,
3599 MMIX_REG_CONTENTS_SECTION_NAME);
3600 subseg_set (regsec, 0);
3602 /* Finally emit the initialization-value. Emit a variable frag, which
3603 we'll fix in md_estimate_size_before_relax. We set the initializer
3604 for the tc_frag_data field to NULL, so we can use that field for
3605 relaxation purposes. */
3606 mmix_opcode_frag = NULL;
3608 frag_grow (0);
3609 mmix_reg_contents_frags = frag_now;
3611 for (i = n_of_raw_gregs - 1; i >= 0; i--)
3613 if (mmix_raw_gregs[i].label != NULL)
3614 /* There's a symbol. Let it refer to this location in the
3615 register contents section. The symbol must be globalized
3616 separately. */
3617 colon (mmix_raw_gregs[i].label);
3619 frag_var (rs_machine_dependent, 8, 0, STATE_GREG_UNDF,
3620 make_expr_symbol (&mmix_raw_gregs[i].exp), 0, NULL);
3623 subseg_set (this_segment, this_subsegment);
3626 regsec = bfd_get_section_by_name (stdoutput, MMIX_REG_CONTENTS_SECTION_NAME);
3627 /* Mark the section symbol as being OK for a reloc. */
3628 if (regsec != NULL)
3629 regsec->symbol->flags |= BSF_KEEP;
3631 /* Iterate over frags resulting from GREGs and move those that evidently
3632 have the same value together and point one to another.
3634 This works in time O(N^2) but since the upper bound for non-error use
3635 is 223, it's best to keep this simpler algorithm. */
3636 for (fragP = mmix_reg_contents_frags; fragP != NULL; fragP = fragP->fr_next)
3638 fragS **fpp;
3639 fragS *fp = NULL;
3640 fragS *osymfrag;
3641 offsetT osymval;
3642 expressionS *oexpP;
3643 symbolS *symbolP = fragP->fr_symbol;
3645 if (fragP->fr_type != rs_machine_dependent
3646 || fragP->fr_subtype != STATE_GREG_UNDF)
3647 continue;
3649 /* Whatever the outcome, we will have this GREG judged merged or
3650 non-merged. Since the tc_frag_data is NULL at this point, we
3651 default to non-merged. */
3652 fragP->fr_subtype = STATE_GREG_DEF;
3654 /* If we're not supposed to merge GREG definitions, then just don't
3655 look for equivalents. */
3656 if (! merge_gregs)
3657 continue;
3659 osymval = (offsetT) S_GET_VALUE (symbolP);
3660 osymfrag = symbol_get_frag (symbolP);
3662 /* If the symbol isn't defined, we can't say that another symbol
3663 equals this frag, then. FIXME: We can look at the "deepest"
3664 defined name; if a = c and b = c then obviously a == b. */
3665 if (! S_IS_DEFINED (symbolP))
3666 continue;
3668 oexpP = symbol_get_value_expression (fragP->fr_symbol);
3670 /* If the initialization value is zero, then we must not merge them. */
3671 if (oexpP->X_op == O_constant && osymval == 0)
3672 continue;
3674 /* Iterate through the frags downward this one. If we find one that
3675 has the same non-zero value, move it to after this one and point
3676 to it as the equivalent. */
3677 for (fpp = &fragP->fr_next; *fpp != NULL; fpp = &fpp[0]->fr_next)
3679 fp = *fpp;
3681 if (fp->fr_type != rs_machine_dependent
3682 || fp->fr_subtype != STATE_GREG_UNDF)
3683 continue;
3685 /* Calling S_GET_VALUE may simplify the symbol, changing from
3686 expr_section etc. so call it first. */
3687 if ((offsetT) S_GET_VALUE (fp->fr_symbol) == osymval
3688 && symbol_get_frag (fp->fr_symbol) == osymfrag)
3690 /* Move the frag links so the one we found equivalent comes
3691 after the current one, carefully considering that
3692 sometimes fpp == &fragP->fr_next and the moves must be a
3693 NOP then. */
3694 *fpp = fp->fr_next;
3695 fp->fr_next = fragP->fr_next;
3696 fragP->fr_next = fp;
3697 break;
3701 if (*fpp != NULL)
3702 fragP->tc_frag_data = fp;
3706 /* qsort function for mmix_symbol_gregs. */
3708 static int
3709 cmp_greg_symbol_fixes (const void *parg, const void *qarg)
3711 const struct mmix_symbol_greg_fixes *p
3712 = (const struct mmix_symbol_greg_fixes *) parg;
3713 const struct mmix_symbol_greg_fixes *q
3714 = (const struct mmix_symbol_greg_fixes *) qarg;
3716 return p->offs > q->offs ? 1 : p->offs < q->offs ? -1 : 0;
3719 /* Collect GREG definitions from mmix_gregs and hang them as lists sorted
3720 on increasing offsets onto each section symbol or undefined symbol.
3722 Also, remove the register convenience section so it doesn't get output
3723 as an ELF section. */
3725 void
3726 mmix_frob_file (void)
3728 int i;
3729 struct mmix_symbol_gregs *all_greg_symbols[MAX_GREGS];
3730 int n_greg_symbols = 0;
3732 /* Collect all greg fixups and decorate each corresponding symbol with
3733 the greg fixups for it. */
3734 for (i = 0; i < n_of_cooked_gregs; i++)
3736 offsetT offs;
3737 symbolS *sym;
3738 struct mmix_symbol_gregs *gregs;
3739 fixS *fixP;
3741 fixP = mmix_gregs[i];
3742 know (fixP->fx_r_type == BFD_RELOC_64);
3744 /* This case isn't doable in general anyway, methinks. */
3745 if (fixP->fx_subsy != NULL)
3747 as_bad_subtract (fixP);
3748 continue;
3751 sym = fixP->fx_addsy;
3752 offs = (offsetT) fixP->fx_offset;
3754 /* If the symbol is defined, then it must be resolved to a section
3755 symbol at this time, or else we don't know how to handle it. */
3756 if (S_IS_DEFINED (sym)
3757 && !bfd_is_com_section (S_GET_SEGMENT (sym))
3758 && !S_IS_WEAK (sym))
3760 if (! symbol_section_p (sym)
3761 && ! bfd_is_abs_section (S_GET_SEGMENT (sym)))
3762 as_fatal (_("internal: GREG expression not resolved to section"));
3764 offs += S_GET_VALUE (sym);
3767 /* If this is an absolute symbol sufficiently near lowest_data_loc,
3768 then we canonicalize on the data section. Note that offs is
3769 signed here; we may subtract lowest_data_loc which is unsigned.
3770 Careful with those comparisons. */
3771 if (lowest_data_loc != (bfd_vma) -1
3772 && (bfd_vma) offs + 256 > lowest_data_loc
3773 && bfd_is_abs_section (S_GET_SEGMENT (sym)))
3775 offs -= (offsetT) lowest_data_loc;
3776 sym = section_symbol (data_section);
3778 /* Likewise text section. */
3779 else if (lowest_text_loc != (bfd_vma) -1
3780 && (bfd_vma) offs + 256 > lowest_text_loc
3781 && bfd_is_abs_section (S_GET_SEGMENT (sym)))
3783 offs -= (offsetT) lowest_text_loc;
3784 sym = section_symbol (text_section);
3787 gregs = *symbol_get_tc (sym);
3789 if (gregs == NULL)
3791 gregs = XNEW (struct mmix_symbol_gregs);
3792 gregs->n_gregs = 0;
3793 symbol_set_tc (sym, &gregs);
3794 all_greg_symbols[n_greg_symbols++] = gregs;
3797 gregs->greg_fixes[gregs->n_gregs].fix = fixP;
3798 gregs->greg_fixes[gregs->n_gregs++].offs = offs;
3801 /* For each symbol having a GREG definition, sort those definitions on
3802 offset. */
3803 for (i = 0; i < n_greg_symbols; i++)
3804 qsort (all_greg_symbols[i]->greg_fixes, all_greg_symbols[i]->n_gregs,
3805 sizeof (all_greg_symbols[i]->greg_fixes[0]), cmp_greg_symbol_fixes);
3807 if (real_reg_section != NULL)
3809 /* FIXME: Pass error state gracefully. */
3810 if (bfd_section_flags (real_reg_section) & SEC_HAS_CONTENTS)
3811 as_fatal (_("register section has contents\n"));
3813 bfd_section_list_remove (stdoutput, real_reg_section);
3814 --stdoutput->section_count;
3819 /* Provide an expression for a built-in name provided when-used.
3820 Either a symbol that is a handler; living in 0x10*[1..8] and having
3821 name [DVWIOUZX]_Handler, or a mmixal built-in symbol.
3823 If the name isn't a built-in name and parsed into *EXPP, return zero. */
3826 mmix_parse_predefined_name (char *name, expressionS *expP)
3828 char *canon_name;
3829 const char *handler_charp;
3830 const char handler_chars[] = "DVWIOUZX";
3831 symbolS *symp;
3833 if (! predefined_syms)
3834 return 0;
3836 canon_name = tc_canonicalize_symbol_name (name);
3838 if (canon_name[1] == '_'
3839 && strcmp (canon_name + 2, "Handler") == 0
3840 && (handler_charp = strchr (handler_chars, *canon_name)) != NULL)
3842 /* If the symbol doesn't exist, provide one relative to the .text
3843 section.
3845 FIXME: We should provide separate sections, mapped in the linker
3846 script. */
3847 symp = symbol_find (name);
3848 if (symp == NULL)
3849 symp = symbol_new (name, text_section, &zero_address_frag,
3850 0x10 * (handler_charp + 1 - handler_chars));
3852 else
3854 /* These symbols appear when referenced; needed for
3855 mmixal-compatible programs. */
3856 unsigned int i;
3858 static const struct
3860 const char *name;
3861 valueT val;
3862 } predefined_abs_syms[] =
3864 {"Data_Segment", (valueT) 0x20 << 56},
3865 {"Pool_Segment", (valueT) 0x40 << 56},
3866 {"Stack_Segment", (valueT) 0x60 << 56},
3867 {"StdIn", 0},
3868 {"StdOut", 1},
3869 {"StdErr", 2},
3870 {"TextRead", 0},
3871 {"TextWrite", 1},
3872 {"BinaryRead", 2},
3873 {"BinaryWrite", 3},
3874 {"BinaryReadWrite", 4},
3875 {"Halt", 0},
3876 {"Fopen", 1},
3877 {"Fclose", 2},
3878 {"Fread", 3},
3879 {"Fgets", 4},
3880 {"Fgetws", 5},
3881 {"Fwrite", 6},
3882 {"Fputs", 7},
3883 {"Fputws", 8},
3884 {"Fseek", 9},
3885 {"Ftell", 10},
3886 {"D_BIT", 0x80},
3887 {"V_BIT", 0x40},
3888 {"W_BIT", 0x20},
3889 {"I_BIT", 0x10},
3890 {"O_BIT", 0x08},
3891 {"U_BIT", 0x04},
3892 {"Z_BIT", 0x02},
3893 {"X_BIT", 0x01},
3894 {"Inf", 0x7ff00000}
3897 /* If it's already in the symbol table, we shouldn't do anything. */
3898 symp = symbol_find (name);
3899 if (symp != NULL)
3900 return 0;
3902 for (i = 0;
3903 i < sizeof (predefined_abs_syms) / sizeof (predefined_abs_syms[0]);
3904 i++)
3905 if (strcmp (canon_name, predefined_abs_syms[i].name) == 0)
3907 symbol_table_insert (symbol_new (predefined_abs_syms[i].name,
3908 absolute_section,
3909 &zero_address_frag,
3910 predefined_abs_syms[i].val));
3912 /* Let gas find the symbol we just created, through its
3913 ordinary lookup. */
3914 return 0;
3917 /* Not one of those symbols. Let gas handle it. */
3918 return 0;
3921 expP->X_op = O_symbol;
3922 expP->X_add_number = 0;
3923 expP->X_add_symbol = symp;
3924 expP->X_op_symbol = NULL;
3926 return 1;
3929 /* Just check that we don't have a BSPEC/ESPEC pair active when changing
3930 sections "normally", and get knowledge about alignment from the new
3931 section. */
3933 void
3934 mmix_md_elf_section_change_hook (void)
3936 if (doing_bspec)
3937 as_bad (_("section change from within a BSPEC/ESPEC pair is not supported"));
3939 last_alignment = bfd_section_alignment (now_seg);
3940 want_unaligned = 0;
3943 /* The LOC worker. This is like s_org, but we have to support changing
3944 section too. */
3946 static void
3947 s_loc (int ignore ATTRIBUTE_UNUSED)
3949 segT section;
3950 expressionS exp;
3951 char *p;
3952 symbolS *sym;
3953 offsetT off;
3955 /* Must not have a BSPEC in progress. */
3956 if (doing_bspec)
3958 as_bad (_("directive LOC from within a BSPEC/ESPEC pair is not supported"));
3959 return;
3962 section = expression (&exp);
3964 if (exp.X_op == O_illegal
3965 || exp.X_op == O_absent
3966 || exp.X_op == O_big)
3968 as_bad (_("invalid LOC expression"));
3969 return;
3972 if (section == undefined_section)
3974 /* This is an error or a LOC with an expression involving
3975 forward references. For the expression to be correctly
3976 evaluated, we need to force a proper symbol; gas loses track
3977 of the segment for "local symbols". */
3978 if (exp.X_op == O_add)
3980 symbol_get_value_expression (exp.X_op_symbol);
3981 symbol_get_value_expression (exp.X_add_symbol);
3983 else
3985 gas_assert (exp.X_op == O_symbol);
3986 symbol_get_value_expression (exp.X_add_symbol);
3990 if (section == absolute_section)
3992 /* Translate a constant into a suitable section. */
3994 if (exp.X_add_number < ((offsetT) 0x20 << 56))
3996 /* Lower than Data_Segment or in the reserved area (the
3997 segment number is >= 0x80, appearing negative) - assume
3998 it's .text. */
3999 section = text_section;
4001 /* Save the lowest seen location, so we can pass on this
4002 information to the linker. We don't actually org to this
4003 location here, we just pass on information to the linker so
4004 it can put the code there for us. */
4006 /* If there was already a loc (that has to be set lower than
4007 this one), we org at (this - lower). There's an implicit
4008 "LOC 0" before any entered code. FIXME: handled by spurious
4009 settings of text_has_contents. */
4010 if (lowest_text_loc != (bfd_vma) -1
4011 && (bfd_vma) exp.X_add_number < lowest_text_loc)
4013 as_bad (_("LOC expression stepping backwards is not supported"));
4014 exp.X_op = O_absent;
4016 else
4018 if (text_has_contents && lowest_text_loc == (bfd_vma) -1)
4019 lowest_text_loc = 0;
4021 if (lowest_text_loc == (bfd_vma) -1)
4023 lowest_text_loc = exp.X_add_number;
4025 /* We want only to change the section, not set an offset. */
4026 exp.X_op = O_absent;
4028 else
4029 exp.X_add_number -= lowest_text_loc;
4032 else
4034 /* Do the same for the .data section, except we don't have
4035 to worry about exp.X_add_number carrying a sign. */
4036 section = data_section;
4038 if (exp.X_add_number < (offsetT) lowest_data_loc)
4040 as_bad (_("LOC expression stepping backwards is not supported"));
4041 exp.X_op = O_absent;
4043 else
4045 if (data_has_contents && lowest_data_loc == (bfd_vma) -1)
4046 lowest_data_loc = (bfd_vma) 0x20 << 56;
4048 if (lowest_data_loc == (bfd_vma) -1)
4050 lowest_data_loc = exp.X_add_number;
4052 /* We want only to change the section, not set an offset. */
4053 exp.X_op = O_absent;
4055 else
4056 exp.X_add_number -= lowest_data_loc;
4061 /* If we can't deduce the section, it must be the current one.
4062 Below, we arrange to assert this. */
4063 if (section != now_seg && section != undefined_section)
4065 obj_elf_section_change_hook ();
4066 subseg_set (section, 0);
4068 /* Call our section change hooks using the official hook. */
4069 md_elf_section_change_hook ();
4072 if (exp.X_op != O_absent)
4074 symbolS *esym = NULL;
4076 if (exp.X_op != O_constant && exp.X_op != O_symbol)
4078 /* Handle complex expressions. */
4079 esym = sym = make_expr_symbol (&exp);
4080 off = 0;
4082 else
4084 sym = exp.X_add_symbol;
4085 off = exp.X_add_number;
4087 if (section == undefined_section)
4089 /* We need an expr_symbol when tracking sections. In
4090 order to make this an expr_symbol with file and line
4091 tracked, we have to make the exp non-trivial; not an
4092 O_symbol with .X_add_number == 0. The constant part
4093 is unused. */
4094 exp.X_add_number = 1;
4095 esym = make_expr_symbol (&exp);
4099 /* Track the LOC's where we couldn't deduce the section: assert
4100 that we weren't supposed to change section. */
4101 if (section == undefined_section)
4103 struct loc_assert_s *next = loc_asserts;
4104 loc_asserts = XNEW (struct loc_assert_s);
4105 loc_asserts->next = next;
4106 loc_asserts->old_seg = now_seg;
4107 loc_asserts->loc_sym = esym;
4108 loc_asserts->frag = frag_now;
4111 p = frag_var (rs_org, 1, 1, (relax_substateT) 0, sym, off, (char *) 0);
4112 *p = 0;
4115 mmix_handle_rest_of_empty_line ();
4118 /* The BYTE worker. We have to support sequences of mixed "strings",
4119 numbers and other constant "first-pass" reducible expressions separated
4120 by comma. */
4122 static void
4123 mmix_byte (void)
4125 unsigned int c;
4127 if (now_seg == text_section)
4128 text_has_contents = 1;
4129 else if (now_seg == data_section)
4130 data_has_contents = 1;
4134 SKIP_WHITESPACE ();
4135 switch (*input_line_pointer)
4137 case '\"':
4138 ++input_line_pointer;
4139 while (is_a_char (c = next_char_of_string ()))
4141 FRAG_APPEND_1_CHAR (c);
4144 if (input_line_pointer[-1] != '\"')
4146 /* We will only get here in rare cases involving #NO_APP,
4147 where the unterminated string is not recognized by the
4148 preformatting pass. */
4149 as_bad (_("unterminated string"));
4150 mmix_discard_rest_of_line ();
4151 return;
4153 break;
4155 default:
4157 expressionS exp;
4158 segT expseg = expression (&exp);
4160 /* We have to allow special register names as constant numbers. */
4161 if ((expseg != absolute_section && expseg != reg_section)
4162 || (exp.X_op != O_constant
4163 && (exp.X_op != O_register
4164 || exp.X_add_number <= 255)))
4166 as_bad (_("BYTE expression not a pure number"));
4167 mmix_discard_rest_of_line ();
4168 return;
4170 else if ((exp.X_add_number > 255 && exp.X_op != O_register)
4171 || exp.X_add_number < 0)
4173 /* Note that mmixal does not allow negative numbers in
4174 BYTE sequences, so neither should we. */
4175 as_bad (_("BYTE expression not in the range 0..255"));
4176 mmix_discard_rest_of_line ();
4177 return;
4180 FRAG_APPEND_1_CHAR (exp.X_add_number);
4182 break;
4185 SKIP_WHITESPACE ();
4186 c = *input_line_pointer++;
4188 while (c == ',');
4190 input_line_pointer--;
4192 if (mmix_gnu_syntax)
4193 demand_empty_rest_of_line ();
4194 else
4196 mmix_discard_rest_of_line ();
4197 /* Do like demand_empty_rest_of_line and step over the end-of-line
4198 boundary. */
4199 input_line_pointer++;
4202 /* Make sure we align for the next instruction. */
4203 last_alignment = 0;
4206 /* Like cons_worker, but we have to ignore "naked comments", not barf on
4207 them. Implements WYDE, TETRA and OCTA. We're a little bit more
4208 lenient than mmix_byte but FIXME: they should eventually merge. */
4210 static void
4211 mmix_cons (int nbytes)
4213 expressionS exp;
4215 /* If we don't have any contents, then it's ok to have a specified start
4216 address that is not a multiple of the max data size. We will then
4217 align it as necessary when we get here. Otherwise, it's a fatal sin. */
4218 if (now_seg == text_section)
4220 if (lowest_text_loc != (bfd_vma) -1
4221 && (lowest_text_loc & (nbytes - 1)) != 0)
4223 if (text_has_contents)
4224 as_bad (_("data item with alignment larger than location"));
4225 else if (want_unaligned)
4226 as_bad (_("unaligned data at an absolute location is not supported"));
4228 lowest_text_loc &= ~((bfd_vma) nbytes - 1);
4229 lowest_text_loc += (bfd_vma) nbytes;
4232 text_has_contents = 1;
4234 else if (now_seg == data_section)
4236 if (lowest_data_loc != (bfd_vma) -1
4237 && (lowest_data_loc & (nbytes - 1)) != 0)
4239 if (data_has_contents)
4240 as_bad (_("data item with alignment larger than location"));
4241 else if (want_unaligned)
4242 as_bad (_("unaligned data at an absolute location is not supported"));
4244 lowest_data_loc &= ~((bfd_vma) nbytes - 1);
4245 lowest_data_loc += (bfd_vma) nbytes;
4248 data_has_contents = 1;
4251 /* Always align these unless asked not to (valid for the current pseudo). */
4252 if (! want_unaligned)
4254 last_alignment = nbytes == 2 ? 1 : (nbytes == 4 ? 2 : 3);
4255 frag_align (last_alignment, 0, 0);
4256 record_alignment (now_seg, last_alignment);
4259 /* For mmixal compatibility, a label for an instruction (and emitting
4260 pseudo) refers to the _aligned_ address. So we have to emit the
4261 label here. */
4262 if (current_fb_label >= 0)
4263 colon (fb_label_name (current_fb_label, 1));
4264 else if (pending_label != NULL)
4266 colon (pending_label);
4267 pending_label = NULL;
4270 SKIP_WHITESPACE ();
4272 if (is_end_of_line[(unsigned int) *input_line_pointer])
4274 /* Default to zero if the expression was absent. */
4276 exp.X_op = O_constant;
4277 exp.X_add_number = 0;
4278 exp.X_unsigned = 0;
4279 exp.X_add_symbol = NULL;
4280 exp.X_op_symbol = NULL;
4281 emit_expr (&exp, (unsigned int) nbytes);
4283 else
4286 unsigned int c;
4288 switch (*input_line_pointer)
4290 /* We support strings here too; each character takes up nbytes
4291 bytes. */
4292 case '\"':
4293 ++input_line_pointer;
4294 while (is_a_char (c = next_char_of_string ()))
4296 exp.X_op = O_constant;
4297 exp.X_add_number = c;
4298 exp.X_unsigned = 1;
4299 emit_expr (&exp, (unsigned int) nbytes);
4302 if (input_line_pointer[-1] != '\"')
4304 /* We will only get here in rare cases involving #NO_APP,
4305 where the unterminated string is not recognized by the
4306 preformatting pass. */
4307 as_bad (_("unterminated string"));
4308 mmix_discard_rest_of_line ();
4309 return;
4311 break;
4313 default:
4315 expression (&exp);
4316 emit_expr (&exp, (unsigned int) nbytes);
4317 SKIP_WHITESPACE ();
4319 break;
4322 while (*input_line_pointer++ == ',');
4324 input_line_pointer--; /* Put terminator back into stream. */
4326 mmix_handle_rest_of_empty_line ();
4328 /* We don't need to step up the counter for the current_fb_label here;
4329 that's handled by the caller. */
4332 /* The md_do_align worker. At present, we just record an alignment to
4333 nullify the automatic alignment we do for WYDE, TETRA and OCTA, as gcc
4334 does not use the unaligned macros when attribute packed is used.
4335 Arguably this is a GCC bug. */
4337 void
4338 mmix_md_do_align (int n, char *fill ATTRIBUTE_UNUSED,
4339 int len ATTRIBUTE_UNUSED, int max ATTRIBUTE_UNUSED)
4341 last_alignment = n;
4342 want_unaligned = n == 0;