Revert "packaging: Add gdb packages"
[external/binutils.git] / gas / macro.c
1 /* macro.c - macro support for gas
2    Copyright (C) 1994-2019 Free Software Foundation, Inc.
3
4    Written by Steve and Judy Chamberlain of Cygnus Support,
5       sac@cygnus.com
6
7    This file is part of GAS, the GNU Assembler.
8
9    GAS is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3, or (at your option)
12    any later version.
13
14    GAS is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with GAS; see the file COPYING.  If not, write to the Free
21    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
22    02110-1301, USA.  */
23
24 #include "as.h"
25 #include "safe-ctype.h"
26 #include "sb.h"
27 #include "macro.h"
28
29 /* The routines in this file handle macro definition and expansion.
30    They are called by gas.  */
31
32 #define ISWHITE(x) ((x) == ' ' || (x) == '\t')
33
34 #define ISSEP(x) \
35  ((x) == ' ' || (x) == '\t' || (x) == ',' || (x) == '"' || (x) == ';' \
36   || (x) == ')' || (x) == '(' \
37   || ((macro_alternate || macro_mri) && ((x) == '<' || (x) == '>')))
38
39 #define ISBASE(x) \
40   ((x) == 'b' || (x) == 'B' \
41    || (x) == 'q' || (x) == 'Q' \
42    || (x) == 'h' || (x) == 'H' \
43    || (x) == 'd' || (x) == 'D')
44
45 /* The macro hash table.  */
46
47 struct hash_control *macro_hash;
48
49 /* Whether any macros have been defined.  */
50
51 int macro_defined;
52
53 /* Whether we are in alternate syntax mode.  */
54
55 static int macro_alternate;
56
57 /* Whether we are in MRI mode.  */
58
59 static int macro_mri;
60
61 /* Whether we should strip '@' characters.  */
62
63 static int macro_strip_at;
64
65 /* Function to use to parse an expression.  */
66
67 static size_t (*macro_expr) (const char *, size_t, sb *, offsetT *);
68
69 /* Number of macro expansions that have been done.  */
70
71 static int macro_number;
72
73 /* Initialize macro processing.  */
74
75 void
76 macro_init (int alternate, int mri, int strip_at,
77             size_t (*exp) (const char *, size_t, sb *, offsetT *))
78 {
79   macro_hash = hash_new ();
80   macro_defined = 0;
81   macro_alternate = alternate;
82   macro_mri = mri;
83   macro_strip_at = strip_at;
84   macro_expr = exp;
85 }
86
87 /* Switch in and out of alternate mode on the fly.  */
88
89 void
90 macro_set_alternate (int alternate)
91 {
92   macro_alternate = alternate;
93 }
94
95 /* Switch in and out of MRI mode on the fly.  */
96
97 void
98 macro_mri_mode (int mri)
99 {
100   macro_mri = mri;
101 }
102
103 /* Read input lines till we get to a TO string.
104    Increase nesting depth if we get a FROM string.
105    Put the results into sb at PTR.
106    FROM may be NULL (or will be ignored) if TO is "ENDR".
107    Add a new input line to an sb using GET_LINE.
108    Return 1 on success, 0 on unexpected EOF.  */
109
110 int
111 buffer_and_nest (const char *from, const char *to, sb *ptr,
112                  size_t (*get_line) (sb *))
113 {
114   size_t from_len;
115   size_t to_len = strlen (to);
116   int depth = 1;
117   size_t line_start = ptr->len;
118   size_t more = get_line (ptr);
119
120   if (to_len == 4 && strcasecmp (to, "ENDR") == 0)
121     {
122       from = NULL;
123       from_len = 0;
124     }
125   else
126     from_len = strlen (from);
127
128   while (more)
129     {
130       /* Try to find the first pseudo op on the line.  */
131       size_t i = line_start;
132       bfd_boolean had_colon = FALSE;
133
134       /* With normal syntax we can suck what we want till we get
135          to the dot.  With the alternate, labels have to start in
136          the first column, since we can't tell what's a label and
137          what's a pseudoop.  */
138
139       if (! LABELS_WITHOUT_COLONS)
140         {
141           /* Skip leading whitespace.  */
142           while (i < ptr->len && ISWHITE (ptr->ptr[i]))
143             i++;
144         }
145
146       for (;;)
147         {
148           /* Skip over a label, if any.  */
149           if (i >= ptr->len || ! is_name_beginner (ptr->ptr[i]))
150             break;
151           i++;
152           while (i < ptr->len && is_part_of_name (ptr->ptr[i]))
153             i++;
154           if (i < ptr->len && is_name_ender (ptr->ptr[i]))
155             i++;
156           /* Skip whitespace.  */
157           while (i < ptr->len && ISWHITE (ptr->ptr[i]))
158             i++;
159           /* Check for the colon.  */
160           if (i >= ptr->len || ptr->ptr[i] != ':')
161             {
162               /* LABELS_WITHOUT_COLONS doesn't mean we cannot have a
163                  colon after a label.  If we do have a colon on the
164                  first label then handle more than one label on the
165                  line, assuming that each label has a colon.  */
166               if (LABELS_WITHOUT_COLONS && !had_colon)
167                 break;
168               i = line_start;
169               break;
170             }
171           i++;
172           line_start = i;
173           had_colon = TRUE;
174         }
175
176       /* Skip trailing whitespace.  */
177       while (i < ptr->len && ISWHITE (ptr->ptr[i]))
178         i++;
179
180       if (i < ptr->len && (ptr->ptr[i] == '.'
181                            || NO_PSEUDO_DOT
182                            || macro_mri))
183         {
184           if (! flag_m68k_mri && ptr->ptr[i] == '.')
185             i++;
186           if (from == NULL
187              && strncasecmp (ptr->ptr + i, "IRPC", from_len = 4) != 0
188              && strncasecmp (ptr->ptr + i, "IRP", from_len = 3) != 0
189              && strncasecmp (ptr->ptr + i, "IREPC", from_len = 5) != 0
190              && strncasecmp (ptr->ptr + i, "IREP", from_len = 4) != 0
191              && strncasecmp (ptr->ptr + i, "REPT", from_len = 4) != 0
192              && strncasecmp (ptr->ptr + i, "REP", from_len = 3) != 0)
193             from_len = 0;
194           if ((from != NULL
195                ? strncasecmp (ptr->ptr + i, from, from_len) == 0
196                : from_len > 0)
197               && (ptr->len == (i + from_len)
198                   || ! (is_part_of_name (ptr->ptr[i + from_len])
199                         || is_name_ender (ptr->ptr[i + from_len]))))
200             depth++;
201           if (strncasecmp (ptr->ptr + i, to, to_len) == 0
202               && (ptr->len == (i + to_len)
203                   || ! (is_part_of_name (ptr->ptr[i + to_len])
204                         || is_name_ender (ptr->ptr[i + to_len]))))
205             {
206               depth--;
207               if (depth == 0)
208                 {
209                   /* Reset the string to not include the ending rune.  */
210                   ptr->len = line_start;
211                   break;
212                 }
213             }
214
215           /* PR gas/16908
216              Apply and discard .linefile directives that appear within
217              the macro.  For long macros, one might want to report the
218              line number information associated with the lines within
219              the macro definition, but we would need more infrastructure
220              to make that happen correctly (e.g. resetting the line
221              number when expanding the macro), and since for short
222              macros we clearly prefer reporting the point of expansion
223              anyway, there's not an obviously better fix here.  */
224           if (strncasecmp (ptr->ptr + i, "linefile", 8) == 0)
225             {
226               char saved_eol_char = ptr->ptr[ptr->len];
227
228               ptr->ptr[ptr->len] = '\0';
229               temp_ilp (ptr->ptr + i + 8);
230               s_app_line (0);
231               restore_ilp ();
232               ptr->ptr[ptr->len] = saved_eol_char;
233               ptr->len = line_start;
234             }
235         }
236
237       /* Add the original end-of-line char to the end and keep running.  */
238       sb_add_char (ptr, more);
239       line_start = ptr->len;
240       more = get_line (ptr);
241     }
242
243   /* Return 1 on success, 0 on unexpected EOF.  */
244   return depth == 0;
245 }
246
247 /* Pick up a token.  */
248
249 static size_t
250 get_token (size_t idx, sb *in, sb *name)
251 {
252   if (idx < in->len
253       && is_name_beginner (in->ptr[idx]))
254     {
255       sb_add_char (name, in->ptr[idx++]);
256       while (idx < in->len
257              && is_part_of_name (in->ptr[idx]))
258         {
259           sb_add_char (name, in->ptr[idx++]);
260         }
261       if (idx < in->len
262              && is_name_ender (in->ptr[idx]))
263         {
264           sb_add_char (name, in->ptr[idx++]);
265         }
266     }
267   /* Ignore trailing &.  */
268   if (macro_alternate && idx < in->len && in->ptr[idx] == '&')
269     idx++;
270   return idx;
271 }
272
273 /* Pick up a string.  */
274
275 static size_t
276 getstring (size_t idx, sb *in, sb *acc)
277 {
278   while (idx < in->len
279          && (in->ptr[idx] == '"'
280              || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
281              || (in->ptr[idx] == '\'' && macro_alternate)))
282     {
283       if (in->ptr[idx] == '<')
284         {
285           int nest = 0;
286           idx++;
287           while (idx < in->len
288                  && (in->ptr[idx] != '>' || nest))
289             {
290               if (in->ptr[idx] == '!')
291                 {
292                   idx++;
293                   sb_add_char (acc, in->ptr[idx++]);
294                 }
295               else
296                 {
297                   if (in->ptr[idx] == '>')
298                     nest--;
299                   if (in->ptr[idx] == '<')
300                     nest++;
301                   sb_add_char (acc, in->ptr[idx++]);
302                 }
303             }
304           idx++;
305         }
306       else if (in->ptr[idx] == '"' || in->ptr[idx] == '\'')
307         {
308           char tchar = in->ptr[idx];
309           int escaped = 0;
310
311           idx++;
312
313           while (idx < in->len)
314             {
315               if (in->ptr[idx - 1] == '\\')
316                 escaped ^= 1;
317               else
318                 escaped = 0;
319
320               if (macro_alternate && in->ptr[idx] == '!')
321                 {
322                   idx ++;
323
324                   sb_add_char (acc, in->ptr[idx]);
325
326                   idx ++;
327                 }
328               else if (escaped && in->ptr[idx] == tchar)
329                 {
330                   sb_add_char (acc, tchar);
331                   idx ++;
332                 }
333               else
334                 {
335                   if (in->ptr[idx] == tchar)
336                     {
337                       idx ++;
338
339                       if (idx >= in->len || in->ptr[idx] != tchar)
340                         break;
341                     }
342
343                   sb_add_char (acc, in->ptr[idx]);
344                   idx ++;
345                 }
346             }
347         }
348     }
349
350   return idx;
351 }
352
353 /* Fetch string from the input stream,
354    rules:
355     'Bxyx<whitespace>   -> return 'Bxyza
356     %<expr>             -> return string of decimal value of <expr>
357     "string"            -> return string
358     (string)            -> return (string-including-whitespaces)
359     xyx<whitespace>     -> return xyz.  */
360
361 static size_t
362 get_any_string (size_t idx, sb *in, sb *out)
363 {
364   sb_reset (out);
365   idx = sb_skip_white (idx, in);
366
367   if (idx < in->len)
368     {
369       if (in->len > idx + 2 && in->ptr[idx + 1] == '\'' && ISBASE (in->ptr[idx]))
370         {
371           while (idx < in->len && !ISSEP (in->ptr[idx]))
372             sb_add_char (out, in->ptr[idx++]);
373         }
374       else if (in->ptr[idx] == '%' && macro_alternate)
375         {
376           offsetT val;
377           char buf[64];
378
379           /* Turns the next expression into a string.  */
380           /* xgettext: no-c-format */
381           idx = (*macro_expr) (_("% operator needs absolute expression"),
382                                idx + 1,
383                                in,
384                                &val);
385           sprintf (buf, "%" BFD_VMA_FMT "d", val);
386           sb_add_string (out, buf);
387         }
388       else if (in->ptr[idx] == '"'
389                || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
390                || (macro_alternate && in->ptr[idx] == '\''))
391         {
392           if (macro_alternate && ! macro_strip_at && in->ptr[idx] != '<')
393             {
394               /* Keep the quotes.  */
395               sb_add_char (out, '"');
396               idx = getstring (idx, in, out);
397               sb_add_char (out, '"');
398             }
399           else
400             {
401               idx = getstring (idx, in, out);
402             }
403         }
404       else
405         {
406           char *br_buf = XNEWVEC (char, 1);
407           char *in_br = br_buf;
408
409           *in_br = '\0';
410           while (idx < in->len
411                  && (*in_br
412                      || (in->ptr[idx] != ' '
413                          && in->ptr[idx] != '\t'))
414                  && in->ptr[idx] != ','
415                  && (in->ptr[idx] != '<'
416                      || (! macro_alternate && ! macro_mri)))
417             {
418               char tchar = in->ptr[idx];
419
420               switch (tchar)
421                 {
422                 case '"':
423                 case '\'':
424                   sb_add_char (out, in->ptr[idx++]);
425                   while (idx < in->len
426                          && in->ptr[idx] != tchar)
427                     sb_add_char (out, in->ptr[idx++]);
428                   if (idx == in->len)
429                     {
430                       free (br_buf);
431                       return idx;
432                     }
433                   break;
434                 case '(':
435                 case '[':
436                   if (in_br > br_buf)
437                     --in_br;
438                   else
439                     {
440                       br_buf = XNEWVEC (char, strlen (in_br) + 2);
441                       strcpy (br_buf + 1, in_br);
442                       free (in_br);
443                       in_br = br_buf;
444                     }
445                   *in_br = tchar;
446                   break;
447                 case ')':
448                   if (*in_br == '(')
449                     ++in_br;
450                   break;
451                 case ']':
452                   if (*in_br == '[')
453                     ++in_br;
454                   break;
455                 }
456               sb_add_char (out, tchar);
457               ++idx;
458             }
459           free (br_buf);
460         }
461     }
462
463   return idx;
464 }
465
466 /* Allocate a new formal.  */
467
468 static formal_entry *
469 new_formal (void)
470 {
471   formal_entry *formal;
472
473   formal = XNEW (formal_entry);
474
475   sb_new (&formal->name);
476   sb_new (&formal->def);
477   sb_new (&formal->actual);
478   formal->next = NULL;
479   formal->type = FORMAL_OPTIONAL;
480   return formal;
481 }
482
483 /* Free a formal.  */
484
485 static void
486 del_formal (formal_entry *formal)
487 {
488   sb_kill (&formal->actual);
489   sb_kill (&formal->def);
490   sb_kill (&formal->name);
491   free (formal);
492 }
493
494 /* Pick up the formal parameters of a macro definition.  */
495
496 static size_t
497 do_formals (macro_entry *macro, size_t idx, sb *in)
498 {
499   formal_entry **p = &macro->formals;
500   const char *name;
501
502   idx = sb_skip_white (idx, in);
503   while (idx < in->len)
504     {
505       formal_entry *formal = new_formal ();
506       size_t cidx;
507
508       idx = get_token (idx, in, &formal->name);
509       if (formal->name.len == 0)
510         {
511           if (macro->formal_count)
512             --idx;
513           del_formal (formal);  /* 'formal' goes out of scope.  */
514           break;
515         }
516       idx = sb_skip_white (idx, in);
517       /* This is a formal.  */
518       name = sb_terminate (&formal->name);
519       if (! macro_mri
520           && idx < in->len
521           && in->ptr[idx] == ':'
522           && (! is_name_beginner (':')
523               || idx + 1 >= in->len
524               || ! is_part_of_name (in->ptr[idx + 1])))
525         {
526           /* Got a qualifier.  */
527           sb qual;
528
529           sb_new (&qual);
530           idx = get_token (sb_skip_white (idx + 1, in), in, &qual);
531           sb_terminate (&qual);
532           if (qual.len == 0)
533             as_bad_where (macro->file,
534                           macro->line,
535                           _("Missing parameter qualifier for `%s' in macro `%s'"),
536                           name,
537                           macro->name);
538           else if (strcmp (qual.ptr, "req") == 0)
539             formal->type = FORMAL_REQUIRED;
540           else if (strcmp (qual.ptr, "vararg") == 0)
541             formal->type = FORMAL_VARARG;
542           else
543             as_bad_where (macro->file,
544                           macro->line,
545                           _("`%s' is not a valid parameter qualifier for `%s' in macro `%s'"),
546                           qual.ptr,
547                           name,
548                           macro->name);
549           sb_kill (&qual);
550           idx = sb_skip_white (idx, in);
551         }
552       if (idx < in->len && in->ptr[idx] == '=')
553         {
554           /* Got a default.  */
555           idx = get_any_string (idx + 1, in, &formal->def);
556           idx = sb_skip_white (idx, in);
557           if (formal->type == FORMAL_REQUIRED)
558             {
559               sb_reset (&formal->def);
560               as_warn_where (macro->file,
561                             macro->line,
562                             _("Pointless default value for required parameter `%s' in macro `%s'"),
563                             name,
564                             macro->name);
565             }
566         }
567
568       /* Add to macro's hash table.  */
569       if (! hash_find (macro->formal_hash, name))
570         hash_jam (macro->formal_hash, name, formal);
571       else
572         as_bad_where (macro->file,
573                       macro->line,
574                       _("A parameter named `%s' already exists for macro `%s'"),
575                       name,
576                       macro->name);
577
578       formal->index = macro->formal_count++;
579       *p = formal;
580       p = &formal->next;
581       if (formal->type == FORMAL_VARARG)
582         break;
583       cidx = idx;
584       idx = sb_skip_comma (idx, in);
585       if (idx != cidx && idx >= in->len)
586         {
587           idx = cidx;
588           break;
589         }
590     }
591
592   if (macro_mri)
593     {
594       formal_entry *formal = new_formal ();
595
596       /* Add a special NARG formal, which macro_expand will set to the
597          number of arguments.  */
598       /* The same MRI assemblers which treat '@' characters also use
599          the name $NARG.  At least until we find an exception.  */
600       if (macro_strip_at)
601         name = "$NARG";
602       else
603         name = "NARG";
604
605       sb_add_string (&formal->name, name);
606
607       /* Add to macro's hash table.  */
608       if (hash_find (macro->formal_hash, name))
609         as_bad_where (macro->file,
610                       macro->line,
611                       _("Reserved word `%s' used as parameter in macro `%s'"),
612                       name,
613                       macro->name);
614       hash_jam (macro->formal_hash, name, formal);
615
616       formal->index = NARG_INDEX;
617       *p = formal;
618     }
619
620   return idx;
621 }
622
623 /* Free the memory allocated to a macro.  */
624
625 static void
626 free_macro (macro_entry *macro)
627 {
628   formal_entry *formal;
629
630   for (formal = macro->formals; formal; )
631     {
632       formal_entry *f;
633
634       f = formal;
635       formal = formal->next;
636       del_formal (f);
637     }
638   hash_die (macro->formal_hash);
639   sb_kill (&macro->sub);
640   free (macro);
641 }
642
643 /* Define a new macro.  Returns NULL on success, otherwise returns an
644    error message.  If NAMEP is not NULL, *NAMEP is set to the name of
645    the macro which was defined.  */
646
647 const char *
648 define_macro (size_t idx, sb *in, sb *label,
649               size_t (*get_line) (sb *),
650               const char *file, unsigned int line,
651               const char **namep)
652 {
653   macro_entry *macro;
654   sb name;
655   const char *error = NULL;
656
657   macro = XNEW (macro_entry);
658   sb_new (&macro->sub);
659   sb_new (&name);
660   macro->file = file;
661   macro->line = line;
662
663   macro->formal_count = 0;
664   macro->formals = 0;
665   macro->formal_hash = hash_new_sized (7);
666
667   idx = sb_skip_white (idx, in);
668   if (! buffer_and_nest ("MACRO", "ENDM", &macro->sub, get_line))
669     error = _("unexpected end of file in macro `%s' definition");
670   if (label != NULL && label->len != 0)
671     {
672       sb_add_sb (&name, label);
673       macro->name = sb_terminate (&name);
674       if (idx < in->len && in->ptr[idx] == '(')
675         {
676           /* It's the label: MACRO (formals,...)  sort  */
677           idx = do_formals (macro, idx + 1, in);
678           if (idx < in->len && in->ptr[idx] == ')')
679             idx = sb_skip_white (idx + 1, in);
680           else if (!error)
681             error = _("missing `)' after formals in macro definition `%s'");
682         }
683       else
684         {
685           /* It's the label: MACRO formals,...  sort  */
686           idx = do_formals (macro, idx, in);
687         }
688     }
689   else
690     {
691       size_t cidx;
692
693       idx = get_token (idx, in, &name);
694       macro->name = sb_terminate (&name);
695       if (name.len == 0)
696         error = _("Missing macro name");
697       cidx = sb_skip_white (idx, in);
698       idx = sb_skip_comma (cidx, in);
699       if (idx == cidx || idx < in->len)
700         idx = do_formals (macro, idx, in);
701       else
702         idx = cidx;
703     }
704   if (!error && idx < in->len)
705     error = _("Bad parameter list for macro `%s'");
706
707   /* And stick it in the macro hash table.  */
708   for (idx = 0; idx < name.len; idx++)
709     name.ptr[idx] = TOLOWER (name.ptr[idx]);
710   if (hash_find (macro_hash, macro->name))
711     error = _("Macro `%s' was already defined");
712   if (!error)
713     error = hash_jam (macro_hash, macro->name, (void *) macro);
714
715   if (namep != NULL)
716     *namep = macro->name;
717
718   if (!error)
719     macro_defined = 1;
720   else
721     free_macro (macro);
722
723   return error;
724 }
725
726 /* Scan a token, and then skip KIND.  */
727
728 static size_t
729 get_apost_token (size_t idx, sb *in, sb *name, int kind)
730 {
731   idx = get_token (idx, in, name);
732   if (idx < in->len
733       && in->ptr[idx] == kind
734       && (! macro_mri || macro_strip_at)
735       && (! macro_strip_at || kind == '@'))
736     idx++;
737   return idx;
738 }
739
740 /* Substitute the actual value for a formal parameter.  */
741
742 static size_t
743 sub_actual (size_t start, sb *in, sb *t, struct hash_control *formal_hash,
744             int kind, sb *out, int copyifnotthere)
745 {
746   size_t src;
747   formal_entry *ptr;
748
749   src = get_apost_token (start, in, t, kind);
750   /* See if it's in the macro's hash table, unless this is
751      macro_strip_at and kind is '@' and the token did not end in '@'.  */
752   if (macro_strip_at
753       && kind == '@'
754       && (src == start || in->ptr[src - 1] != '@'))
755     ptr = NULL;
756   else
757     ptr = (formal_entry *) hash_find (formal_hash, sb_terminate (t));
758   if (ptr)
759     {
760       if (ptr->actual.len)
761         {
762           sb_add_sb (out, &ptr->actual);
763         }
764       else
765         {
766           sb_add_sb (out, &ptr->def);
767         }
768     }
769   else if (kind == '&')
770     {
771       /* Doing this permits people to use & in macro bodies.  */
772       sb_add_char (out, '&');
773       sb_add_sb (out, t);
774       if (src != start && in->ptr[src - 1] == '&')
775         sb_add_char (out, '&');
776     }
777   else if (copyifnotthere)
778     {
779       sb_add_sb (out, t);
780     }
781   else
782     {
783       sb_add_char (out, '\\');
784       sb_add_sb (out, t);
785     }
786   return src;
787 }
788
789 /* Expand the body of a macro.  */
790
791 static const char *
792 macro_expand_body (sb *in, sb *out, formal_entry *formals,
793                    struct hash_control *formal_hash, const macro_entry *macro)
794 {
795   sb t;
796   size_t src = 0;
797   int inquote = 0, macro_line = 0;
798   formal_entry *loclist = NULL;
799   const char *err = NULL;
800
801   sb_new (&t);
802
803   while (src < in->len && !err)
804     {
805       if (in->ptr[src] == '&')
806         {
807           sb_reset (&t);
808           if (macro_mri)
809             {
810               if (src + 1 < in->len && in->ptr[src + 1] == '&')
811                 src = sub_actual (src + 2, in, &t, formal_hash, '\'', out, 1);
812               else
813                 sb_add_char (out, in->ptr[src++]);
814             }
815           else
816             {
817               /* Permit macro parameter substitution delineated with
818                  an '&' prefix and optional '&' suffix.  */
819               src = sub_actual (src + 1, in, &t, formal_hash, '&', out, 0);
820             }
821         }
822       else if (in->ptr[src] == '\\')
823         {
824           src++;
825           if (src < in->len && in->ptr[src] == '(')
826             {
827               /* Sub in till the next ')' literally.  */
828               src++;
829               while (src < in->len && in->ptr[src] != ')')
830                 {
831                   sb_add_char (out, in->ptr[src++]);
832                 }
833               if (src < in->len)
834                 src++;
835               else if (!macro)
836                 err = _("missing `)'");
837               else
838                 as_bad_where (macro->file, macro->line + macro_line, _("missing `)'"));
839             }
840           else if (src < in->len && in->ptr[src] == '@')
841             {
842               /* Sub in the macro invocation number.  */
843
844               char buffer[12];
845               src++;
846               sprintf (buffer, "%d", macro_number);
847               sb_add_string (out, buffer);
848             }
849           else if (src < in->len && in->ptr[src] == '&')
850             {
851               /* This is a preprocessor variable name, we don't do them
852                  here.  */
853               sb_add_char (out, '\\');
854               sb_add_char (out, '&');
855               src++;
856             }
857           else if (macro_mri && src < in->len && ISALNUM (in->ptr[src]))
858             {
859               int ind;
860               formal_entry *f;
861
862               if (ISDIGIT (in->ptr[src]))
863                 ind = in->ptr[src] - '0';
864               else if (ISUPPER (in->ptr[src]))
865                 ind = in->ptr[src] - 'A' + 10;
866               else
867                 ind = in->ptr[src] - 'a' + 10;
868               ++src;
869               for (f = formals; f != NULL; f = f->next)
870                 {
871                   if (f->index == ind - 1)
872                     {
873                       if (f->actual.len != 0)
874                         sb_add_sb (out, &f->actual);
875                       else
876                         sb_add_sb (out, &f->def);
877                       break;
878                     }
879                 }
880             }
881           else
882             {
883               sb_reset (&t);
884               src = sub_actual (src, in, &t, formal_hash, '\'', out, 0);
885             }
886         }
887       else if ((macro_alternate || macro_mri)
888                && is_name_beginner (in->ptr[src])
889                && (! inquote
890                    || ! macro_strip_at
891                    || (src > 0 && in->ptr[src - 1] == '@')))
892         {
893           if (! macro
894               || src + 5 >= in->len
895               || strncasecmp (in->ptr + src, "LOCAL", 5) != 0
896               || ! ISWHITE (in->ptr[src + 5])
897               /* PR 11507: Skip keyword LOCAL if it is found inside a quoted string.  */
898               || inquote)
899             {
900               sb_reset (&t);
901               src = sub_actual (src, in, &t, formal_hash,
902                                 (macro_strip_at && inquote) ? '@' : '\'',
903                                 out, 1);
904             }
905           else
906             {
907               src = sb_skip_white (src + 5, in);
908               while (in->ptr[src] != '\n')
909                 {
910                   const char *name;
911                   formal_entry *f = new_formal ();
912
913                   src = get_token (src, in, &f->name);
914                   name = sb_terminate (&f->name);
915                   if (! hash_find (formal_hash, name))
916                     {
917                       static int loccnt;
918                       char buf[20];
919
920                       f->index = LOCAL_INDEX;
921                       f->next = loclist;
922                       loclist = f;
923
924                       sprintf (buf, IS_ELF ? ".LL%04x" : "LL%04x", ++loccnt);
925                       sb_add_string (&f->actual, buf);
926
927                       err = hash_jam (formal_hash, name, f);
928                       if (err != NULL)
929                         break;
930                     }
931                   else
932                     {
933                       as_bad_where (macro->file,
934                                     macro->line + macro_line,
935                                     _("`%s' was already used as parameter (or another local) name"),
936                                     name);
937                       del_formal (f);
938                     }
939
940                   src = sb_skip_comma (src, in);
941                 }
942             }
943         }
944       else if (in->ptr[src] == '"'
945                || (macro_mri && in->ptr[src] == '\''))
946         {
947           inquote = !inquote;
948           sb_add_char (out, in->ptr[src++]);
949         }
950       else if (in->ptr[src] == '@' && macro_strip_at)
951         {
952           ++src;
953           if (src < in->len
954               && in->ptr[src] == '@')
955             {
956               sb_add_char (out, '@');
957               ++src;
958             }
959         }
960       else if (macro_mri
961                && in->ptr[src] == '='
962                && src + 1 < in->len
963                && in->ptr[src + 1] == '=')
964         {
965           formal_entry *ptr;
966
967           sb_reset (&t);
968           src = get_token (src + 2, in, &t);
969           ptr = (formal_entry *) hash_find (formal_hash, sb_terminate (&t));
970           if (ptr == NULL)
971             {
972               /* FIXME: We should really return a warning string here,
973                  but we can't, because the == might be in the MRI
974                  comment field, and, since the nature of the MRI
975                  comment field depends upon the exact instruction
976                  being used, we don't have enough information here to
977                  figure out whether it is or not.  Instead, we leave
978                  the == in place, which should cause a syntax error if
979                  it is not in a comment.  */
980               sb_add_char (out, '=');
981               sb_add_char (out, '=');
982               sb_add_sb (out, &t);
983             }
984           else
985             {
986               if (ptr->actual.len)
987                 {
988                   sb_add_string (out, "-1");
989                 }
990               else
991                 {
992                   sb_add_char (out, '0');
993                 }
994             }
995         }
996       else
997         {
998           if (in->ptr[src] == '\n')
999             ++macro_line;
1000           sb_add_char (out, in->ptr[src++]);
1001         }
1002     }
1003
1004   sb_kill (&t);
1005
1006   while (loclist != NULL)
1007     {
1008       formal_entry *f;
1009       const char *name;
1010
1011       f = loclist->next;
1012       name = sb_terminate (&loclist->name);
1013       hash_delete (formal_hash, name, f == NULL);
1014       del_formal (loclist);
1015       loclist = f;
1016     }
1017
1018   return err;
1019 }
1020
1021 /* Assign values to the formal parameters of a macro, and expand the
1022    body.  */
1023
1024 static const char *
1025 macro_expand (size_t idx, sb *in, macro_entry *m, sb *out)
1026 {
1027   sb t;
1028   formal_entry *ptr;
1029   formal_entry *f;
1030   int is_keyword = 0;
1031   int narg = 0;
1032   const char *err = NULL;
1033
1034   sb_new (&t);
1035
1036   /* Reset any old value the actuals may have.  */
1037   for (f = m->formals; f; f = f->next)
1038     sb_reset (&f->actual);
1039   f = m->formals;
1040   while (f != NULL && f->index < 0)
1041     f = f->next;
1042
1043   if (macro_mri)
1044     {
1045       /* The macro may be called with an optional qualifier, which may
1046          be referred to in the macro body as \0.  */
1047       if (idx < in->len && in->ptr[idx] == '.')
1048         {
1049           /* The Microtec assembler ignores this if followed by a white space.
1050              (Macro invocation with empty extension) */
1051           idx++;
1052           if (    idx < in->len
1053                   && in->ptr[idx] != ' '
1054                   && in->ptr[idx] != '\t')
1055             {
1056               formal_entry *n = new_formal ();
1057
1058               n->index = QUAL_INDEX;
1059
1060               n->next = m->formals;
1061               m->formals = n;
1062
1063               idx = get_any_string (idx, in, &n->actual);
1064             }
1065         }
1066     }
1067
1068   /* Peel off the actuals and store them away in the hash tables' actuals.  */
1069   idx = sb_skip_white (idx, in);
1070   while (idx < in->len)
1071     {
1072       size_t scan;
1073
1074       /* Look and see if it's a positional or keyword arg.  */
1075       scan = idx;
1076       while (scan < in->len
1077              && !ISSEP (in->ptr[scan])
1078              && !(macro_mri && in->ptr[scan] == '\'')
1079              && (!macro_alternate && in->ptr[scan] != '='))
1080         scan++;
1081       if (scan < in->len && !macro_alternate && in->ptr[scan] == '=')
1082         {
1083           is_keyword = 1;
1084
1085           /* It's OK to go from positional to keyword.  */
1086
1087           /* This is a keyword arg, fetch the formal name and
1088              then the actual stuff.  */
1089           sb_reset (&t);
1090           idx = get_token (idx, in, &t);
1091           if (in->ptr[idx] != '=')
1092             {
1093               err = _("confusion in formal parameters");
1094               break;
1095             }
1096
1097           /* Lookup the formal in the macro's list.  */
1098           ptr = (formal_entry *) hash_find (m->formal_hash, sb_terminate (&t));
1099           if (!ptr)
1100             {
1101               as_bad (_("Parameter named `%s' does not exist for macro `%s'"),
1102                       t.ptr,
1103                       m->name);
1104               sb_reset (&t);
1105               idx = get_any_string (idx + 1, in, &t);
1106             }
1107           else
1108             {
1109               /* Insert this value into the right place.  */
1110               if (ptr->actual.len)
1111                 {
1112                   as_warn (_("Value for parameter `%s' of macro `%s' was already specified"),
1113                            ptr->name.ptr,
1114                            m->name);
1115                   sb_reset (&ptr->actual);
1116                 }
1117               idx = get_any_string (idx + 1, in, &ptr->actual);
1118               if (ptr->actual.len > 0)
1119                 ++narg;
1120             }
1121         }
1122       else
1123         {
1124           if (is_keyword)
1125             {
1126               err = _("can't mix positional and keyword arguments");
1127               break;
1128             }
1129
1130           if (!f)
1131             {
1132               formal_entry **pf;
1133               int c;
1134
1135               if (!macro_mri)
1136                 {
1137                   err = _("too many positional arguments");
1138                   break;
1139                 }
1140
1141               f = new_formal ();
1142
1143               c = -1;
1144               for (pf = &m->formals; *pf != NULL; pf = &(*pf)->next)
1145                 if ((*pf)->index >= c)
1146                   c = (*pf)->index + 1;
1147               if (c == -1)
1148                 c = 0;
1149               *pf = f;
1150               f->index = c;
1151             }
1152
1153           if (f->type != FORMAL_VARARG)
1154             idx = get_any_string (idx, in, &f->actual);
1155           else
1156             {
1157               sb_add_buffer (&f->actual, in->ptr + idx, in->len - idx);
1158               idx = in->len;
1159             }
1160           if (f->actual.len > 0)
1161             ++narg;
1162           do
1163             {
1164               f = f->next;
1165             }
1166           while (f != NULL && f->index < 0);
1167         }
1168
1169       if (! macro_mri)
1170         idx = sb_skip_comma (idx, in);
1171       else
1172         {
1173           if (in->ptr[idx] == ',')
1174             ++idx;
1175           if (ISWHITE (in->ptr[idx]))
1176             break;
1177         }
1178     }
1179
1180   if (! err)
1181     {
1182       for (ptr = m->formals; ptr; ptr = ptr->next)
1183         {
1184           if (ptr->type == FORMAL_REQUIRED && ptr->actual.len == 0)
1185             as_bad (_("Missing value for required parameter `%s' of macro `%s'"),
1186                     ptr->name.ptr,
1187                     m->name);
1188         }
1189
1190       if (macro_mri)
1191         {
1192           char buffer[20];
1193
1194           sb_reset (&t);
1195           sb_add_string (&t, macro_strip_at ? "$NARG" : "NARG");
1196           ptr = (formal_entry *) hash_find (m->formal_hash, sb_terminate (&t));
1197           sprintf (buffer, "%d", narg);
1198           sb_add_string (&ptr->actual, buffer);
1199         }
1200
1201       err = macro_expand_body (&m->sub, out, m->formals, m->formal_hash, m);
1202     }
1203
1204   /* Discard any unnamed formal arguments.  */
1205   if (macro_mri)
1206     {
1207       formal_entry **pf;
1208
1209       pf = &m->formals;
1210       while (*pf != NULL)
1211         {
1212           if ((*pf)->name.len != 0)
1213             pf = &(*pf)->next;
1214           else
1215             {
1216               f = (*pf)->next;
1217               del_formal (*pf);
1218               *pf = f;
1219             }
1220         }
1221     }
1222
1223   sb_kill (&t);
1224   if (!err)
1225     macro_number++;
1226
1227   return err;
1228 }
1229
1230 /* Check for a macro.  If one is found, put the expansion into
1231    *EXPAND.  Return 1 if a macro is found, 0 otherwise.  */
1232
1233 int
1234 check_macro (const char *line, sb *expand,
1235              const char **error, macro_entry **info)
1236 {
1237   const char *s;
1238   char *copy, *cls;
1239   macro_entry *macro;
1240   sb line_sb;
1241
1242   if (! is_name_beginner (*line)
1243       && (! macro_mri || *line != '.'))
1244     return 0;
1245
1246   s = line + 1;
1247   while (is_part_of_name (*s))
1248     ++s;
1249   if (is_name_ender (*s))
1250     ++s;
1251
1252   copy = xmemdup0 (line, s - line);
1253   for (cls = copy; *cls != '\0'; cls ++)
1254     *cls = TOLOWER (*cls);
1255
1256   macro = (macro_entry *) hash_find (macro_hash, copy);
1257   free (copy);
1258
1259   if (macro == NULL)
1260     return 0;
1261
1262   /* Wrap the line up in an sb.  */
1263   sb_new (&line_sb);
1264   while (*s != '\0' && *s != '\n' && *s != '\r')
1265     sb_add_char (&line_sb, *s++);
1266
1267   sb_new (expand);
1268   *error = macro_expand (0, &line_sb, macro, expand);
1269
1270   sb_kill (&line_sb);
1271
1272   /* Export the macro information if requested.  */
1273   if (info)
1274     *info = macro;
1275
1276   return 1;
1277 }
1278
1279 /* Delete a macro.  */
1280
1281 void
1282 delete_macro (const char *name)
1283 {
1284   char *copy;
1285   size_t i, len;
1286   macro_entry *macro;
1287
1288   len = strlen (name);
1289   copy = XNEWVEC (char, len + 1);
1290   for (i = 0; i < len; ++i)
1291     copy[i] = TOLOWER (name[i]);
1292   copy[i] = '\0';
1293
1294   /* We can only ask hash_delete to free memory if we are deleting
1295      macros in reverse order to their definition.
1296      So just clear out the entry.  */
1297   if ((macro = (macro_entry *) hash_find (macro_hash, copy)) != NULL)
1298     {
1299       hash_jam (macro_hash, copy, NULL);
1300       free_macro (macro);
1301     }
1302   else
1303     as_warn (_("Attempt to purge non-existing macro `%s'"), copy);
1304   free (copy);
1305 }
1306
1307 /* Handle the MRI IRP and IRPC pseudo-ops.  These are handled as a
1308    combined macro definition and execution.  This returns NULL on
1309    success, or an error message otherwise.  */
1310
1311 const char *
1312 expand_irp (int irpc, size_t idx, sb *in, sb *out, size_t (*get_line) (sb *))
1313 {
1314   sb sub;
1315   formal_entry f;
1316   struct hash_control *h;
1317   const char *err;
1318
1319   idx = sb_skip_white (idx, in);
1320
1321   sb_new (&sub);
1322   if (! buffer_and_nest (NULL, "ENDR", &sub, get_line))
1323     return _("unexpected end of file in irp or irpc");
1324
1325   sb_new (&f.name);
1326   sb_new (&f.def);
1327   sb_new (&f.actual);
1328
1329   idx = get_token (idx, in, &f.name);
1330   if (f.name.len == 0)
1331     return _("missing model parameter");
1332
1333   h = hash_new ();
1334   err = hash_jam (h, sb_terminate (&f.name), &f);
1335   if (err != NULL)
1336     return err;
1337
1338   f.index = 1;
1339   f.next = NULL;
1340   f.type = FORMAL_OPTIONAL;
1341
1342   sb_reset (out);
1343
1344   idx = sb_skip_comma (idx, in);
1345   if (idx >= in->len)
1346     {
1347       /* Expand once with a null string.  */
1348       err = macro_expand_body (&sub, out, &f, h, 0);
1349     }
1350   else
1351     {
1352       bfd_boolean in_quotes = FALSE;
1353
1354       if (irpc && in->ptr[idx] == '"')
1355         {
1356           in_quotes = TRUE;
1357           ++idx;
1358         }
1359
1360       while (idx < in->len)
1361         {
1362           if (!irpc)
1363             idx = get_any_string (idx, in, &f.actual);
1364           else
1365             {
1366               if (in->ptr[idx] == '"')
1367                 {
1368                   size_t nxt;
1369
1370                   if (irpc)
1371                     in_quotes = ! in_quotes;
1372
1373                   nxt = sb_skip_white (idx + 1, in);
1374                   if (nxt >= in->len)
1375                     {
1376                       idx = nxt;
1377                       break;
1378                     }
1379                 }
1380               sb_reset (&f.actual);
1381               sb_add_char (&f.actual, in->ptr[idx]);
1382               ++idx;
1383             }
1384
1385           err = macro_expand_body (&sub, out, &f, h, 0);
1386           if (err != NULL)
1387             break;
1388           if (!irpc)
1389             idx = sb_skip_comma (idx, in);
1390           else if (! in_quotes)
1391             idx = sb_skip_white (idx, in);
1392         }
1393     }
1394
1395   hash_die (h);
1396   sb_kill (&f.actual);
1397   sb_kill (&f.def);
1398   sb_kill (&f.name);
1399   sb_kill (&sub);
1400
1401   return err;
1402 }