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