Automatic date update in version.in
[binutils-gdb.git] / gas / macro.c
blobc2a47684b15d74d1d807a6b167d6535652f20306
1 /* macro.c - macro support for gas
2 Copyright (C) 1994-2022 Free Software Foundation, Inc.
4 Written by Steve and Judy Chamberlain of Cygnus Support,
5 sac@cygnus.com
7 This file is part of GAS, the GNU Assembler.
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.
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.
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. */
24 #include "as.h"
25 #include "safe-ctype.h"
26 #include "sb.h"
27 #include "macro.h"
29 /* The routines in this file handle macro definition and expansion.
30 They are called by gas. */
32 #define ISWHITE(x) ((x) == ' ' || (x) == '\t')
34 #define ISSEP(x) \
35 ((x) == ' ' || (x) == '\t' || (x) == ',' || (x) == '"' || (x) == ';' \
36 || (x) == ')' || (x) == '(' \
37 || ((macro_alternate || macro_mri) && ((x) == '<' || (x) == '>')))
39 #define ISBASE(x) \
40 ((x) == 'b' || (x) == 'B' \
41 || (x) == 'q' || (x) == 'Q' \
42 || (x) == 'h' || (x) == 'H' \
43 || (x) == 'd' || (x) == 'D')
45 /* The macro hash table. */
47 htab_t macro_hash;
49 /* Whether any macros have been defined. */
51 int macro_defined;
53 /* Whether we are in alternate syntax mode. */
55 static int macro_alternate;
57 /* Whether we are in MRI mode. */
59 static int macro_mri;
61 /* Whether we should strip '@' characters. */
63 static int macro_strip_at;
65 /* Function to use to parse an expression. */
67 static size_t (*macro_expr) (const char *, size_t, sb *, offsetT *);
69 /* Number of macro expansions that have been done. */
71 static int macro_number;
73 /* Initialize macro processing. */
75 void
76 macro_init (int alternate, int mri, int strip_at,
77 size_t (*exp) (const char *, size_t, sb *, offsetT *))
79 macro_hash = str_htab_create ();
80 macro_defined = 0;
81 macro_alternate = alternate;
82 macro_mri = mri;
83 macro_strip_at = strip_at;
84 macro_expr = exp;
87 void
88 macro_end (void)
90 htab_delete (macro_hash);
93 /* Switch in and out of alternate mode on the fly. */
95 void
96 macro_set_alternate (int alternate)
98 macro_alternate = alternate;
101 /* Switch in and out of MRI mode on the fly. */
103 void
104 macro_mri_mode (int mri)
106 macro_mri = mri;
109 /* Read input lines till we get to a TO string.
110 Increase nesting depth if we get a FROM string.
111 Put the results into sb at PTR.
112 FROM may be NULL (or will be ignored) if TO is "ENDR".
113 Add a new input line to an sb using GET_LINE.
114 Return 1 on success, 0 on unexpected EOF. */
117 buffer_and_nest (const char *from, const char *to, sb *ptr,
118 size_t (*get_line) (sb *))
120 size_t from_len;
121 size_t to_len = strlen (to);
122 int depth = 1;
123 size_t line_start = ptr->len;
124 size_t more = get_line (ptr);
126 if (to_len == 4 && strcasecmp (to, "ENDR") == 0)
128 from = NULL;
129 from_len = 0;
131 else
132 from_len = strlen (from);
134 /* Except for macros record the present source position, such that
135 diagnostics and debug info will be properly associated with the
136 respective original lines, rather than with the line of the ending
137 directive (TO). */
138 if (from == NULL || strcasecmp (from, "MACRO") != 0)
140 unsigned int line;
141 char *linefile;
143 as_where (&line);
144 if (!flag_m68k_mri)
145 linefile = xasprintf ("\t.linefile %u .\n", line);
146 else
147 linefile = xasprintf ("\tlinefile %u .\n", line);
148 sb_add_buffer (ptr, linefile, strlen (linefile));
149 xfree (linefile);
152 while (more)
154 /* Try to find the first pseudo op on the line. */
155 size_t i = line_start;
156 bool had_colon = false;
158 /* With normal syntax we can suck what we want till we get
159 to the dot. With the alternate, labels have to start in
160 the first column, since we can't tell what's a label and
161 what's a pseudoop. */
163 if (! LABELS_WITHOUT_COLONS)
165 /* Skip leading whitespace. */
166 while (i < ptr->len && ISWHITE (ptr->ptr[i]))
167 i++;
170 for (;;)
172 /* Skip over a label, if any. */
173 if (i >= ptr->len || ! is_name_beginner (ptr->ptr[i]))
174 break;
175 i++;
176 while (i < ptr->len && is_part_of_name (ptr->ptr[i]))
177 i++;
178 if (i < ptr->len && is_name_ender (ptr->ptr[i]))
179 i++;
180 /* Skip whitespace. */
181 while (i < ptr->len && ISWHITE (ptr->ptr[i]))
182 i++;
183 /* Check for the colon. */
184 if (i >= ptr->len || ptr->ptr[i] != ':')
186 /* LABELS_WITHOUT_COLONS doesn't mean we cannot have a
187 colon after a label. If we do have a colon on the
188 first label then handle more than one label on the
189 line, assuming that each label has a colon. */
190 if (LABELS_WITHOUT_COLONS && !had_colon)
191 break;
192 i = line_start;
193 break;
195 i++;
196 line_start = i;
197 had_colon = true;
200 /* Skip trailing whitespace. */
201 while (i < ptr->len && ISWHITE (ptr->ptr[i]))
202 i++;
204 if (i < ptr->len && (ptr->ptr[i] == '.'
205 || NO_PSEUDO_DOT
206 || macro_mri))
208 if (! flag_m68k_mri && ptr->ptr[i] == '.')
209 i++;
210 size_t len = ptr->len - i;
211 if (from == NULL)
213 if (len >= 5 && strncasecmp (ptr->ptr + i, "IREPC", 5) == 0)
214 from_len = 5;
215 else if (len >= 4 && strncasecmp (ptr->ptr + i, "IREP", 4) == 0)
216 from_len = 4;
217 else if (len >= 4 && strncasecmp (ptr->ptr + i, "IRPC", 4) == 0)
218 from_len = 4;
219 else if (len >= 4 && strncasecmp (ptr->ptr + i, "REPT", 4) == 0)
220 from_len = 4;
221 else if (len >= 3 && strncasecmp (ptr->ptr + i, "IRP", 3) == 0)
222 from_len = 3;
223 else if (len >= 3 && strncasecmp (ptr->ptr + i, "REP", 3) == 0)
224 from_len = 3;
225 else
226 from_len = 0;
228 if ((from != NULL
229 ? (len >= from_len
230 && strncasecmp (ptr->ptr + i, from, from_len) == 0)
231 : from_len > 0)
232 && (len == from_len
233 || ! (is_part_of_name (ptr->ptr[i + from_len])
234 || is_name_ender (ptr->ptr[i + from_len]))))
235 depth++;
236 if (len >= to_len
237 && strncasecmp (ptr->ptr + i, to, to_len) == 0
238 && (len == to_len
239 || ! (is_part_of_name (ptr->ptr[i + to_len])
240 || is_name_ender (ptr->ptr[i + to_len]))))
242 depth--;
243 if (depth == 0)
245 /* Reset the string to not include the ending rune. */
246 ptr->len = line_start;
247 break;
251 /* PR gas/16908
252 Apply and discard .linefile directives that appear within
253 the macro. For long macros, one might want to report the
254 line number information associated with the lines within
255 the macro definition, but we would need more infrastructure
256 to make that happen correctly (e.g. resetting the line
257 number when expanding the macro), and since for short
258 macros we clearly prefer reporting the point of expansion
259 anyway, there's not an obviously better fix here. */
260 if (from != NULL && strcasecmp (from, "MACRO") == 0
261 && len >= 8 && strncasecmp (ptr->ptr + i, "linefile", 8) == 0)
263 char saved_eol_char = ptr->ptr[ptr->len];
265 ptr->ptr[ptr->len] = '\0';
266 temp_ilp (ptr->ptr + i + 8);
267 s_linefile (0);
268 restore_ilp ();
269 ptr->ptr[ptr->len] = saved_eol_char;
270 ptr->len = line_start;
274 /* Add the original end-of-line char to the end and keep running. */
275 sb_add_char (ptr, more);
276 line_start = ptr->len;
277 more = get_line (ptr);
280 /* Return 1 on success, 0 on unexpected EOF. */
281 return depth == 0;
284 /* Pick up a token. */
286 static size_t
287 get_token (size_t idx, sb *in, sb *name)
289 if (idx < in->len
290 && is_name_beginner (in->ptr[idx]))
292 sb_add_char (name, in->ptr[idx++]);
293 while (idx < in->len
294 && is_part_of_name (in->ptr[idx]))
296 sb_add_char (name, in->ptr[idx++]);
298 if (idx < in->len
299 && is_name_ender (in->ptr[idx]))
301 sb_add_char (name, in->ptr[idx++]);
304 /* Ignore trailing &. */
305 if (macro_alternate && idx < in->len && in->ptr[idx] == '&')
306 idx++;
307 return idx;
310 /* Pick up a string. */
312 static size_t
313 getstring (size_t idx, sb *in, sb *acc)
315 while (idx < in->len
316 && (in->ptr[idx] == '"'
317 || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
318 || (in->ptr[idx] == '\'' && macro_alternate)))
320 if (in->ptr[idx] == '<')
322 int nest = 0;
323 idx++;
324 while (idx < in->len
325 && (in->ptr[idx] != '>' || nest))
327 if (in->ptr[idx] == '!')
329 idx++;
330 sb_add_char (acc, in->ptr[idx++]);
332 else
334 if (in->ptr[idx] == '>')
335 nest--;
336 if (in->ptr[idx] == '<')
337 nest++;
338 sb_add_char (acc, in->ptr[idx++]);
341 idx++;
343 else if (in->ptr[idx] == '"' || in->ptr[idx] == '\'')
345 char tchar = in->ptr[idx];
346 int escaped = 0;
348 idx++;
350 while (idx < in->len)
352 if (in->ptr[idx - 1] == '\\')
353 escaped ^= 1;
354 else
355 escaped = 0;
357 if (macro_alternate && in->ptr[idx] == '!')
359 idx ++;
361 sb_add_char (acc, in->ptr[idx]);
363 idx ++;
365 else if (escaped && in->ptr[idx] == tchar)
367 sb_add_char (acc, tchar);
368 idx ++;
370 else
372 if (in->ptr[idx] == tchar)
374 idx ++;
376 if (idx >= in->len || in->ptr[idx] != tchar)
377 break;
380 sb_add_char (acc, in->ptr[idx]);
381 idx ++;
387 return idx;
390 /* Fetch string from the input stream,
391 rules:
392 'Bxyx<whitespace> -> return 'Bxyza
393 %<expr> -> return string of decimal value of <expr>
394 "string" -> return string
395 (string) -> return (string-including-whitespaces)
396 xyx<whitespace> -> return xyz. */
398 static size_t
399 get_any_string (size_t idx, sb *in, sb *out)
401 sb_reset (out);
402 idx = sb_skip_white (idx, in);
404 if (idx < in->len)
406 if (in->len > idx + 2 && in->ptr[idx + 1] == '\'' && ISBASE (in->ptr[idx]))
408 while (idx < in->len && !ISSEP (in->ptr[idx]))
409 sb_add_char (out, in->ptr[idx++]);
411 else if (in->ptr[idx] == '%' && macro_alternate)
413 offsetT val;
414 char buf[64];
416 /* Turns the next expression into a string. */
417 /* xgettext: no-c-format */
418 idx = (*macro_expr) (_("% operator needs absolute expression"),
419 idx + 1,
421 &val);
422 sprintf (buf, "%" PRId64, (int64_t) val);
423 sb_add_string (out, buf);
425 else if (in->ptr[idx] == '"'
426 || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
427 || (macro_alternate && in->ptr[idx] == '\''))
429 if (macro_alternate && ! macro_strip_at && in->ptr[idx] != '<')
431 /* Keep the quotes. */
432 sb_add_char (out, '"');
433 idx = getstring (idx, in, out);
434 sb_add_char (out, '"');
436 else
438 idx = getstring (idx, in, out);
441 else
443 char *br_buf = XNEWVEC (char, 1);
444 char *in_br = br_buf;
446 *in_br = '\0';
447 while (idx < in->len
448 && (*in_br
449 || (in->ptr[idx] != ' '
450 && in->ptr[idx] != '\t'))
451 && in->ptr[idx] != ','
452 && (in->ptr[idx] != '<'
453 || (! macro_alternate && ! macro_mri)))
455 char tchar = in->ptr[idx];
457 switch (tchar)
459 case '"':
460 case '\'':
461 sb_add_char (out, in->ptr[idx++]);
462 while (idx < in->len
463 && in->ptr[idx] != tchar)
464 sb_add_char (out, in->ptr[idx++]);
465 if (idx == in->len)
467 free (br_buf);
468 return idx;
470 break;
471 case '(':
472 case '[':
473 if (in_br > br_buf)
474 --in_br;
475 else
477 br_buf = XNEWVEC (char, strlen (in_br) + 2);
478 strcpy (br_buf + 1, in_br);
479 free (in_br);
480 in_br = br_buf;
482 *in_br = tchar;
483 break;
484 case ')':
485 if (*in_br == '(')
486 ++in_br;
487 break;
488 case ']':
489 if (*in_br == '[')
490 ++in_br;
491 break;
493 sb_add_char (out, tchar);
494 ++idx;
496 free (br_buf);
500 return idx;
503 /* Allocate a new formal. */
505 static formal_entry *
506 new_formal (void)
508 formal_entry *formal;
510 formal = XNEW (formal_entry);
512 sb_new (&formal->name);
513 sb_new (&formal->def);
514 sb_new (&formal->actual);
515 formal->next = NULL;
516 formal->type = FORMAL_OPTIONAL;
517 return formal;
520 /* Free a formal. */
522 static void
523 del_formal (formal_entry *formal)
525 sb_kill (&formal->actual);
526 sb_kill (&formal->def);
527 sb_kill (&formal->name);
528 free (formal);
531 /* Pick up the formal parameters of a macro definition. */
533 static size_t
534 do_formals (macro_entry *macro, size_t idx, sb *in)
536 formal_entry **p = &macro->formals;
537 const char *name;
539 idx = sb_skip_white (idx, in);
540 while (idx < in->len)
542 formal_entry *formal = new_formal ();
543 size_t cidx;
545 idx = get_token (idx, in, &formal->name);
546 if (formal->name.len == 0)
548 if (macro->formal_count)
549 --idx;
550 del_formal (formal); /* 'formal' goes out of scope. */
551 break;
553 idx = sb_skip_white (idx, in);
554 /* This is a formal. */
555 name = sb_terminate (&formal->name);
556 if (! macro_mri
557 && idx < in->len
558 && in->ptr[idx] == ':'
559 && (! is_name_beginner (':')
560 || idx + 1 >= in->len
561 || ! is_part_of_name (in->ptr[idx + 1])))
563 /* Got a qualifier. */
564 sb qual;
566 sb_new (&qual);
567 idx = get_token (sb_skip_white (idx + 1, in), in, &qual);
568 sb_terminate (&qual);
569 if (qual.len == 0)
570 as_bad_where (macro->file,
571 macro->line,
572 _("Missing parameter qualifier for `%s' in macro `%s'"),
573 name,
574 macro->name);
575 else if (strcmp (qual.ptr, "req") == 0)
576 formal->type = FORMAL_REQUIRED;
577 else if (strcmp (qual.ptr, "vararg") == 0)
578 formal->type = FORMAL_VARARG;
579 else
580 as_bad_where (macro->file,
581 macro->line,
582 _("`%s' is not a valid parameter qualifier for `%s' in macro `%s'"),
583 qual.ptr,
584 name,
585 macro->name);
586 sb_kill (&qual);
587 idx = sb_skip_white (idx, in);
589 if (idx < in->len && in->ptr[idx] == '=')
591 /* Got a default. */
592 idx = get_any_string (idx + 1, in, &formal->def);
593 idx = sb_skip_white (idx, in);
594 if (formal->type == FORMAL_REQUIRED)
596 sb_reset (&formal->def);
597 as_warn_where (macro->file,
598 macro->line,
599 _("Pointless default value for required parameter `%s' in macro `%s'"),
600 name,
601 macro->name);
605 /* Add to macro's hash table. */
606 if (str_hash_insert (macro->formal_hash, name, formal, 0) != NULL)
608 as_bad_where (macro->file, macro->line,
609 _("A parameter named `%s' "
610 "already exists for macro `%s'"),
611 name, macro->name);
614 formal->index = macro->formal_count++;
615 *p = formal;
616 p = &formal->next;
617 if (formal->type == FORMAL_VARARG)
618 break;
619 cidx = idx;
620 idx = sb_skip_comma (idx, in);
621 if (idx != cidx && idx >= in->len)
623 idx = cidx;
624 break;
628 if (macro_mri)
630 formal_entry *formal = new_formal ();
632 /* Add a special NARG formal, which macro_expand will set to the
633 number of arguments. */
634 /* The same MRI assemblers which treat '@' characters also use
635 the name $NARG. At least until we find an exception. */
636 if (macro_strip_at)
637 name = "$NARG";
638 else
639 name = "NARG";
641 sb_add_string (&formal->name, name);
643 /* Add to macro's hash table. */
644 if (str_hash_insert (macro->formal_hash, name, formal, 0) != NULL)
646 as_bad_where (macro->file, macro->line,
647 _("Reserved word `%s' used as parameter in macro `%s'"),
648 name, macro->name);
651 formal->index = NARG_INDEX;
652 *p = formal;
655 return idx;
658 /* Free the memory allocated to a macro. */
660 static void
661 free_macro (macro_entry *macro)
663 formal_entry *formal;
665 for (formal = macro->formals; formal; )
667 formal_entry *f;
669 f = formal;
670 formal = formal->next;
671 del_formal (f);
673 htab_delete (macro->formal_hash);
674 sb_kill (&macro->sub);
675 free (macro);
678 /* Define a new macro. Returns NULL on success, otherwise returns an
679 error message. If NAMEP is not NULL, *NAMEP is set to the name of
680 the macro which was defined. */
682 const char *
683 define_macro (size_t idx, sb *in, sb *label,
684 size_t (*get_line) (sb *),
685 const char *file, unsigned int line,
686 const char **namep)
688 macro_entry *macro;
689 sb name;
690 const char *error = NULL;
692 macro = XNEW (macro_entry);
693 sb_new (&macro->sub);
694 sb_new (&name);
695 macro->file = file;
696 macro->line = line;
698 macro->formal_count = 0;
699 macro->formals = 0;
700 macro->formal_hash = str_htab_create ();
702 idx = sb_skip_white (idx, in);
703 if (! buffer_and_nest ("MACRO", "ENDM", &macro->sub, get_line))
704 error = _("unexpected end of file in macro `%s' definition");
705 if (label != NULL && label->len != 0)
707 sb_add_sb (&name, label);
708 macro->name = sb_terminate (&name);
709 if (idx < in->len && in->ptr[idx] == '(')
711 /* It's the label: MACRO (formals,...) sort */
712 idx = do_formals (macro, idx + 1, in);
713 if (idx < in->len && in->ptr[idx] == ')')
714 idx = sb_skip_white (idx + 1, in);
715 else if (!error)
716 error = _("missing `)' after formals in macro definition `%s'");
718 else
720 /* It's the label: MACRO formals,... sort */
721 idx = do_formals (macro, idx, in);
724 else
726 size_t cidx;
728 idx = get_token (idx, in, &name);
729 macro->name = sb_terminate (&name);
730 if (name.len == 0)
731 error = _("Missing macro name");
732 cidx = sb_skip_white (idx, in);
733 idx = sb_skip_comma (cidx, in);
734 if (idx == cidx || idx < in->len)
735 idx = do_formals (macro, idx, in);
736 else
737 idx = cidx;
739 if (!error && idx < in->len)
740 error = _("Bad parameter list for macro `%s'");
742 /* And stick it in the macro hash table. */
743 for (idx = 0; idx < name.len; idx++)
744 name.ptr[idx] = TOLOWER (name.ptr[idx]);
745 if (!error)
747 if (str_hash_insert (macro_hash, macro->name, macro, 0) != NULL)
748 error = _("Macro `%s' was already defined");
751 if (namep != NULL)
752 *namep = macro->name;
754 if (!error)
755 macro_defined = 1;
756 else
757 free_macro (macro);
759 return error;
762 /* Scan a token, and then skip KIND. */
764 static size_t
765 get_apost_token (size_t idx, sb *in, sb *name, int kind)
767 idx = get_token (idx, in, name);
768 if (idx < in->len
769 && in->ptr[idx] == kind
770 && (! macro_mri || macro_strip_at)
771 && (! macro_strip_at || kind == '@'))
772 idx++;
773 return idx;
776 /* Substitute the actual value for a formal parameter. */
778 static size_t
779 sub_actual (size_t start, sb *in, sb *t, struct htab *formal_hash,
780 int kind, sb *out, int copyifnotthere)
782 size_t src;
783 formal_entry *ptr;
785 src = get_apost_token (start, in, t, kind);
786 /* See if it's in the macro's hash table, unless this is
787 macro_strip_at and kind is '@' and the token did not end in '@'. */
788 if (macro_strip_at
789 && kind == '@'
790 && (src == start || in->ptr[src - 1] != '@'))
791 ptr = NULL;
792 else
793 ptr = str_hash_find (formal_hash, sb_terminate (t));
794 if (ptr)
796 if (ptr->actual.len)
798 sb_add_sb (out, &ptr->actual);
800 else
802 sb_add_sb (out, &ptr->def);
805 else if (kind == '&')
807 /* Doing this permits people to use & in macro bodies. */
808 sb_add_char (out, '&');
809 sb_add_sb (out, t);
810 if (src != start && in->ptr[src - 1] == '&')
811 sb_add_char (out, '&');
813 else if (copyifnotthere)
815 sb_add_sb (out, t);
817 else
819 sb_add_char (out, '\\');
820 sb_add_sb (out, t);
822 return src;
825 /* Expand the body of a macro. */
827 static const char *
828 macro_expand_body (sb *in, sb *out, formal_entry *formals,
829 struct htab *formal_hash, const macro_entry *macro)
831 sb t;
832 size_t src = 0;
833 int inquote = 0, macro_line = 0;
834 formal_entry *loclist = NULL;
835 const char *err = NULL;
837 sb_new (&t);
839 while (src < in->len && !err)
841 if (in->ptr[src] == '&')
843 sb_reset (&t);
844 if (macro_mri)
846 if (src + 1 < in->len && in->ptr[src + 1] == '&')
847 src = sub_actual (src + 2, in, &t, formal_hash, '\'', out, 1);
848 else
849 sb_add_char (out, in->ptr[src++]);
851 else
853 /* Permit macro parameter substitution delineated with
854 an '&' prefix and optional '&' suffix. */
855 src = sub_actual (src + 1, in, &t, formal_hash, '&', out, 0);
858 else if (in->ptr[src] == '\\')
860 src++;
861 if (src < in->len && in->ptr[src] == '(')
863 /* Sub in till the next ')' literally. */
864 src++;
865 while (src < in->len && in->ptr[src] != ')')
867 sb_add_char (out, in->ptr[src++]);
869 if (src < in->len)
870 src++;
871 else if (!macro)
872 err = _("missing `)'");
873 else
874 as_bad_where (macro->file, macro->line + macro_line, _("missing `)'"));
876 else if (src < in->len && in->ptr[src] == '@')
878 /* Sub in the macro invocation number. */
880 char buffer[12];
881 src++;
882 sprintf (buffer, "%d", macro_number);
883 sb_add_string (out, buffer);
885 else if (src < in->len && in->ptr[src] == '&')
887 /* This is a preprocessor variable name, we don't do them
888 here. */
889 sb_add_char (out, '\\');
890 sb_add_char (out, '&');
891 src++;
893 else if (macro_mri && src < in->len && ISALNUM (in->ptr[src]))
895 int ind;
896 formal_entry *f;
898 if (ISDIGIT (in->ptr[src]))
899 ind = in->ptr[src] - '0';
900 else if (ISUPPER (in->ptr[src]))
901 ind = in->ptr[src] - 'A' + 10;
902 else
903 ind = in->ptr[src] - 'a' + 10;
904 ++src;
905 for (f = formals; f != NULL; f = f->next)
907 if (f->index == ind - 1)
909 if (f->actual.len != 0)
910 sb_add_sb (out, &f->actual);
911 else
912 sb_add_sb (out, &f->def);
913 break;
917 else
919 sb_reset (&t);
920 src = sub_actual (src, in, &t, formal_hash, '\'', out, 0);
923 else if ((macro_alternate || macro_mri)
924 && is_name_beginner (in->ptr[src])
925 && (! inquote
926 || ! macro_strip_at
927 || (src > 0 && in->ptr[src - 1] == '@')))
929 if (! macro
930 || src + 5 >= in->len
931 || strncasecmp (in->ptr + src, "LOCAL", 5) != 0
932 || ! ISWHITE (in->ptr[src + 5])
933 /* PR 11507: Skip keyword LOCAL if it is found inside a quoted string. */
934 || inquote)
936 sb_reset (&t);
937 src = sub_actual (src, in, &t, formal_hash,
938 (macro_strip_at && inquote) ? '@' : '\'',
939 out, 1);
941 else
943 src = sb_skip_white (src + 5, in);
944 while (in->ptr[src] != '\n')
946 const char *name;
947 formal_entry *f = new_formal ();
949 src = get_token (src, in, &f->name);
950 name = sb_terminate (&f->name);
951 if (str_hash_insert (formal_hash, name, f, 0) != NULL)
953 as_bad_where (macro->file, macro->line + macro_line,
954 _("`%s' was already used as parameter "
955 "(or another local) name"), name);
956 del_formal (f);
958 else
960 static int loccnt;
961 char buf[20];
963 f->index = LOCAL_INDEX;
964 f->next = loclist;
965 loclist = f;
967 sprintf (buf, IS_ELF ? ".LL%04x" : "LL%04x", ++loccnt);
968 sb_add_string (&f->actual, buf);
971 src = sb_skip_comma (src, in);
975 else if (in->ptr[src] == '"'
976 || (macro_mri && in->ptr[src] == '\''))
978 inquote = !inquote;
979 sb_add_char (out, in->ptr[src++]);
981 else if (in->ptr[src] == '@' && macro_strip_at)
983 ++src;
984 if (src < in->len
985 && in->ptr[src] == '@')
987 sb_add_char (out, '@');
988 ++src;
991 else if (macro_mri
992 && in->ptr[src] == '='
993 && src + 1 < in->len
994 && in->ptr[src + 1] == '=')
996 formal_entry *ptr;
998 sb_reset (&t);
999 src = get_token (src + 2, in, &t);
1000 ptr = str_hash_find (formal_hash, sb_terminate (&t));
1001 if (ptr == NULL)
1003 /* FIXME: We should really return a warning string here,
1004 but we can't, because the == might be in the MRI
1005 comment field, and, since the nature of the MRI
1006 comment field depends upon the exact instruction
1007 being used, we don't have enough information here to
1008 figure out whether it is or not. Instead, we leave
1009 the == in place, which should cause a syntax error if
1010 it is not in a comment. */
1011 sb_add_char (out, '=');
1012 sb_add_char (out, '=');
1013 sb_add_sb (out, &t);
1015 else
1017 if (ptr->actual.len)
1019 sb_add_string (out, "-1");
1021 else
1023 sb_add_char (out, '0');
1027 else
1029 if (in->ptr[src] == '\n')
1030 ++macro_line;
1031 sb_add_char (out, in->ptr[src++]);
1035 sb_kill (&t);
1037 while (loclist != NULL)
1039 formal_entry *f;
1040 const char *name;
1042 f = loclist->next;
1043 name = sb_terminate (&loclist->name);
1044 str_hash_delete (formal_hash, name);
1045 del_formal (loclist);
1046 loclist = f;
1049 if (!err && (out->len == 0 || out->ptr[out->len - 1] != '\n'))
1050 sb_add_char (out, '\n');
1051 return err;
1054 /* Assign values to the formal parameters of a macro, and expand the
1055 body. */
1057 static const char *
1058 macro_expand (size_t idx, sb *in, macro_entry *m, sb *out)
1060 sb t;
1061 formal_entry *ptr;
1062 formal_entry *f;
1063 int is_keyword = 0;
1064 int narg = 0;
1065 const char *err = NULL;
1067 sb_new (&t);
1069 /* Reset any old value the actuals may have. */
1070 for (f = m->formals; f; f = f->next)
1071 sb_reset (&f->actual);
1072 f = m->formals;
1073 while (f != NULL && f->index < 0)
1074 f = f->next;
1076 if (macro_mri)
1078 /* The macro may be called with an optional qualifier, which may
1079 be referred to in the macro body as \0. */
1080 if (idx < in->len && in->ptr[idx] == '.')
1082 /* The Microtec assembler ignores this if followed by a white space.
1083 (Macro invocation with empty extension) */
1084 idx++;
1085 if ( idx < in->len
1086 && in->ptr[idx] != ' '
1087 && in->ptr[idx] != '\t')
1089 formal_entry *n = new_formal ();
1091 n->index = QUAL_INDEX;
1093 n->next = m->formals;
1094 m->formals = n;
1096 idx = get_any_string (idx, in, &n->actual);
1101 /* Peel off the actuals and store them away in the hash tables' actuals. */
1102 idx = sb_skip_white (idx, in);
1103 while (idx < in->len)
1105 size_t scan;
1107 /* Look and see if it's a positional or keyword arg. */
1108 scan = idx;
1109 while (scan < in->len
1110 && !ISSEP (in->ptr[scan])
1111 && !(macro_mri && in->ptr[scan] == '\'')
1112 && (!macro_alternate && in->ptr[scan] != '='))
1113 scan++;
1114 if (scan < in->len && !macro_alternate && in->ptr[scan] == '=')
1116 is_keyword = 1;
1118 /* It's OK to go from positional to keyword. */
1120 /* This is a keyword arg, fetch the formal name and
1121 then the actual stuff. */
1122 sb_reset (&t);
1123 idx = get_token (idx, in, &t);
1124 if (in->ptr[idx] != '=')
1126 err = _("confusion in formal parameters");
1127 break;
1130 /* Lookup the formal in the macro's list. */
1131 ptr = str_hash_find (m->formal_hash, sb_terminate (&t));
1132 if (!ptr)
1134 as_bad (_("Parameter named `%s' does not exist for macro `%s'"),
1135 t.ptr,
1136 m->name);
1137 sb_reset (&t);
1138 idx = get_any_string (idx + 1, in, &t);
1140 else
1142 /* Insert this value into the right place. */
1143 if (ptr->actual.len)
1145 as_warn (_("Value for parameter `%s' of macro `%s' was already specified"),
1146 ptr->name.ptr,
1147 m->name);
1148 sb_reset (&ptr->actual);
1150 idx = get_any_string (idx + 1, in, &ptr->actual);
1151 if (ptr->actual.len > 0)
1152 ++narg;
1155 else
1157 if (is_keyword)
1159 err = _("can't mix positional and keyword arguments");
1160 break;
1163 if (!f)
1165 formal_entry **pf;
1166 int c;
1168 if (!macro_mri)
1170 err = _("too many positional arguments");
1171 break;
1174 f = new_formal ();
1176 c = -1;
1177 for (pf = &m->formals; *pf != NULL; pf = &(*pf)->next)
1178 if ((*pf)->index >= c)
1179 c = (*pf)->index + 1;
1180 if (c == -1)
1181 c = 0;
1182 *pf = f;
1183 f->index = c;
1186 if (f->type != FORMAL_VARARG)
1187 idx = get_any_string (idx, in, &f->actual);
1188 else
1190 sb_add_buffer (&f->actual, in->ptr + idx, in->len - idx);
1191 idx = in->len;
1193 if (f->actual.len > 0)
1194 ++narg;
1197 f = f->next;
1199 while (f != NULL && f->index < 0);
1202 if (! macro_mri)
1203 idx = sb_skip_comma (idx, in);
1204 else
1206 if (in->ptr[idx] == ',')
1207 ++idx;
1208 if (ISWHITE (in->ptr[idx]))
1209 break;
1213 if (! err)
1215 for (ptr = m->formals; ptr; ptr = ptr->next)
1217 if (ptr->type == FORMAL_REQUIRED && ptr->actual.len == 0)
1218 as_bad (_("Missing value for required parameter `%s' of macro `%s'"),
1219 ptr->name.ptr,
1220 m->name);
1223 if (macro_mri)
1225 char buffer[20];
1227 sb_reset (&t);
1228 sb_add_string (&t, macro_strip_at ? "$NARG" : "NARG");
1229 ptr = str_hash_find (m->formal_hash, sb_terminate (&t));
1230 sprintf (buffer, "%d", narg);
1231 sb_add_string (&ptr->actual, buffer);
1234 err = macro_expand_body (&m->sub, out, m->formals, m->formal_hash, m);
1237 /* Discard any unnamed formal arguments. */
1238 if (macro_mri)
1240 formal_entry **pf;
1242 pf = &m->formals;
1243 while (*pf != NULL)
1245 if ((*pf)->name.len != 0)
1246 pf = &(*pf)->next;
1247 else
1249 f = (*pf)->next;
1250 del_formal (*pf);
1251 *pf = f;
1256 sb_kill (&t);
1257 if (!err)
1258 macro_number++;
1260 return err;
1263 /* Check for a macro. If one is found, put the expansion into
1264 *EXPAND. Return 1 if a macro is found, 0 otherwise. */
1267 check_macro (const char *line, sb *expand,
1268 const char **error, macro_entry **info)
1270 const char *s;
1271 char *copy, *cls;
1272 macro_entry *macro;
1273 sb line_sb;
1275 if (! is_name_beginner (*line)
1276 && (! macro_mri || *line != '.'))
1277 return 0;
1279 s = line + 1;
1280 while (is_part_of_name (*s))
1281 ++s;
1282 if (is_name_ender (*s))
1283 ++s;
1285 copy = xmemdup0 (line, s - line);
1286 for (cls = copy; *cls != '\0'; cls ++)
1287 *cls = TOLOWER (*cls);
1289 macro = str_hash_find (macro_hash, copy);
1290 free (copy);
1292 if (macro == NULL)
1293 return 0;
1295 /* Wrap the line up in an sb. */
1296 sb_new (&line_sb);
1297 while (*s != '\0' && *s != '\n' && *s != '\r')
1298 sb_add_char (&line_sb, *s++);
1300 sb_new (expand);
1301 *error = macro_expand (0, &line_sb, macro, expand);
1303 sb_kill (&line_sb);
1305 /* Export the macro information if requested. */
1306 if (info)
1307 *info = macro;
1309 return 1;
1312 /* Delete a macro. */
1314 void
1315 delete_macro (const char *name)
1317 char *copy;
1318 size_t i, len;
1319 macro_entry *macro;
1321 len = strlen (name);
1322 copy = XNEWVEC (char, len + 1);
1323 for (i = 0; i < len; ++i)
1324 copy[i] = TOLOWER (name[i]);
1325 copy[i] = '\0';
1327 macro = str_hash_find (macro_hash, copy);
1328 if (macro != NULL)
1330 free_macro (macro);
1331 str_hash_delete (macro_hash, copy);
1333 else
1334 as_warn (_("Attempt to purge non-existing macro `%s'"), copy);
1335 free (copy);
1338 /* Handle the MRI IRP and IRPC pseudo-ops. These are handled as a
1339 combined macro definition and execution. This returns NULL on
1340 success, or an error message otherwise. */
1342 const char *
1343 expand_irp (int irpc, size_t idx, sb *in, sb *out, size_t (*get_line) (sb *))
1345 sb sub;
1346 formal_entry f;
1347 struct htab *h;
1348 const char *err = NULL;
1350 idx = sb_skip_white (idx, in);
1352 sb_new (&sub);
1353 if (! buffer_and_nest (NULL, "ENDR", &sub, get_line))
1354 return _("unexpected end of file in irp or irpc");
1356 sb_new (&f.name);
1357 sb_new (&f.def);
1358 sb_new (&f.actual);
1360 idx = get_token (idx, in, &f.name);
1361 if (f.name.len == 0)
1362 return _("missing model parameter");
1364 h = str_htab_create ();
1366 str_hash_insert (h, sb_terminate (&f.name), &f, 0);
1368 f.index = 1;
1369 f.next = NULL;
1370 f.type = FORMAL_OPTIONAL;
1372 sb_reset (out);
1374 idx = sb_skip_comma (idx, in);
1375 if (idx >= in->len)
1377 /* Expand once with a null string. */
1378 err = macro_expand_body (&sub, out, &f, h, 0);
1380 else
1382 bool in_quotes = false;
1384 if (irpc && in->ptr[idx] == '"')
1386 in_quotes = true;
1387 ++idx;
1390 while (idx < in->len)
1392 if (!irpc)
1393 idx = get_any_string (idx, in, &f.actual);
1394 else
1396 if (in->ptr[idx] == '"')
1398 size_t nxt;
1400 if (irpc)
1401 in_quotes = ! in_quotes;
1403 nxt = sb_skip_white (idx + 1, in);
1404 if (nxt >= in->len)
1406 idx = nxt;
1407 break;
1410 sb_reset (&f.actual);
1411 sb_add_char (&f.actual, in->ptr[idx]);
1412 ++idx;
1415 err = macro_expand_body (&sub, out, &f, h, 0);
1416 if (err != NULL)
1417 break;
1418 if (!irpc)
1419 idx = sb_skip_comma (idx, in);
1420 else if (! in_quotes)
1421 idx = sb_skip_white (idx, in);
1425 htab_delete (h);
1426 sb_kill (&f.actual);
1427 sb_kill (&f.def);
1428 sb_kill (&f.name);
1429 sb_kill (&sub);
1431 return err;