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