xref: /netbsd-src/external/gpl3/binutils/dist/gas/config/tc-mmix.c (revision cb63e24e8d6aae7ddac1859a9015f48b1d8bd90e)
1 /* tc-mmix.c -- Assembler for Don Knuth's MMIX.
2    Copyright (C) 2001-2024 Free Software Foundation, Inc.
3 
4    This file is part of GAS, the GNU Assembler.
5 
6    GAS is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3, or (at your option)
9    any later version.
10 
11    GAS is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with GAS; see the file COPYING.  If not, write to
18    the Free Software Foundation, 51 Franklin Street - Fifth Floor,
19    Boston, MA 02110-1301, USA.  */
20 
21 /* Knuth's assembler mmixal does not provide a relocatable format; mmo is
22    to be considered a final link-format.  In the final link, we make mmo,
23    but for relocatable files, we use ELF.
24 
25    One goal is to provide a superset of what mmixal does, including
26    compatible syntax, but the main purpose is to serve GCC.  */
27 
28 
29 #include "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"
37 
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.  */
40 
41 enum mmix_fixup_action
42 {
43   mmix_fixup_byte,
44   mmix_fixup_register,
45   mmix_fixup_register_or_adjust_for_byte
46 };
47 
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);
67 
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'
73 
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)
82 
83 const char *md_shortopts = "x";
84 static int current_fb_label = -1;
85 static char *pending_label = NULL;
86 
87 static bfd_vma lowest_text_loc = (bfd_vma) -1;
88 static int text_has_contents = 0;
89 
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;
94 
95 static bfd_vma lowest_data_loc = (bfd_vma) -1;
96 static int data_has_contents = 0;
97 
98 /* The fragS of the instruction being assembled.  Only valid from within
99    md_assemble.  */
100 fragS *mmix_opcode_frag = NULL;
101 
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
106  {
107    char *label;
108    expressionS exp;
109  } mmix_raw_gregs[MAX_GREGS];
110 
111 static struct loc_assert_s
112  {
113    segT old_seg;
114    symbolS *loc_sym;
115    fragS *frag;
116    struct loc_assert_s *next;
117  } *loc_asserts = NULL;
118 
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;
126 
127 /* Pointing to the register section we use for output.  */
128 static asection *real_reg_section;
129 
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
135  {
136    int n_gregs;
137    struct mmix_symbol_greg_fixes
138    {
139      fixS *fix;
140 
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];
145  };
146 
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;
150 
151 /* Should we automatically expand instructions into multiple insns in
152    order to generate working code?  */
153 static int expand_op = 1;
154 
155 /* Should we warn when expanding operands?  FIXME: test-cases for when -x
156    is absent.  */
157 static int warn_on_expansion = 1;
158 
159 /* Should we merge non-zero GREG register definitions?  */
160 static int merge_gregs = 1;
161 
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;
165 
166 /* Should we emit built-in symbols?  */
167 static int predefined_syms = 1;
168 
169 /* Should we allow anything but the listed special register name
170    (e.g. equated symbols)?  */
171 static int equated_spec_regs = 1;
172 
173 /* Do we require standard GNU syntax?  */
174 int mmix_gnu_syntax = 0;
175 
176 /* Do we globalize all symbols?  */
177 int mmix_globalize_symbols = 0;
178 
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;
182 
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;
186 
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;
191 
192 struct option md_longopts[] =
193  {
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}
216  };
217 
218 size_t md_longopts_size = sizeof (md_longopts);
219 
220 static htab_t mmix_opcode_hash;
221 
222 /* We use these when implementing the PREFIX pseudo.  */
223 char *mmix_current_prefix;
224 struct obstack mmix_sym_obstack;
225 
226 
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.
232 
233    Groups for MMIX relaxing:
234 
235    1. GETA
236       extra length: zero or three insns.
237 
238    2. Bcc
239       extra length: zero or five insns.
240 
241    3. PUSHJ
242       extra length: zero or four insns.
243       Special handling to deal with transition to PUSHJSTUB.
244 
245    4. JMP
246       extra length: zero or four insns.
247 
248    5. GREG
249       special handling, allocates a named global register unless another
250       is within reach for all uses.
251 
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.  */
257 
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)
264 
265 /* No fine-grainedness here.  */
266 #define STATE_LENGTH_MASK	    (1)
267 
268 #define STATE_ZERO		    (0)
269 #define STATE_MAX		    (1)
270 
271 /* More descriptive name for convenience.  */
272 /* FIXME: We should start on something different, not MAX.  */
273 #define STATE_UNDF		    STATE_MAX
274 
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)
281 
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.  */
285 
286 #define GETA_0F (65536 * 4 - 8)
287 #define GETA_0B (-65536 * 4 - 4)
288 
289 #define GETA_MAX_LEN 4 * 4
290 #define GETA_3F 0
291 #define GETA_3B 0
292 
293 #define BCC_0F GETA_0F
294 #define BCC_0B GETA_0B
295 
296 #define BCC_MAX_LEN 6 * 4
297 #define BCC_5F GETA_3F
298 #define BCC_5B GETA_3B
299 
300 #define PUSHJ_0F GETA_0F
301 #define PUSHJ_0B GETA_0B
302 
303 #define PUSHJ_MAX_LEN 5 * 4
304 #define PUSHJ_4F GETA_3F
305 #define PUSHJ_4B GETA_3B
306 
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)
311 
312 #define JMP_0F (65536 * 256 * 4 - 8)
313 #define JMP_0B (-65536 * 256 * 4 - 4)
314 
315 #define JMP_MAX_LEN 5 * 4
316 #define JMP_4F 0
317 #define JMP_4B 0
318 
319 #define RELAX_ENCODE_SHIFT 1
320 #define ENCODE_RELAX(what, length) (((what) << RELAX_ENCODE_SHIFT) + (length))
321 
322 const relax_typeS mmix_relax_table[] =
323  {
324    /* Error sentinel (0, 0).  */
325    {1,		1,		0,	0},
326 
327    /* Unused (0, 1).  */
328    {1,		1,		0,	0},
329 
330    /* GETA (1, 0).  */
331    {GETA_0F,	GETA_0B,	0,	ENCODE_RELAX (STATE_GETA, STATE_MAX)},
332 
333    /* GETA (1, 1).  */
334    {GETA_3F,	GETA_3B,
335 		GETA_MAX_LEN - 4,	0},
336 
337    /* BCC (2, 0).  */
338    {BCC_0F,	BCC_0B,		0,	ENCODE_RELAX (STATE_BCC, STATE_MAX)},
339 
340    /* BCC (2, 1).  */
341    {BCC_5F,	BCC_5B,
342 		BCC_MAX_LEN - 4,	0},
343 
344    /* PUSHJ (3, 0).  Next state is actually PUSHJSTUB (6, 0).  */
345    {PUSHJ_0F,	PUSHJ_0B,	0,	ENCODE_RELAX (STATE_PUSHJSTUB, STATE_ZERO)},
346 
347    /* PUSHJ (3, 1).  */
348    {PUSHJ_4F,	PUSHJ_4B,
349 		PUSHJ_MAX_LEN - 4,	0},
350 
351    /* JMP (4, 0).  */
352    {JMP_0F,	JMP_0B,		0,	ENCODE_RELAX (STATE_JMP, STATE_MAX)},
353 
354    /* JMP (4, 1).  */
355    {JMP_4F,	JMP_4B,
356 		JMP_MAX_LEN - 4,	0},
357 
358    /* GREG (5, 0), (5, 1), though the table entry isn't used.  */
359    {0, 0, 0, 0}, {0, 0, 0, 0},
360 
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}
366 };
367 
368 const pseudo_typeS md_pseudo_table[] =
369  {
370    /* Support " .greg sym,expr" syntax.  */
371    {"greg", s_greg, 0},
372 
373    /* Support " .bspec expr" syntax.  */
374    {"bspec", s_bspec, 1},
375 
376    /* Support " .espec" syntax.  */
377    {"espec", s_espec, 1},
378 
379    /* Support " .local $45" syntax.  */
380    {"local", mmix_s_local, 1},
381 
382    {NULL, 0, 0}
383  };
384 
385 const char mmix_comment_chars[] = "%!";
386 
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[] = ":@";
393 
394 const char line_comment_chars[] = "*#";
395 
396 const char line_separator_chars[] = ";";
397 
398 const char EXP_CHARS[] = "eE";
399 
400 const char FLT_CHARS[] = "rf";
401 
402 
403 /* Fill in the offset-related part of GETA or Bcc.  */
404 
405 static void
mmix_set_geta_branch_offset(char * opcodep,offsetT value)406 mmix_set_geta_branch_offset (char *opcodep, offsetT value)
407 {
408   if (value < 0)
409     {
410       value += 65536 * 4;
411       opcodep[0] |= 1;
412     }
413 
414   value /= 4;
415   md_number_to_chars (opcodep + 2, value, 2);
416 }
417 
418 /* Fill in the offset-related part of JMP.  */
419 
420 static void
mmix_set_jmp_offset(char * opcodep,offsetT value)421 mmix_set_jmp_offset (char *opcodep, offsetT value)
422 {
423   if (value < 0)
424     {
425       value += 65536 * 256 * 4;
426       opcodep[0] |= 1;
427     }
428 
429   value /= 4;
430   md_number_to_chars (opcodep + 1, value, 3);
431 }
432 
433 /* Fill in NOP:s for the expanded part of GETA/JMP/Bcc/PUSHJ.  */
434 
435 static void
mmix_fill_nops(char * opcodep,int n)436 mmix_fill_nops (char *opcodep, int n)
437 {
438   int i;
439 
440   for (i = 0; i < n; i++)
441     md_number_to_chars (opcodep + i * 4, SWYM_INSN_BYTE << 24, 4);
442 }
443 
444 /* See macro md_parse_name in tc-mmix.h.  */
445 
446 int
mmix_current_location(void (* fn)(expressionS *),expressionS * exp)447 mmix_current_location (void (*fn) (expressionS *), expressionS *exp)
448 {
449   (*fn) (exp);
450 
451   return 1;
452 }
453 
454 /* Get up to three operands, filling them into the exp array.
455    General idea and code stolen from the tic80 port.  */
456 
457 static int
get_operands(int max_operands,char * s,expressionS * exp)458 get_operands (int max_operands, char *s, expressionS *exp)
459 {
460   char *p = s;
461   int numexp = 0;
462   int nextchar = ',';
463 
464   while (nextchar == ',')
465     {
466       /* Skip leading whitespace */
467       while (*p == ' ' || *p == '\t')
468 	p++;
469 
470       /* Check to see if we have any operands left to parse */
471       if (*p == 0 || *p == '\n' || *p == '\r')
472 	{
473 	  break;
474 	}
475       else if (numexp == max_operands)
476 	{
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;
482 	}
483 
484       /* Begin operand parsing at the current scan point.  */
485 
486       input_line_pointer = p;
487       expression (&exp[numexp]);
488 
489       if (exp[numexp].X_op == O_illegal)
490 	{
491 	  as_bad (_("invalid operands"));
492 	}
493       else if (exp[numexp].X_op == O_absent)
494 	{
495 	  as_bad (_("missing operand"));
496 	}
497 
498       numexp++;
499       p = input_line_pointer;
500 
501       /* Skip leading whitespace */
502       while (*p == ' ' || *p == '\t')
503 	p++;
504       nextchar = *p++;
505     }
506 
507   /* If we allow "naked" comments, ignore the rest of the line.  */
508   if (nextchar != ',')
509     {
510       mmix_handle_rest_of_empty_line ();
511       input_line_pointer--;
512     }
513 
514   /* Mark the end of the valid operands with an illegal expression.  */
515   exp[numexp].X_op = O_illegal;
516 
517   return (numexp);
518 }
519 
520 /* Get the value of a special register, or -1 if the name does not match
521    one.  NAME is a null-terminated string.  */
522 
523 static int
get_spec_regno(char * name)524 get_spec_regno (char *name)
525 {
526   int i;
527 
528   if (name == NULL)
529     return -1;
530 
531   if (*name == ':')
532     name++;
533 
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;
539 
540   return -1;
541 }
542 
543 /* For GET and PUT, parse the register names "manually", so we don't use
544    user labels.  */
545 static int
get_putget_operands(struct mmix_opcode * insn,char * operands,expressionS * exp)546 get_putget_operands (struct mmix_opcode *insn, char *operands,
547 		     expressionS *exp)
548 {
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;
556 
557   /* Skip leading whitespace */
558   while (*p == ' ' || *p == '\t')
559     p++;
560 
561   input_line_pointer = p;
562 
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;
567 
568   if (insn->operands == mmix_operands_get)
569     {
570       expp_reg = &exp[0];
571       expp_sreg = &exp[1];
572 
573       expression (expp_reg);
574 
575       p = input_line_pointer;
576 
577       /* Skip whitespace */
578       while (*p == ' ' || *p == '\t')
579 	p++;
580 
581       if (*p == ',')
582 	{
583 	  p++;
584 
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;
594 	}
595     }
596   else
597     {
598       expp_sreg = &exp[0];
599       expp_reg = &exp[1];
600 
601       c = get_symbol_name (&sregp);
602       sregend = input_line_pointer;
603       restore_line_pointer (c);
604       p = input_line_pointer;
605 
606       /* Skip whitespace */
607       while (*p == ' ' || *p == '\t')
608 	p++;
609 
610       if (*p == ',')
611 	{
612 	  p++;
613 
614 	  /* Skip whitespace */
615 	  while (*p == ' ' || *p == '\t')
616 	    p++;
617 
618 	  input_line_pointer = p;
619 	  expression (expp_reg);
620 	}
621       *sregend = 0;
622     }
623 
624   regno = get_spec_regno (sregp);
625   *sregend = c;
626 
627   resolve_register (expp_reg);
628 
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)
634     {
635       expp_sreg->X_op = O_register;
636       expp_sreg->X_add_number = regno + 256;
637     }
638 
639   return 2;
640 }
641 
642 /* Handle MMIX-specific option.  */
643 
644 int
md_parse_option(int c,const char * arg ATTRIBUTE_UNUSED)645 md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED)
646 {
647   switch (c)
648     {
649     case 'x':
650       warn_on_expansion = 0;
651       allocate_undefined_gregs_in_linker = 1;
652       break;
653 
654     case OPTION_RELAX:
655       linkrelax = 1;
656       break;
657 
658     case OPTION_NOEXPAND:
659       expand_op = 0;
660       break;
661 
662     case OPTION_NOMERGEGREG:
663       merge_gregs = 0;
664       break;
665 
666     case OPTION_NOSYMS:
667       predefined_syms = 0;
668       equated_spec_regs = 0;
669       break;
670 
671     case OPTION_GNU_SYNTAX:
672       mmix_gnu_syntax = 1;
673       label_without_colon_this_line = 0;
674       break;
675 
676     case OPTION_GLOBALIZE_SYMBOLS:
677       mmix_globalize_symbols = 1;
678       break;
679 
680     case OPTION_FIXED_SPEC_REGS:
681       equated_spec_regs = 0;
682       break;
683 
684     case OPTION_LINKER_ALLOCATED_GREGS:
685       allocate_undefined_gregs_in_linker = 1;
686       break;
687 
688     case OPTION_NOPUSHJSTUBS:
689       pushj_stubs = 0;
690       break;
691 
692     default:
693       return 0;
694     }
695 
696   return 1;
697 }
698 
699 /* Display MMIX-specific help text.  */
700 
701 void
md_show_usage(FILE * stream)702 md_show_usage (FILE * stream)
703 {
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."));
730 }
731 
732 /* Step to end of line, but don't step over the end of the line.  */
733 
734 static void
mmix_discard_rest_of_line(void)735 mmix_discard_rest_of_line (void)
736 {
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++;
741 }
742 
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).  */
746 
747 static void
mmix_handle_rest_of_empty_line(void)748 mmix_handle_rest_of_empty_line (void)
749 {
750   if (mmix_gnu_syntax)
751     demand_empty_rest_of_line ();
752   else
753     {
754       mmix_discard_rest_of_line ();
755       input_line_pointer++;
756     }
757 }
758 
759 /* Initialize GAS MMIX specifics.  */
760 
761 void
mmix_md_begin(void)762 mmix_md_begin (void)
763 {
764   int i;
765   const struct mmix_opcode *opcode;
766 
767   /* We assume nobody will use this, so don't allocate any room.  */
768   obstack_begin (&mmix_sym_obstack, 0);
769 
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);
773 
774   mmix_opcode_hash = str_htab_create ();
775 
776   real_reg_section
777     = bfd_make_section_old_way (stdoutput, MMIX_REG_SECTION_NAME);
778 
779   for (opcode = mmix_opcodes; opcode->name; opcode++)
780     str_hash_insert (mmix_opcode_hash, opcode->name, opcode, 0);
781 
782   /* We always insert the ordinary registers 0..255 as registers.  */
783   for (i = 0; i < 256; i++)
784     {
785       char buf[16];
786 
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));
792     }
793 
794   /* Insert mmixal built-in names if allowed.  */
795   if (predefined_syms)
796     {
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));
802 
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));
815     }
816 }
817 
818 /* Assemble one insn in STR.  */
819 
820 void
md_assemble(char * str)821 md_assemble (char *str)
822 {
823   char *operands = str;
824   char modified_char = 0;
825   struct mmix_opcode *instruction;
826   fragS *opc_fragP = NULL;
827   int max_operands = 3;
828 
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;
832 
833   expressionS exp[4];
834   int n_operands = 0;
835 
836   /* Move to end of opcode.  */
837   for (operands = str;
838        is_part_of_name (*operands);
839        ++operands)
840     ;
841 
842   if (ISSPACE (*operands))
843     {
844       modified_char = *operands;
845       *operands++ = '\0';
846     }
847 
848   instruction = (struct mmix_opcode *) str_hash_find (mmix_opcode_hash, str);
849   if (instruction == NULL)
850     {
851       as_bad (_("unknown opcode: `%s'"), str);
852 
853       /* Avoid "unhandled label" errors.  */
854       pending_label = NULL;
855       return;
856     }
857 
858   /* Put back the character after the opcode.  */
859   if (modified_char != 0)
860     operands[-1] = modified_char;
861 
862   input_line_pointer = operands;
863 
864   /* Is this a mmixal pseudodirective?  */
865   if (instruction->type == mmix_type_pseudo)
866     {
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)
873 	{
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)
883 	    {
884 	      colon (pending_label);
885 	      pending_label = NULL;
886 	    }
887 	  break;
888 
889 	default:
890 	  break;
891 	}
892 
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)
896 	{
897 	case mmix_operands_loc:
898 	  /* LOC */
899 	  s_loc (0);
900 	  break;
901 
902 	case mmix_operands_byte:
903 	  /* BYTE */
904 	  mmix_byte ();
905 	  break;
906 
907 	case mmix_operands_wyde:
908 	  /* WYDE */
909 	  mmix_cons (2);
910 	  break;
911 
912 	case mmix_operands_tetra:
913 	  /* TETRA */
914 	  mmix_cons (4);
915 	  break;
916 
917 	case mmix_operands_octa:
918 	  /* OCTA */
919 	  mmix_cons (8);
920 	  break;
921 
922 	case mmix_operands_prefix:
923 	  /* PREFIX */
924 	  s_prefix (0);
925 	  break;
926 
927 	case mmix_operands_local:
928 	  /* LOCAL */
929 	  mmix_s_local (0);
930 	  break;
931 
932 	case mmix_operands_bspec:
933 	  /* BSPEC */
934 	  s_bspec (0);
935 	  break;
936 
937 	case mmix_operands_espec:
938 	  /* ESPEC */
939 	  s_espec (0);
940 	  break;
941 
942 	default:
943 	  BAD_CASE (instruction->operands);
944 	}
945 
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--;
950 
951       /* Step up the fb-label counter if there was a definition on this
952 	 line.  */
953       if (current_fb_label >= 0)
954 	{
955 	  fb_label_instance_inc (current_fb_label);
956 	  current_fb_label = -1;
957 	}
958 
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;
963 
964       return;
965     }
966 
967   /* Not a pseudo; we *will* emit contents.  */
968   if (now_seg == data_section)
969     {
970       if (lowest_data_loc != (bfd_vma) -1 && (lowest_data_loc & 3) != 0)
971 	{
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"));
976 
977 	  lowest_data_loc &= ~(bfd_vma) 3;
978 	  lowest_data_loc += 4;
979 	}
980 
981       data_has_contents = 1;
982     }
983   else if (now_seg == text_section)
984     {
985       if (lowest_text_loc != (bfd_vma) -1 && (lowest_text_loc & 3) != 0)
986 	{
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"));
991 
992 	  lowest_text_loc &= ~(bfd_vma) 3;
993 	  lowest_text_loc += 4;
994 	}
995 
996       text_has_contents = 1;
997     }
998 
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)
1003     {
1004       frag_align (2, 0, 0);
1005       record_alignment (now_seg, 2);
1006       last_alignment = 2;
1007     }
1008   else
1009     /* Reset any don't-align-next-datum request.  */
1010     want_unaligned = 0;
1011 
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)
1016     {
1017       colon (pending_label);
1018       pending_label = NULL;
1019     }
1020 
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.  */
1024 
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)
1028     {
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;
1040 
1041     case mmix_operands_sync:
1042     case mmix_operands_jmp:
1043     case mmix_operands_resume:
1044       max_operands = 1;
1045       break;
1046 
1047       /* The original 3 is fine for the rest.  */
1048     default:
1049       break;
1050     }
1051 
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);
1061 
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)
1066     {
1067       fb_label_instance_inc (current_fb_label);
1068       colon (fb_label_name (current_fb_label, 0));
1069       current_fb_label = -1;
1070     }
1071 
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.  */
1076 
1077   opcodep = frag_more (4);
1078   mmix_opcode_frag = opc_fragP = frag_now;
1079   frag_now->fr_opcode = opcodep;
1080 
1081   /* Mark start of insn for DWARF2 debug features.  */
1082   if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1083     dwarf2_emit_insn (4);
1084 
1085   md_number_to_chars (opcodep, instruction->match, 4);
1086 
1087   switch (instruction->operands)
1088     {
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;
1094 
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)
1099 	{
1100 	  as_bad (_("invalid operand to opcode %s: `%s'"),
1101 		  instruction->name, operands);
1102 	  return;
1103 	}
1104 
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;
1115 
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)))
1121 	{
1122 	  as_bad (_("invalid operands to opcode %s: `%s'"),
1123 		  instruction->name, operands);
1124 	  return;
1125 	}
1126 
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);
1132 
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;
1143 
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)
1148 	{
1149 	  as_bad (_("invalid operands to opcode %s: `%s'"),
1150 		  instruction->name, operands);
1151 	  return;
1152 	}
1153 
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;
1170 
1171     default:
1172       break;
1173     }
1174 
1175   switch (instruction->operands)
1176     {
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)
1181 	{
1182 	  as_bad (_("invalid operands to opcode %s: `%s'"),
1183 		  instruction->name, operands);
1184 	  return;
1185 	}
1186       /* FALLTHROUGH.  */
1187     case mmix_operands_regs_z:
1188       if (n_operands != 3)
1189 	{
1190 	  as_bad (_("invalid operands to opcode %s: `%s'"),
1191 		  instruction->name, operands);
1192 	  return;
1193 	}
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))
1206 	{
1207 	  as_bad (_("invalid operands to opcode %s: `%s'"),
1208 		  instruction->name, operands);
1209 	  return;
1210 	}
1211 
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;
1218 
1219     default:
1220       ;
1221     }
1222 
1223   /* A corresponding once-over for those who take an 8-bit constant as
1224      their first operand.  */
1225   switch (instruction->operands)
1226     {
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)))
1234 	{
1235 	  as_bad (_("invalid operands to opcode %s: `%s'"),
1236 		  instruction->name, operands);
1237 	  return;
1238 	}
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;
1245 
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)))
1255 	{
1256 	  as_bad (_("invalid operands to opcode %s: `%s'"),
1257 		  instruction->name, operands);
1258 	  return;
1259 	}
1260 
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:
1268       ;
1269     }
1270 
1271   /* Handle the rest.  */
1272   switch (instruction->operands)
1273     {
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)))
1280 	{
1281 	  as_bad (_("invalid operands to opcode %s: `%s'"),
1282 		  instruction->name, operands);
1283 	  return;
1284 	}
1285 
1286       if (exp[1].X_op == O_constant)
1287 	{
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.
1292 
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);
1296 
1297 	  opcodep[2] = (exp[1].X_add_number >> 8) & 255;
1298 	  opcodep[3] = exp[1].X_add_number & 255;
1299 	  break;
1300 	}
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).  */
1318 
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)))))
1328 	{
1329 	  as_bad (_("invalid operands to opcode %s: `%s'"),
1330 		  instruction->name, operands);
1331 	  return;
1332 	}
1333 
1334       if (n_operands == 2)
1335 	{
1336 	  symbolS *sym;
1337 	  fixS *tmpfixP;
1338 
1339 	  /* The last operand is immediate whenever we see just two
1340 	     operands.  */
1341 	  opcodep[0] |= IMM_OFFSET_BIT;
1342 
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)
1350 	    {
1351 	      /* A zero then; all done.  */
1352 	      opcodep[2] = exp[1].X_add_number;
1353 	      break;
1354 	    }
1355 
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))
1368 	    {
1369 	      fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
1370 			   1, exp + 1, 0, BFD_RELOC_MMIX_REG);
1371 	      break;
1372 	    }
1373 
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);
1379 
1380 	  /* Mark the symbol as being OK for a reloc.  */
1381 	  symbol_get_bfdsym (sym)->flags |= BSF_KEEP;
1382 
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;
1394 	}
1395 
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);
1401 
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))
1410 	{
1411 	  opcodep[3] = exp[2].X_add_number;
1412 	  opcodep[0] |= IMM_OFFSET_BIT;
1413 	}
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;
1421 
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)))
1435 	{
1436 	  as_bad (_("invalid operands to opcode %s: `%s'"),
1437 		  instruction->name, operands);
1438 	  return;
1439 	}
1440 
1441       if (exp[1].X_op == O_constant)
1442 	{
1443 	  opcodep[2] = (exp[1].X_add_number >> 8) & 255;
1444 	  opcodep[3] = exp[1].X_add_number & 255;
1445 	}
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;
1451 
1452     case mmix_operands_jmp:
1453       /* A JMP.  Everything is already done.  */
1454       break;
1455 
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))
1460 	{
1461 	  as_bad (_("invalid operands to opcode %s: `%s'"),
1462 		  instruction->name, operands);
1463 	  return;
1464 	}
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.  */
1469       {
1470 	/* Which exp index holds the second operand (not the rounding
1471 	   mode).  */
1472 	int op2no = n_operands - 1;
1473 
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))))
1492 	  {
1493 	    as_bad (_("invalid operands to opcode %s: `%s'"),
1494 		    instruction->name, operands);
1495 	    return;
1496 	  }
1497 
1498 	/* Add rounding mode if present.  */
1499 	if (n_operands == 3)
1500 	  opcodep[2] = exp[1].X_add_number & 255;
1501 
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)
1505 	  {
1506 	    opcodep[3] = exp[op2no].X_add_number;
1507 	    opcodep[0] |= IMM_OFFSET_BIT;
1508 	  }
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;
1516       }
1517 
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)))
1524 	{
1525 	  as_bad (_("invalid operands to opcode %s: `%s'"),
1526 		  instruction->name, operands);
1527 	  return;
1528 	}
1529 
1530       if (exp[0].X_op == O_constant)
1531 	{
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;
1535 	}
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;
1541 
1542     case mmix_operands_neg:
1543       /* Operands "$X,Y,$Z|Z"; NEG or NEGU.  Y is optional, 0 is default.  */
1544 
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)))))
1554 	{
1555 	  as_bad (_("invalid operands to opcode %s: `%s'"),
1556 		  instruction->name, operands);
1557 	  return;
1558 	}
1559 
1560       if (n_operands == 2)
1561 	{
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)
1565 	    {
1566 	      opcodep[3] = exp[1].X_add_number;
1567 	      opcodep[0] |= IMM_OFFSET_BIT;
1568 	    }
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;
1573 	}
1574 
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);
1580 
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)
1584 	{
1585 	  opcodep[3] = exp[2].X_add_number;
1586 	  opcodep[0] |= IMM_OFFSET_BIT;
1587 	}
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;
1592 
1593     case mmix_operands_regaddr:
1594       /* A GETA/branch-type.  */
1595       break;
1596 
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))
1607 	{
1608 	  as_bad (_("invalid operands to opcode %s: `%s'"),
1609 		  instruction->name, operands);
1610 	  return;
1611 	}
1612 
1613       opcodep[3] = exp[1].X_add_number - 256;
1614       break;
1615 
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))
1624 	{
1625 	  as_bad (_("invalid operands to opcode %s: `%s'"),
1626 		  instruction->name, operands);
1627 	  return;
1628 	}
1629 
1630       opcodep[1] = exp[0].X_add_number - 256;
1631 
1632       /* Note that the Y field is zero.  */
1633 
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)
1637 	{
1638 	  opcodep[3] = exp[1].X_add_number;
1639 	  opcodep[0] |= IMM_OFFSET_BIT;
1640 	}
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;
1645 
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)
1651 	{
1652 	  as_bad (_("invalid operands to opcode %s: `%s'"),
1653 		  instruction->name, operands);
1654 	  return;
1655 	}
1656       break;
1657 
1658     case mmix_operands_unsave:
1659       if (n_operands < 2 && ! mmix_gnu_syntax)
1660 	{
1661 	  if (n_operands == 1)
1662 	    {
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);
1668 	    }
1669 	  break;
1670 	}
1671 
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))
1679 	{
1680 	  as_bad (_("invalid operands to opcode %s: `%s'"),
1681 		  instruction->name, operands);
1682 	  return;
1683 	}
1684 
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;
1691 
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.  */
1702 	;
1703       else if (n_operands == 1 && exp[0].X_op != O_register)
1704 	{
1705 	  if (exp[0].X_op == O_constant)
1706 	    {
1707 	      if (exp[0].X_add_number > 255*256*256
1708 		  || exp[0].X_add_number < 0)
1709 		{
1710 		  as_bad (_("invalid operands to opcode %s: `%s'"),
1711 			  instruction->name, operands);
1712 		  return;
1713 		}
1714 	      else
1715 		{
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;
1719 		}
1720 	    }
1721 	  else
1722 	    fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1,
1723 			 3, exp, 0, BFD_RELOC_24);
1724 	}
1725       else if (n_operands == 2
1726 	       && exp[0].X_op != O_register
1727 	       && exp[1].X_op != O_register)
1728 	{
1729 	  /* Two operands.  */
1730 
1731 	  if (exp[0].X_op == O_constant)
1732 	    {
1733 	      if (exp[0].X_add_number > 255
1734 		  || exp[0].X_add_number < 0)
1735 		{
1736 		  as_bad (_("invalid operands to opcode %s: `%s'"),
1737 			  instruction->name, operands);
1738 		  return;
1739 		}
1740 	      else
1741 		opcodep[1] = exp[0].X_add_number & 255;
1742 	    }
1743 	  else
1744 	    fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1,
1745 			 1, exp, 0, BFD_RELOC_8);
1746 
1747 	  if (exp[1].X_op == O_constant)
1748 	    {
1749 	      if (exp[1].X_add_number > 255*256
1750 		  || exp[1].X_add_number < 0)
1751 		{
1752 		  as_bad (_("invalid operands to opcode %s: `%s'"),
1753 			  instruction->name, operands);
1754 		  return;
1755 		}
1756 	      else
1757 		{
1758 		  opcodep[2] = (exp[1].X_add_number >> 8) & 255;
1759 		  opcodep[3] = exp[1].X_add_number & 255;
1760 		}
1761 	    }
1762 	  else
1763 	    fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
1764 			 2, exp + 1, 0, BFD_RELOC_16);
1765 	}
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)
1770 	{
1771 	  /* Three operands.  */
1772 
1773 	  if (exp[0].X_op == O_constant)
1774 	    {
1775 	      if (exp[0].X_add_number > 255
1776 		  || exp[0].X_add_number < 0)
1777 		{
1778 		  as_bad (_("invalid operands to opcode %s: `%s'"),
1779 			  instruction->name, operands);
1780 		  return;
1781 		}
1782 	      else
1783 		opcodep[1] = exp[0].X_add_number & 255;
1784 	    }
1785 	  else
1786 	    fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1,
1787 			 1, exp, 0, BFD_RELOC_8);
1788 
1789 	  if (exp[1].X_op == O_constant)
1790 	    {
1791 	      if (exp[1].X_add_number > 255
1792 		  || exp[1].X_add_number < 0)
1793 		{
1794 		  as_bad (_("invalid operands to opcode %s: `%s'"),
1795 			  instruction->name, operands);
1796 		  return;
1797 		}
1798 	      else
1799 		opcodep[2] = exp[1].X_add_number & 255;
1800 	    }
1801 	  else
1802 	    fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
1803 			 1, exp + 1, 0, BFD_RELOC_8);
1804 
1805 	  if (exp[2].X_op == O_constant)
1806 	    {
1807 	      if (exp[2].X_add_number > 255
1808 		  || exp[2].X_add_number < 0)
1809 		{
1810 		  as_bad (_("invalid operands to opcode %s: `%s'"),
1811 			  instruction->name, operands);
1812 		  return;
1813 		}
1814 	      else
1815 		opcodep[3] = exp[2].X_add_number & 255;
1816 	    }
1817 	  else
1818 	    fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3,
1819 			 1, exp + 2, 0, BFD_RELOC_8);
1820 	}
1821       else
1822 	{
1823 	  /* We can't get here for other cases.  */
1824 	  gas_assert (n_operands <= 3);
1825 
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)
1831 	    {
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.
1838 
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);
1857 	    }
1858 	  else if (n_operands == 2)
1859 	    {
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);
1870 	    }
1871 	  else
1872 	    {
1873 	      /* We can't get here for other cases.  */
1874 	      gas_assert (n_operands == 1 && exp[0].X_op == O_register);
1875 
1876 	      opcodep[3] = exp[0].X_add_number;
1877 	    }
1878 	}
1879       break;
1880 
1881     case mmix_operands_resume:
1882       if (n_operands == 0 && ! mmix_gnu_syntax)
1883 	break;
1884 
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)))
1890 	{
1891 	  as_bad (_("invalid operands to opcode %s: `%s'"),
1892 		  instruction->name, operands);
1893 	  return;
1894 	}
1895 
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;
1902 
1903     case mmix_operands_pushj:
1904       /* All is done for PUSHJ already.  */
1905       break;
1906 
1907     default:
1908       BAD_CASE (instruction->operands);
1909     }
1910 }
1911 
1912 /* For the benefit of insns that start with a digit, we assemble by way of
1913    tc_unrecognized_line too, through this function.  */
1914 
1915 int
mmix_assemble_return_nonzero(char * str)1916 mmix_assemble_return_nonzero (char *str)
1917 {
1918   int last_error_count = had_errors ();
1919   char *s2 = str;
1920   char c;
1921 
1922   /* Normal instruction handling downcases, so we must too.  */
1923   while (ISALNUM (*s2))
1924     {
1925       if (ISUPPER ((unsigned char) *s2))
1926 	*s2 = TOLOWER (*s2);
1927       s2++;
1928     }
1929 
1930   /* Cut the line for sake of the assembly.  */
1931   for (s2 = str; *s2 && *s2 != '\n'; s2++)
1932     ;
1933 
1934   c = *s2;
1935   *s2 = 0;
1936   md_assemble (str);
1937   *s2 = c;
1938 
1939   return had_errors () == last_error_count;
1940 }
1941 
1942 /* The PREFIX pseudo.  */
1943 
1944 static void
s_prefix(int unused ATTRIBUTE_UNUSED)1945 s_prefix (int unused ATTRIBUTE_UNUSED)
1946 {
1947   char *p;
1948   int c;
1949 
1950   SKIP_WHITESPACE ();
1951 
1952   c = get_symbol_name (&p);
1953 
1954   /* Resetting prefix?  */
1955   if (*p == ':' && p[1] == 0)
1956     mmix_current_prefix = NULL;
1957   else
1958     {
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);
1964 
1965       /* Accumulate prefixes, and strip a leading ':'.  */
1966       if (mmix_current_prefix != NULL || *p == ':')
1967 	p = mmix_prefix_name (p);
1968 
1969       mmix_current_prefix = p;
1970     }
1971 
1972   (void) restore_line_pointer (c);
1973 
1974   mmix_handle_rest_of_empty_line ();
1975 }
1976 
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).  */
1983 
1984 char *
mmix_prefix_name(char * shortname)1985 mmix_prefix_name (char *shortname)
1986 {
1987   if (*shortname == ':')
1988     return shortname + 1;
1989 
1990   if (mmix_current_prefix == NULL)
1991     as_fatal (_("internal: mmix_prefix_name but empty prefix"));
1992 
1993   if (*shortname == '$')
1994     return shortname;
1995 
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);
2000 }
2001 
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.  */
2007 
2008 static void
mmix_greg_internal(char * label)2009 mmix_greg_internal (char *label)
2010 {
2011   expressionS *expP = &mmix_raw_gregs[n_of_raw_gregs].exp;
2012   segT section;
2013 
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);
2017 
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)
2021     {
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;
2028     }
2029 
2030   if (section == undefined_section)
2031     {
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)
2037 	{
2038 	  symbol_get_value_expression (expP->X_op_symbol);
2039 	  symbol_get_value_expression (expP->X_add_symbol);
2040 	}
2041       else
2042 	{
2043 	  gas_assert (expP->X_op == O_symbol);
2044 	  symbol_get_value_expression (expP->X_add_symbol);
2045 	}
2046     }
2047 
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);
2052 
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++;
2057 
2058   mmix_handle_rest_of_empty_line ();
2059 }
2060 
2061 /* The ".greg label,expr" worker.  */
2062 
2063 static void
s_greg(int unused ATTRIBUTE_UNUSED)2064 s_greg (int unused ATTRIBUTE_UNUSED)
2065 {
2066   char *p;
2067   char c;
2068 
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);
2074 
2075   if (c == '"')
2076     c = * ++ input_line_pointer;
2077 
2078   if (! is_end_of_line[(unsigned char) c])
2079     input_line_pointer++;
2080 
2081   if (*p)
2082     {
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));
2087     }
2088   else
2089     mmix_greg_internal (NULL);
2090 }
2091 
2092 /* The "BSPEC expr" worker.  */
2093 
2094 static void
s_bspec(int unused ATTRIBUTE_UNUSED)2095 s_bspec (int unused ATTRIBUTE_UNUSED)
2096 {
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;
2103 
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 ();
2110 
2111   /* Check that we don't have another BSPEC in progress.  */
2112   if (doing_bspec)
2113     {
2114       as_bad (_("BSPEC already active.  Nesting is not supported."));
2115       return;
2116     }
2117 
2118   if (exp.X_op != O_constant
2119       || expsec != absolute_section
2120       || exp.X_add_number < 0
2121       || exp.X_add_number > 65535)
2122     {
2123       as_bad (_("invalid BSPEC expression"));
2124       exp.X_add_number = 0;
2125     }
2126 
2127   n = (int) exp.X_add_number;
2128 
2129   sprintf (secname + strlen (MMIX_OTHER_SPEC_SECTION_PREFIX), "%d", n);
2130   sec = bfd_get_section_by_name (stdoutput, secname);
2131   if (sec == NULL)
2132     {
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);
2137 
2138       if (sec == NULL)
2139 	as_fatal (_("can't create section %s"), newsecname);
2140 
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);
2144     }
2145 
2146   /* Tell ELF about the pending section change.  */
2147   obj_elf_section_change_hook ();
2148   subseg_set (sec, 0);
2149 
2150   /* Save position for missing ESPEC.  */
2151   bspec_file = as_where (&bspec_line);
2152 
2153   doing_bspec = 1;
2154 }
2155 
2156 /* The "ESPEC" worker.  */
2157 
2158 static void
s_espec(int unused ATTRIBUTE_UNUSED)2159 s_espec (int unused ATTRIBUTE_UNUSED)
2160 {
2161   /* First, check that we *do* have a BSPEC in progress.  */
2162   if (! doing_bspec)
2163     {
2164       as_bad (_("ESPEC without preceding BSPEC"));
2165       return;
2166     }
2167 
2168   mmix_handle_rest_of_empty_line ();
2169   doing_bspec = 0;
2170 
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);
2175 }
2176 
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.  */
2180 
2181 static void
mmix_s_local(int unused ATTRIBUTE_UNUSED)2182 mmix_s_local (int unused ATTRIBUTE_UNUSED)
2183 {
2184   expressionS exp;
2185 
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);
2190 
2191   if (exp.X_op == O_absent)
2192     {
2193       as_bad (_("missing local expression"));
2194       return;
2195     }
2196   else if (exp.X_op == O_register)
2197     {
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;
2201     }
2202 
2203   fix_new_exp (frag_now, 0, 0, &exp, 0, BFD_RELOC_MMIX_LOCAL);
2204   mmix_handle_rest_of_empty_line ();
2205 }
2206 
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.  */
2210 
2211 int
md_estimate_size_before_relax(fragS * fragP,segT segment)2212 md_estimate_size_before_relax (fragS *fragP, segT segment)
2213 {
2214   int length;
2215 
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))				\
2221      {									\
2222        /* The symbol lies in the same segment - a relaxable case.  */	\
2223        fragP->fr_subtype						\
2224 	 = ENCODE_RELAX (state, STATE_ZERO);				\
2225      }									\
2226    break;
2227 
2228   switch (fragP->fr_subtype)
2229     {
2230       HANDLE_RELAXABLE (STATE_GETA);
2231       HANDLE_RELAXABLE (STATE_BCC);
2232       HANDLE_RELAXABLE (STATE_JMP);
2233 
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;
2250 
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;
2257 
2258     case STATE_GREG_DEF:
2259       length = fragP->tc_frag_data != NULL ? 0 : 8;
2260       fragP->fr_var = length;
2261 
2262       /* Don't consult the relax_table; it isn't valid for this
2263 	 relaxation.  */
2264       return length;
2265       break;
2266 
2267     default:
2268       BAD_CASE (fragP->fr_subtype);
2269     }
2270 
2271   length = mmix_relax_table[fragP->fr_subtype].rlx_length;
2272   fragP->fr_var = length;
2273 
2274   return length;
2275 }
2276 
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.  */
2281 
2282 const char *
md_atof(int type,char * litP,int * sizeP)2283 md_atof (int type, char *litP, int *sizeP)
2284 {
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);
2293 }
2294 
2295 /* Convert variable-sized frags into one or more fixups.  */
2296 
2297 void
md_convert_frag(bfd * abfd ATTRIBUTE_UNUSED,segT sec ATTRIBUTE_UNUSED,fragS * fragP)2298 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec ATTRIBUTE_UNUSED,
2299 		 fragS *fragP)
2300 {
2301   /* Pointer to first byte in variable-sized part of the frag.  */
2302   char *var_partp;
2303 
2304   /* Pointer to first opcode byte in frag.  */
2305   char *opcodep;
2306 
2307   /* Size in bytes of variable-sized part of frag.  */
2308   int var_part_size = 0;
2309 
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;
2314 
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;
2319 
2320   /* Where, in file space, does addr point?  */
2321   bfd_vma target_address;
2322   bfd_vma opcode_address;
2323 
2324   know (fragP->fr_type == rs_machine_dependent);
2325 
2326   var_part_offset = fragP->fr_fix;
2327   var_partp = fragP->fr_literal + var_part_offset;
2328   opcodep = fragP->fr_opcode;
2329 
2330   symbolP = fragP->fr_symbol;
2331 
2332   target_address
2333     = ((symbolP ? S_GET_VALUE (symbolP) : 0) + fragP->fr_offset);
2334 
2335   /* The opcode that would be extended is the last four "fixed" bytes.  */
2336   opcode_address = fragP->fr_address + fragP->fr_fix - 4;
2337 
2338   switch (fragP->fr_subtype)
2339     {
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;
2348 
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;
2356 
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)
2362 	{
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);
2368 	}
2369       var_part_size = 0;
2370       break;
2371 
2372     case ENCODE_RELAX (STATE_JMP, STATE_ZERO):
2373       mmix_set_jmp_offset (opcodep, target_address - opcode_address);
2374       if (linkrelax)
2375 	{
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);
2381 	}
2382       var_part_size = 0;
2383       break;
2384 
2385     case STATE_GREG_DEF:
2386       if (fragP->tc_frag_data == NULL)
2387 	{
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;
2398 	}
2399       else
2400 	var_part_size = 0;
2401       break;
2402 
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
2415 
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);
2420 
2421     default:
2422       BAD_CASE (fragP->fr_subtype);
2423       break;
2424     }
2425 
2426   fragP->fr_fix += var_part_size;
2427   fragP->fr_var = 0;
2428 }
2429 
2430 /* Applies the desired value to the specified location.
2431    Also sets up addends for RELA type relocations.
2432    Stolen from tc-mcore.c.
2433 
2434    Note that this function isn't called when linkrelax != 0.  */
2435 
2436 void
md_apply_fix(fixS * fixP,valueT * valP,segT segment)2437 md_apply_fix (fixS *fixP, valueT *valP, segT segment)
2438 {
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));
2445 
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))))
2458     {
2459       fixP->fx_done = 0;
2460       return;
2461     }
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)
2465     {
2466       /* These are never "fixed".  */
2467       fixP->fx_done = 0;
2468       return;
2469     }
2470   else
2471     /* We assume every other relocation is "fixed".  */
2472     fixP->fx_done = 1;
2473 
2474   switch (fixP->fx_r_type)
2475     {
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;
2488 
2489     case BFD_RELOC_MMIX_ADDR19:
2490       if (expand_op)
2491 	{
2492 	  /* This shouldn't happen.  */
2493 	  BAD_CASE (fixP->fx_r_type);
2494 	  break;
2495 	}
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)
2506 	{
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;
2512 	}
2513       mmix_set_geta_branch_offset (buf, val);
2514       break;
2515 
2516     case BFD_RELOC_MMIX_ADDR27:
2517       if (expand_op)
2518 	{
2519 	  /* This shouldn't happen.  */
2520 	  BAD_CASE (fixP->fx_r_type);
2521 	  break;
2522 	}
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)
2530 	{
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;
2536 	}
2537       mmix_set_jmp_offset (buf, val);
2538       break;
2539 
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)
2545 	{
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;
2551 	}
2552 
2553       buf[0] = val;
2554 
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?  */
2558 
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;
2564 
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)
2569 	{
2570 	  as_bad_where (fixP->fx_file, fixP->fx_line,
2571 			_("invalid operands"));
2572 	  fixP->fx_done = 1;
2573 	}
2574 
2575       *buf = val;
2576       break;
2577 
2578     case BFD_RELOC_MMIX_BASE_PLUS_OFFSET:
2579       /* These are never "fixed".  */
2580       fixP->fx_done = 0;
2581       return;
2582 
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;
2599     }
2600 
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;
2605 }
2606 
2607 /* A bsearch function for looking up a value against offsets for GREG
2608    definitions.  */
2609 
2610 static int
cmp_greg_val_greg_symbol_fixes(const void * p1,const void * p2)2611 cmp_greg_val_greg_symbol_fixes (const void *p1, const void *p2)
2612 {
2613   offsetT val1 = *(offsetT *) p1;
2614   offsetT val2 = ((struct mmix_symbol_greg_fixes *) p2)->offs;
2615 
2616   if (val1 >= val2 && val1 < val2 + 255)
2617     return 0;
2618 
2619   if (val1 > val2)
2620     return 1;
2621 
2622   return -1;
2623 }
2624 
2625 /* Generate a machine-dependent relocation.  */
2626 
2627 arelent *
tc_gen_reloc(asection * section ATTRIBUTE_UNUSED,fixS * fixP)2628 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixP)
2629 {
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));
2645 
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"));
2663 
2664   /* FIXME: Range tests for all these.  */
2665   switch (fixP->fx_r_type)
2666     {
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;
2673 
2674       if (addsy == NULL || bfd_is_abs_section (addsec))
2675 	{
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;
2685 	}
2686       break;
2687 
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;
2718 
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))
2727 	{
2728 	  code = fixP->fx_r_type;
2729 	  break;
2730 	}
2731 
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;
2740 
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;
2746 
2747       buf[0] = val;
2748       return NULL;
2749 
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)
2754 	{
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;
2759 	}
2760 
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.
2763 
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)
2767 	{
2768 	  struct mmix_symbol_gregs *gregs;
2769 	  struct mmix_symbol_greg_fixes *fix;
2770 
2771 	  if (S_IS_DEFINED (addsy)
2772 	      && !bfd_is_com_section (addsec)
2773 	      && !S_IS_WEAK (addsy))
2774 	    {
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"));
2777 
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))
2786 		{
2787 		  val -= (offsetT) lowest_data_loc;
2788 		  addsy = section_symbol (data_section);
2789 		}
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))
2794 		{
2795 		  val -= (offsetT) lowest_text_loc;
2796 		  addsy = section_symbol (text_section);
2797 		}
2798 	    }
2799 
2800 	  gregs = *symbol_get_tc (addsy);
2801 
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)
2813 	    {
2814 	      /* We can either let the linker allocate GREGs
2815 		 automatically, or emit an error.  */
2816 	      if (allocate_undefined_gregs_in_linker)
2817 		{
2818 		  /* The values in baddsy and addend are right.  */
2819 		  code = fixP->fx_r_type;
2820 		  break;
2821 		}
2822 	      else
2823 		as_bad_where (fixP->fx_file, fixP->fx_line,
2824 			      _("no suitable GREG definition for operands"));
2825 	      return NULL;
2826 	    }
2827 	  else
2828 	    {
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);
2838 
2839 	      addend = fix->fix->fx_frag->fr_address + fix->fix->fx_where;
2840 	    }
2841 	}
2842       else if (S_GET_VALUE (addsy) > 255)
2843 	as_bad_where (fixP->fx_file, fixP->fx_line,
2844 		      _("invalid operands"));
2845       else
2846 	{
2847 	  *buf = val;
2848 	  return NULL;
2849 	}
2850       break;
2851 
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))
2857 	{
2858 	  code = fixP->fx_r_type;
2859 	  break;
2860 	}
2861 
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.  */
2868 	;
2869       else
2870 	{
2871 	  buf[0] = val;
2872 	  return NULL;
2873 	}
2874       /* FALLTHROUGH.  */
2875 
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"));
2884 
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;
2889     }
2890 
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;
2896 
2897   relP->addend = addend;
2898 
2899   /* If this had been a.out, we would have had a kludge for weak symbols
2900      here.  */
2901 
2902   relP->howto = bfd_reloc_type_lookup (stdoutput, code);
2903   if (! relP->howto)
2904     {
2905       const char *name;
2906 
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));
2912     }
2913 
2914   return relP;
2915 }
2916 
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.  */
2920 
2921 void
mmix_handle_mmixal(void)2922 mmix_handle_mmixal (void)
2923 {
2924   char *insn;
2925   char *s = input_line_pointer;
2926   char *label = NULL;
2927   char c;
2928 
2929   if (pending_label != NULL)
2930     as_fatal (_("internal: unhandled label %s"), pending_label);
2931 
2932   if (mmix_gnu_syntax)
2933     return;
2934 
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]))
2939     {
2940       current_fb_label = s[0] - '0';
2941 
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;
2948 
2949       while (*s && ISSPACE (*s) && ! is_end_of_line[(unsigned int) *s])
2950 	s++;
2951 
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])
2955 	{
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;
2961 	}
2962       if (*s == '.')
2963 	{
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;
2969 	}
2970 
2971       /* Back off to the last space before the opcode so we don't handle
2972 	 the opcode as a label.  */
2973       s--;
2974     }
2975   else
2976     current_fb_label = -1;
2977 
2978   if (*s == '.')
2979     {
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;
2985     }
2986 
2987   if (*s == 0 || is_end_of_line[(unsigned int) *s])
2988     /* We avoid handling empty lines here.  */
2989     return;
2990 
2991   if (is_name_beginner (*s))
2992     label = s;
2993 
2994   /* If there is a label, skip over it.  */
2995   while (*s && is_part_of_name (*s))
2996     s++;
2997 
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 */
3004     ;
3005 
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 != '.')
3019     {
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.  */
3022 
3023       /* Make room for the label including the ending nul.  */
3024       size_t len_0 = s - label + 1;
3025 
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;
3032     }
3033 
3034   /* If we have a non-MMIXAL pseudo, we have not business with the rest of
3035      the line.  */
3036   if (*insn == '.')
3037     return;
3038 
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.  */
3046 
3047   /* First make sure we don't have any of the magic characters on the line
3048      appearing as input.  */
3049   while (*s)
3050     {
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"));
3056     }
3057 
3058   /* Scan again, this time looking for ';' after operands.  */
3059   s = insn;
3060 
3061   /* Skip the insn.  */
3062   while (*s
3063 	 && ! ISSPACE (*s)
3064 	 && *s != ';'
3065 	 && ! is_end_of_line[(unsigned int) *s])
3066     s++;
3067 
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++;
3074 
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])
3081     {
3082       if (c == '"')
3083 	{
3084 	  s++;
3085 
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++;
3091 
3092 	  if (*s == '"')
3093 	    s++;
3094 	}
3095       else if (ISDIGIT (c))
3096 	{
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
3104 	    {
3105 	      s[0] = (s[1] == 'B'
3106 		      ? MAGIC_FB_BACKWARD_CHAR : MAGIC_FB_FORWARD_CHAR);
3107 	      s[1] = c;
3108 	    }
3109 	}
3110       else
3111 	s++;
3112     }
3113 
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++;
3120 
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 == ';');
3124 
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]))
3129     {
3130       *s = '=';
3131       s[1] = ' ';
3132 
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;
3136 
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 ();
3142 
3143       /* A fb-label is valid as an IS-label.  */
3144       if (current_fb_label >= 0)
3145 	{
3146 	  char *fb_name;
3147 
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;
3157 	}
3158       else
3159 	{
3160 	  if (pending_label == NULL)
3161 	    as_bad (_("empty label field for IS"));
3162 	  else
3163 	    equals (pending_label, 0);
3164 	  pending_label = NULL;
3165 	}
3166 
3167       /* For mmixal, we can have comments without a comment-start
3168 	 character.   */
3169       mmix_handle_rest_of_empty_line ();
3170       input_line_pointer--;
3171 
3172       input_line_pointer[-1] = ' ';
3173     }
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]]))
3178     {
3179       input_line_pointer = s + 4;
3180 
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 ();
3186 
3187       /* A fb-label is valid as a GREG-label.  */
3188       if (current_fb_label >= 0)
3189 	{
3190 	  char *fb_name;
3191 
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);
3197 
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;
3205 	}
3206       else
3207 	mmix_greg_internal (pending_label);
3208 
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] = ' ';
3213 
3214       pending_label = NULL;
3215     }
3216   else if (pending_label != NULL)
3217     {
3218       input_line_pointer += strlen (pending_label);
3219 
3220       /* See comment above about getting line numbers bumped.  */
3221       input_line_pointer[-1] = '\n';
3222     }
3223 }
3224 
3225 /* Give the value of an fb-label rewritten as in mmix_handle_mmixal, when
3226    parsing an expression.
3227 
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.  */
3231 
3232 void
mmix_fb_label(expressionS * expP)3233 mmix_fb_label (expressionS *expP)
3234 {
3235   symbolS *sym;
3236   char *fb_internal_name;
3237 
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;
3243 
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));
3256 
3257   input_line_pointer += 2;
3258   sym = symbol_find_or_make (fb_internal_name);
3259 
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)
3265     {
3266       expP->X_op = O_constant;
3267       expP->X_add_number = S_GET_VALUE (sym);
3268     }
3269   else
3270     {
3271       expP->X_op = O_symbol;
3272       expP->X_add_symbol = sym;
3273       expP->X_add_number = 0;
3274     }
3275 }
3276 
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.  */
3280 
3281 int
mmix_force_relocation(fixS * fixP)3282 mmix_force_relocation (fixS *fixP)
3283 {
3284   if (fixP->fx_r_type == BFD_RELOC_MMIX_LOCAL
3285       || fixP->fx_r_type == BFD_RELOC_MMIX_BASE_PLUS_OFFSET)
3286     return 1;
3287 
3288   if (linkrelax)
3289     return 1;
3290 
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;
3297 
3298   return generic_force_reloc (fixP);
3299 }
3300 
3301 /* The location from which a PC relative jump should be calculated,
3302    given a PC relative reloc.  */
3303 
3304 long
md_pcrel_from_section(fixS * fixP,segT sec)3305 md_pcrel_from_section (fixS *fixP, segT sec)
3306 {
3307   if (fixP->fx_addsy != (symbolS *) NULL
3308       && (! S_IS_DEFINED (fixP->fx_addsy)
3309 	  || S_GET_SEGMENT (fixP->fx_addsy) != sec))
3310     {
3311       /* The symbol is undefined (or is defined but not in this section).
3312 	 Let the linker figure it out.  */
3313       return 0;
3314     }
3315 
3316   return (fixP->fx_frag->fr_address + fixP->fx_where);
3317 }
3318 
3319 /* Adjust the symbol table.  We make reg_section relative to the real
3320    register section.  */
3321 
3322 void
mmix_adjust_symtab(void)3323 mmix_adjust_symtab (void)
3324 {
3325   symbolS *sym;
3326   symbolS *regsec = section_symbol (reg_section);
3327 
3328   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
3329     if (S_GET_SEGMENT (sym) == reg_section)
3330       {
3331 	if (sym == regsec)
3332 	  {
3333 	    if (S_IS_EXTERNAL (sym) || symbol_used_in_reloc_p (sym))
3334 	      abort ();
3335 	    symbol_remove (sym, &symbol_rootP, &symbol_lastP);
3336 	  }
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);
3343       }
3344 }
3345 
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.  */
3351 
3352 int
mmix_label_without_colon_this_line(void)3353 mmix_label_without_colon_this_line (void)
3354 {
3355   int retval = label_without_colon_this_line;
3356 
3357   if (! mmix_gnu_syntax)
3358     label_without_colon_this_line = 1;
3359 
3360   return retval;
3361 }
3362 
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.  */
3367 
3368 long
mmix_md_relax_frag(segT seg,fragS * fragP,long stretch)3369 mmix_md_relax_frag (segT seg, fragS *fragP, long stretch)
3370 {
3371   switch (fragP->fr_subtype)
3372     {
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;
3377 
3378     case ENCODE_RELAX (STATE_PUSHJ, STATE_ZERO):
3379       {
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;
3392 
3393 	if (symbolP)
3394 	  {
3395 	    fragS *sym_frag;
3396 
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);
3401 
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.  */
3406 
3407 	    if (stretch != 0
3408 		&& sym_frag->relax_marker != fragP->relax_marker
3409 		&& S_GET_SEGMENT (symbolP) == seg)
3410 	      target += stretch;
3411 	  }
3412 
3413 	aim = target - address - fragP->fr_fix;
3414 	if (aim >= PUSHJ_0B && aim <= PUSHJ_0F)
3415 	  {
3416 	    /* Target is reachable with a PUSHJ.  */
3417 	    segment_info_type *seginfo = seg_info (seg);
3418 
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;
3424 	  }
3425 
3426 	/* Not reachable.  Try a stub.  */
3427 	fragP->fr_subtype = ENCODE_RELAX (STATE_PUSHJSTUB, STATE_ZERO);
3428       }
3429       /* FALLTHROUGH.  */
3430 
3431       /* See if this PUSHJ is redirectable to a stub.  */
3432     case ENCODE_RELAX (STATE_PUSHJSTUB, STATE_ZERO):
3433       {
3434 	segment_info_type *seginfo = seg_info (seg);
3435 	fragS *lastfrag = seginfo->frchainP->frch_last;
3436 	relax_substateT prev_type = fragP->fr_subtype;
3437 
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);
3443 
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++;
3456 
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;
3461 
3462 	return
3463 	   (mmix_relax_table[fragP->fr_subtype].rlx_length
3464 	    - mmix_relax_table[prev_type].rlx_length);
3465       }
3466 
3467     case ENCODE_RELAX (STATE_PUSHJ, STATE_MAX):
3468       {
3469 	segment_info_type *seginfo = seg_info (seg);
3470 
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;
3476 
3477 	return 0;
3478       }
3479 
3480     default:
3481       return relax_frag (seg, fragP, stretch);
3482 
3483     case STATE_GREG_UNDF:
3484       BAD_CASE (fragP->fr_subtype);
3485     }
3486 
3487   as_fatal (_("internal: unexpected relax type %d:%d"),
3488 	    fragP->fr_type, fragP->fr_subtype);
3489   return 0;
3490 }
3491 
3492 /* Various things we punt until all input is seen.  */
3493 
3494 void
mmix_md_finish(void)3495 mmix_md_finish (void)
3496 {
3497   fragS *fragP;
3498   symbolS *mainsym;
3499   asection *regsec;
3500   struct loc_assert_s *loc_assert;
3501   int i;
3502 
3503   /* The first frag of GREG:s going into the register contents section.  */
3504   fragS *mmix_reg_contents_frags = NULL;
3505 
3506   /* Reset prefix.  All labels reachable at this point must be
3507      canonicalized.  */
3508   mmix_current_prefix = NULL;
3509 
3510   if (doing_bspec)
3511     as_bad_where (bspec_file, bspec_line, _("BSPEC without ESPEC."));
3512 
3513   /* Emit the low LOC setting of .text.  */
3514   if (text_has_contents && lowest_text_loc != (bfd_vma) -1)
3515     {
3516       symbolS *symbolP;
3517       char locsymbol[sizeof (":") - 1
3518 		    + sizeof (MMIX_LOC_SECTION_START_SYMBOL_PREFIX) - 1
3519 		    + sizeof (".text")];
3520 
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);
3528     }
3529 
3530   /* Ditto .data.  */
3531   if (data_has_contents && lowest_data_loc != (bfd_vma) -1)
3532     {
3533       symbolS *symbolP;
3534       char locsymbol[sizeof (":") - 1
3535 		     + sizeof (MMIX_LOC_SECTION_START_SYMBOL_PREFIX) - 1
3536 		     + sizeof (".data")];
3537 
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);
3544     }
3545 
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)
3553     {
3554       symbol_get_bfdsym (mainsym)->flags |= BSF_FUNCTION;
3555       S_SET_EXTERNAL (mainsym);
3556     }
3557 
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)
3563     {
3564       segT actual_seg;
3565 
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)
3569 	{
3570 	  const char *fnam;
3571 	  unsigned int line;
3572 	  int e_valid = expr_symbol_where (loc_assert->loc_sym, &fnam, &line);
3573 
3574 	  gas_assert (e_valid == 1);
3575 	  as_bad_where (fnam, line,
3576 			_("LOC to section unknown or indeterminable "
3577 			  "at first pass"));
3578 
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;
3587 	}
3588     }
3589 
3590   if (n_of_raw_gregs != 0)
3591     {
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;
3597 
3598       regsec = bfd_make_section_old_way (stdoutput,
3599 					 MMIX_REG_CONTENTS_SECTION_NAME);
3600       subseg_set (regsec, 0);
3601 
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;
3607 
3608       frag_grow (0);
3609       mmix_reg_contents_frags = frag_now;
3610 
3611       for (i = n_of_raw_gregs - 1; i >= 0; i--)
3612 	{
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);
3618 
3619 	  frag_var (rs_machine_dependent, 8, 0, STATE_GREG_UNDF,
3620 		    make_expr_symbol (&mmix_raw_gregs[i].exp), 0, NULL);
3621 	}
3622 
3623       subseg_set (this_segment, this_subsegment);
3624     }
3625 
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;
3630 
3631   /* Iterate over frags resulting from GREGs and move those that evidently
3632      have the same value together and point one to another.
3633 
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)
3637     {
3638       fragS **fpp;
3639       fragS *fp = NULL;
3640       fragS *osymfrag;
3641       offsetT osymval;
3642       expressionS *oexpP;
3643       symbolS *symbolP = fragP->fr_symbol;
3644 
3645       if (fragP->fr_type != rs_machine_dependent
3646 	  || fragP->fr_subtype != STATE_GREG_UNDF)
3647 	continue;
3648 
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;
3653 
3654       /* If we're not supposed to merge GREG definitions, then just don't
3655 	 look for equivalents.  */
3656       if (! merge_gregs)
3657 	continue;
3658 
3659       osymval = (offsetT) S_GET_VALUE (symbolP);
3660       osymfrag = symbol_get_frag (symbolP);
3661 
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;
3667 
3668       oexpP = symbol_get_value_expression (fragP->fr_symbol);
3669 
3670       /* If the initialization value is zero, then we must not merge them.  */
3671       if (oexpP->X_op == O_constant && osymval == 0)
3672 	continue;
3673 
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)
3678 	{
3679 	  fp = *fpp;
3680 
3681 	  if (fp->fr_type != rs_machine_dependent
3682 	      || fp->fr_subtype != STATE_GREG_UNDF)
3683 	    continue;
3684 
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)
3689 	    {
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;
3698 	    }
3699 	}
3700 
3701       if (*fpp != NULL)
3702 	fragP->tc_frag_data = fp;
3703     }
3704 }
3705 
3706 /* qsort function for mmix_symbol_gregs.  */
3707 
3708 static int
cmp_greg_symbol_fixes(const void * parg,const void * qarg)3709 cmp_greg_symbol_fixes (const void *parg, const void *qarg)
3710 {
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;
3715 
3716   return p->offs > q->offs ? 1 : p->offs < q->offs ? -1 : 0;
3717 }
3718 
3719 /* Collect GREG definitions from mmix_gregs and hang them as lists sorted
3720    on increasing offsets onto each section symbol or undefined symbol.
3721 
3722    Also, remove the register convenience section so it doesn't get output
3723    as an ELF section.  */
3724 
3725 void
mmix_frob_file(void)3726 mmix_frob_file (void)
3727 {
3728   int i;
3729   struct mmix_symbol_gregs *all_greg_symbols[MAX_GREGS];
3730   int n_greg_symbols = 0;
3731 
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++)
3735     {
3736       offsetT offs;
3737       symbolS *sym;
3738       struct mmix_symbol_gregs *gregs;
3739       fixS *fixP;
3740 
3741       fixP = mmix_gregs[i];
3742       know (fixP->fx_r_type == BFD_RELOC_64);
3743 
3744       /* This case isn't doable in general anyway, methinks.  */
3745       if (fixP->fx_subsy != NULL)
3746 	{
3747 	  as_bad_subtract (fixP);
3748 	  continue;
3749 	}
3750 
3751       sym = fixP->fx_addsy;
3752       offs = (offsetT) fixP->fx_offset;
3753 
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))
3759 	{
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"));
3763 
3764 	  offs += S_GET_VALUE (sym);
3765 	}
3766 
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)))
3774 	{
3775 	  offs -= (offsetT) lowest_data_loc;
3776 	  sym = section_symbol (data_section);
3777 	}
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)))
3782 	{
3783 	  offs -= (offsetT) lowest_text_loc;
3784 	  sym = section_symbol (text_section);
3785 	}
3786 
3787       gregs = *symbol_get_tc (sym);
3788 
3789       if (gregs == NULL)
3790 	{
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;
3795 	}
3796 
3797       gregs->greg_fixes[gregs->n_gregs].fix = fixP;
3798       gregs->greg_fixes[gregs->n_gregs++].offs = offs;
3799     }
3800 
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);
3806 
3807   if (real_reg_section != NULL)
3808     {
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"));
3812 
3813       bfd_section_list_remove (stdoutput, real_reg_section);
3814       --stdoutput->section_count;
3815     }
3816 
3817 }
3818 
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.
3822 
3823    If the name isn't a built-in name and parsed into *EXPP, return zero.  */
3824 
3825 int
mmix_parse_predefined_name(char * name,expressionS * expP)3826 mmix_parse_predefined_name (char *name, expressionS *expP)
3827 {
3828   char *canon_name;
3829   const char *handler_charp;
3830   const char handler_chars[] = "DVWIOUZX";
3831   symbolS *symp;
3832 
3833   if (! predefined_syms)
3834     return 0;
3835 
3836   canon_name = tc_canonicalize_symbol_name (name);
3837 
3838   if (canon_name[1] == '_'
3839       && strcmp (canon_name + 2, "Handler") == 0
3840       && (handler_charp = strchr (handler_chars, *canon_name)) != NULL)
3841     {
3842       /* If the symbol doesn't exist, provide one relative to the .text
3843 	 section.
3844 
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));
3851     }
3852   else
3853     {
3854       /* These symbols appear when referenced; needed for
3855          mmixal-compatible programs.  */
3856       unsigned int i;
3857 
3858       static const struct
3859       {
3860 	const char *name;
3861 	valueT val;
3862       } predefined_abs_syms[] =
3863 	{
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}
3895 	};
3896 
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;
3901 
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)
3906 	  {
3907 	    symbol_table_insert (symbol_new (predefined_abs_syms[i].name,
3908 					     absolute_section,
3909 					     &zero_address_frag,
3910 					     predefined_abs_syms[i].val));
3911 
3912 	    /* Let gas find the symbol we just created, through its
3913                ordinary lookup.  */
3914 	    return 0;
3915 	  }
3916 
3917       /* Not one of those symbols.  Let gas handle it.  */
3918       return 0;
3919     }
3920 
3921   expP->X_op = O_symbol;
3922   expP->X_add_number = 0;
3923   expP->X_add_symbol = symp;
3924   expP->X_op_symbol = NULL;
3925 
3926   return 1;
3927 }
3928 
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.  */
3932 
3933 void
mmix_md_elf_section_change_hook(void)3934 mmix_md_elf_section_change_hook (void)
3935 {
3936   if (doing_bspec)
3937     as_bad (_("section change from within a BSPEC/ESPEC pair is not supported"));
3938 
3939   last_alignment = bfd_section_alignment (now_seg);
3940   want_unaligned = 0;
3941 }
3942 
3943 /* The LOC worker.  This is like s_org, but we have to support changing
3944    section too.   */
3945 
3946 static void
s_loc(int ignore ATTRIBUTE_UNUSED)3947 s_loc (int ignore ATTRIBUTE_UNUSED)
3948 {
3949   segT section;
3950   expressionS exp;
3951   char *p;
3952   symbolS *sym;
3953   offsetT off;
3954 
3955   /* Must not have a BSPEC in progress.  */
3956   if (doing_bspec)
3957     {
3958       as_bad (_("directive LOC from within a BSPEC/ESPEC pair is not supported"));
3959       return;
3960     }
3961 
3962   section = expression (&exp);
3963 
3964   if (exp.X_op == O_illegal
3965       || exp.X_op == O_absent
3966       || exp.X_op == O_big)
3967     {
3968       as_bad (_("invalid LOC expression"));
3969       return;
3970     }
3971 
3972   if (section == undefined_section)
3973     {
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)
3979 	{
3980 	  symbol_get_value_expression (exp.X_op_symbol);
3981 	  symbol_get_value_expression (exp.X_add_symbol);
3982 	}
3983       else
3984 	{
3985 	  gas_assert (exp.X_op == O_symbol);
3986 	  symbol_get_value_expression (exp.X_add_symbol);
3987 	}
3988     }
3989 
3990   if (section == absolute_section)
3991     {
3992       /* Translate a constant into a suitable section.  */
3993 
3994       if (exp.X_add_number < ((offsetT) 0x20 << 56))
3995 	{
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;
4000 
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.  */
4005 
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)
4012 	    {
4013 	      as_bad (_("LOC expression stepping backwards is not supported"));
4014 	      exp.X_op = O_absent;
4015 	    }
4016 	  else
4017 	    {
4018 	      if (text_has_contents && lowest_text_loc == (bfd_vma) -1)
4019 		lowest_text_loc = 0;
4020 
4021 	      if (lowest_text_loc == (bfd_vma) -1)
4022 		{
4023 		  lowest_text_loc = exp.X_add_number;
4024 
4025 		  /* We want only to change the section, not set an offset.  */
4026 		  exp.X_op = O_absent;
4027 		}
4028 	      else
4029 		exp.X_add_number -= lowest_text_loc;
4030 	    }
4031 	}
4032       else
4033 	{
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;
4037 
4038 	  if (exp.X_add_number < (offsetT) lowest_data_loc)
4039 	    {
4040 	      as_bad (_("LOC expression stepping backwards is not supported"));
4041 	      exp.X_op = O_absent;
4042 	    }
4043 	  else
4044 	    {
4045 	      if (data_has_contents && lowest_data_loc == (bfd_vma) -1)
4046 		lowest_data_loc = (bfd_vma) 0x20 << 56;
4047 
4048 	      if (lowest_data_loc == (bfd_vma) -1)
4049 		{
4050 		  lowest_data_loc = exp.X_add_number;
4051 
4052 		  /* We want only to change the section, not set an offset.  */
4053 		  exp.X_op = O_absent;
4054 		}
4055 	      else
4056 		exp.X_add_number -= lowest_data_loc;
4057 	    }
4058 	}
4059     }
4060 
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)
4064     {
4065       obj_elf_section_change_hook ();
4066       subseg_set (section, 0);
4067 
4068       /* Call our section change hooks using the official hook.  */
4069       md_elf_section_change_hook ();
4070     }
4071 
4072   if (exp.X_op != O_absent)
4073     {
4074       symbolS *esym = NULL;
4075 
4076       if (exp.X_op != O_constant && exp.X_op != O_symbol)
4077 	{
4078 	  /* Handle complex expressions.  */
4079 	  esym = sym = make_expr_symbol (&exp);
4080 	  off = 0;
4081 	}
4082       else
4083 	{
4084 	  sym = exp.X_add_symbol;
4085 	  off = exp.X_add_number;
4086 
4087 	  if (section == undefined_section)
4088 	    {
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);
4096 	    }
4097 	}
4098 
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)
4102 	{
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;
4109 	}
4110 
4111       p = frag_var (rs_org, 1, 1, (relax_substateT) 0, sym, off, (char *) 0);
4112       *p = 0;
4113     }
4114 
4115   mmix_handle_rest_of_empty_line ();
4116 }
4117 
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.  */
4121 
4122 static void
mmix_byte(void)4123 mmix_byte (void)
4124 {
4125   unsigned int c;
4126 
4127   if (now_seg == text_section)
4128     text_has_contents = 1;
4129   else if (now_seg == data_section)
4130     data_has_contents = 1;
4131 
4132   do
4133     {
4134       SKIP_WHITESPACE ();
4135       switch (*input_line_pointer)
4136 	{
4137 	case '\"':
4138 	  ++input_line_pointer;
4139 	  while (is_a_char (c = next_char_of_string ()))
4140 	    {
4141 	      FRAG_APPEND_1_CHAR (c);
4142 	    }
4143 
4144 	  if (input_line_pointer[-1] != '\"')
4145 	    {
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;
4152 	    }
4153 	  break;
4154 
4155 	default:
4156 	  {
4157 	    expressionS exp;
4158 	    segT expseg = expression (&exp);
4159 
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)))
4165 	      {
4166 		as_bad (_("BYTE expression not a pure number"));
4167 		mmix_discard_rest_of_line ();
4168 		return;
4169 	      }
4170 	    else if ((exp.X_add_number > 255 && exp.X_op != O_register)
4171 		     || exp.X_add_number < 0)
4172 	      {
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;
4178 	      }
4179 
4180 	    FRAG_APPEND_1_CHAR (exp.X_add_number);
4181 	  }
4182 	  break;
4183 	}
4184 
4185       SKIP_WHITESPACE ();
4186       c = *input_line_pointer++;
4187     }
4188   while (c == ',');
4189 
4190   input_line_pointer--;
4191 
4192   if (mmix_gnu_syntax)
4193     demand_empty_rest_of_line ();
4194   else
4195     {
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++;
4200     }
4201 
4202   /* Make sure we align for the next instruction.  */
4203   last_alignment = 0;
4204 }
4205 
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.  */
4209 
4210 static void
mmix_cons(int nbytes)4211 mmix_cons (int nbytes)
4212 {
4213   expressionS exp;
4214 
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)
4219     {
4220       if (lowest_text_loc != (bfd_vma) -1
4221 	  && (lowest_text_loc & (nbytes - 1)) != 0)
4222 	{
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"));
4227 
4228 	  lowest_text_loc &= ~((bfd_vma) nbytes - 1);
4229 	  lowest_text_loc += (bfd_vma) nbytes;
4230 	}
4231 
4232       text_has_contents = 1;
4233     }
4234   else if (now_seg == data_section)
4235     {
4236       if (lowest_data_loc != (bfd_vma) -1
4237 	  && (lowest_data_loc & (nbytes - 1)) != 0)
4238 	{
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"));
4243 
4244 	  lowest_data_loc &= ~((bfd_vma) nbytes - 1);
4245 	  lowest_data_loc += (bfd_vma) nbytes;
4246 	}
4247 
4248       data_has_contents = 1;
4249     }
4250 
4251   /* Always align these unless asked not to (valid for the current pseudo).  */
4252   if (! want_unaligned)
4253     {
4254       last_alignment = nbytes == 2 ? 1 : (nbytes == 4 ? 2 : 3);
4255       frag_align (last_alignment, 0, 0);
4256       record_alignment (now_seg, last_alignment);
4257     }
4258 
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)
4265     {
4266       colon (pending_label);
4267       pending_label = NULL;
4268     }
4269 
4270   SKIP_WHITESPACE ();
4271 
4272   if (is_end_of_line[(unsigned int) *input_line_pointer])
4273     {
4274       /* Default to zero if the expression was absent.  */
4275 
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);
4282     }
4283   else
4284     do
4285       {
4286 	unsigned int c;
4287 
4288 	switch (*input_line_pointer)
4289 	  {
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 ()))
4295 	      {
4296 		exp.X_op = O_constant;
4297 		exp.X_add_number = c;
4298 		exp.X_unsigned = 1;
4299 		emit_expr (&exp, (unsigned int) nbytes);
4300 	      }
4301 
4302 	    if (input_line_pointer[-1] != '\"')
4303 	      {
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;
4310 	      }
4311 	    break;
4312 
4313 	  default:
4314 	    {
4315 	      expression (&exp);
4316 	      emit_expr (&exp, (unsigned int) nbytes);
4317 	      SKIP_WHITESPACE ();
4318 	    }
4319 	    break;
4320 	  }
4321       }
4322     while (*input_line_pointer++ == ',');
4323 
4324   input_line_pointer--;		/* Put terminator back into stream.  */
4325 
4326   mmix_handle_rest_of_empty_line ();
4327 
4328   /* We don't need to step up the counter for the current_fb_label here;
4329      that's handled by the caller.  */
4330 }
4331 
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.  */
4336 
4337 void
mmix_md_do_align(int n,char * fill ATTRIBUTE_UNUSED,int len ATTRIBUTE_UNUSED,int max ATTRIBUTE_UNUSED)4338 mmix_md_do_align (int n, char *fill ATTRIBUTE_UNUSED,
4339 		  int len ATTRIBUTE_UNUSED, int max ATTRIBUTE_UNUSED)
4340 {
4341   last_alignment = n;
4342   want_unaligned = n == 0;
4343 }
4344