c2a47684b15d74d1d807a6b167d6535652f20306
[binutils-gdb.git] / gas / macro.c
1 /* macro.c - macro support for gas
2 Copyright (C) 1994-2022 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 htab_t 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 = 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;
85 }
86
87 void
88 macro_end (void)
89 {
90 htab_delete (macro_hash);
91 }
92
93 /* Switch in and out of alternate mode on the fly. */
94
95 void
96 macro_set_alternate (int alternate)
97 {
98 macro_alternate = alternate;
99 }
100
101 /* Switch in and out of MRI mode on the fly. */
102
103 void
104 macro_mri_mode (int mri)
105 {
106 macro_mri = mri;
107 }
108
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. */
115
116 int
117 buffer_and_nest (const char *from, const char *to, sb *ptr,
118 size_t (*get_line) (sb *))
119 {
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);
125
126 if (to_len == 4 && strcasecmp (to, "ENDR") == 0)
127 {
128 from = NULL;
129 from_len = 0;
130 }
131 else
132 from_len = strlen (from);
133
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)
139 {
140 unsigned int line;
141 char *linefile;
142
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);
150 }
151
152 while (more)
153 {
154 /* Try to find the first pseudo op on the line. */
155 size_t i = line_start;
156 bool had_colon = false;
157
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. */
162
163 if (! LABELS_WITHOUT_COLONS)
164 {
165 /* Skip leading whitespace. */
166 while (i < ptr->len && ISWHITE (ptr->ptr[i]))
167 i++;
168 }
169
170 for (;;)
171 {
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] != ':')
185 {
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;
194 }
195 i++;
196 line_start = i;
197 had_colon = true;
198 }
199
200 /* Skip trailing whitespace. */
201 while (i < ptr->len && ISWHITE (ptr->ptr[i]))
202 i++;
203
204 if (i < ptr->len && (ptr->ptr[i] == '.'
205 || NO_PSEUDO_DOT
206 || macro_mri))
207 {
208 if (! flag_m68k_mri && ptr->ptr[i] == '.')
209 i++;
210 size_t len = ptr->len - i;
211 if (from == NULL)
212 {
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;
227 }
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]))))
241 {
242 depth--;
243 if (depth == 0)
244 {
245 /* Reset the string to not include the ending rune. */
246 ptr->len = line_start;
247 break;
248 }
249 }
250
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)
262 {
263 char saved_eol_char = ptr->ptr[ptr->len];
264
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;
271 }
272 }
273
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);
278 }
279
280 /* Return 1 on success, 0 on unexpected EOF. */
281 return depth == 0;
282 }
283
284 /* Pick up a token. */
285
286 static size_t
287 get_token (size_t idx, sb *in, sb *name)
288 {
289 if (idx < in->len
290 && is_name_beginner (in->ptr[idx]))
291 {
292 sb_add_char (name, in->ptr[idx++]);
293 while (idx < in->len
294 && is_part_of_name (in->ptr[idx]))
295 {
296 sb_add_char (name, in->ptr[idx++]);
297 }
298 if (idx < in->len
299 && is_name_ender (in->ptr[idx]))
300 {
301 sb_add_char (name, in->ptr[idx++]);
302 }
303 }
304 /* Ignore trailing &. */
305 if (macro_alternate && idx < in->len && in->ptr[idx] == '&')
306 idx++;
307 return idx;
308 }
309
310 /* Pick up a string. */
311
312 static size_t
313 getstring (size_t idx, sb *in, sb *acc)
314 {
315 while (idx < in->len
316 && (in->ptr[idx] == '"'
317 || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
318 || (in->ptr[idx] == '\'' && macro_alternate)))
319 {
320 if (in->ptr[idx] == '<')
321 {
322 int nest = 0;
323 idx++;
324 while (idx < in->len
325 && (in->ptr[idx] != '>' || nest))
326 {
327 if (in->ptr[idx] == '!')
328 {
329 idx++;
330 sb_add_char (acc, in->ptr[idx++]);
331 }
332 else
333 {
334 if (in->ptr[idx] == '>')
335 nest--;
336 if (in->ptr[idx] == '<')
337 nest++;
338 sb_add_char (acc, in->ptr[idx++]);
339 }
340 }
341 idx++;
342 }
343 else if (in->ptr[idx] == '"' || in->ptr[idx] == '\'')
344 {
345 char tchar = in->ptr[idx];
346 int escaped = 0;
347
348 idx++;
349
350 while (idx < in->len)
351 {
352 if (in->ptr[idx - 1] == '\\')
353 escaped ^= 1;
354 else
355 escaped = 0;
356
357 if (macro_alternate && in->ptr[idx] == '!')
358 {
359 idx ++;
360
361 sb_add_char (acc, in->ptr[idx]);
362
363 idx ++;
364 }
365 else if (escaped && in->ptr[idx] == tchar)
366 {
367 sb_add_char (acc, tchar);
368 idx ++;
369 }
370 else
371 {
372 if (in->ptr[idx] == tchar)
373 {
374 idx ++;
375
376 if (idx >= in->len || in->ptr[idx] != tchar)
377 break;
378 }
379
380 sb_add_char (acc, in->ptr[idx]);
381 idx ++;
382 }
383 }
384 }
385 }
386
387 return idx;
388 }
389
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. */
397
398 static size_t
399 get_any_string (size_t idx, sb *in, sb *out)
400 {
401 sb_reset (out);
402 idx = sb_skip_white (idx, in);
403
404 if (idx < in->len)
405 {
406 if (in->len > idx + 2 && in->ptr[idx + 1] == '\'' && ISBASE (in->ptr[idx]))
407 {
408 while (idx < in->len && !ISSEP (in->ptr[idx]))
409 sb_add_char (out, in->ptr[idx++]);
410 }
411 else if (in->ptr[idx] == '%' && macro_alternate)
412 {
413 offsetT val;
414 char buf[64];
415
416 /* Turns the next expression into a string. */
417 /* xgettext: no-c-format */
418 idx = (*macro_expr) (_("% operator needs absolute expression"),
419 idx + 1,
420 in,
421 &val);
422 sprintf (buf, "%" PRId64, (int64_t) val);
423 sb_add_string (out, buf);
424 }
425 else if (in->ptr[idx] == '"'
426 || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
427 || (macro_alternate && in->ptr[idx] == '\''))
428 {
429 if (macro_alternate && ! macro_strip_at && in->ptr[idx] != '<')
430 {
431 /* Keep the quotes. */
432 sb_add_char (out, '"');
433 idx = getstring (idx, in, out);
434 sb_add_char (out, '"');
435 }
436 else
437 {
438 idx = getstring (idx, in, out);
439 }
440 }
441 else
442 {
443 char *br_buf = XNEWVEC (char, 1);
444 char *in_br = br_buf;
445
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)))
454 {
455 char tchar = in->ptr[idx];
456
457 switch (tchar)
458 {
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)
466 {
467 free (br_buf);
468 return idx;
469 }
470 break;
471 case '(':
472 case '[':
473 if (in_br > br_buf)
474 --in_br;
475 else
476 {
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;
481 }
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;
492 }
493 sb_add_char (out, tchar);
494 ++idx;
495 }
496 free (br_buf);
497 }
498 }
499
500 return idx;
501 }
502
503 /* Allocate a new formal. */
504
505 static formal_entry *
506 new_formal (void)
507 {
508 formal_entry *formal;
509
510 formal = XNEW (formal_entry);
511
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;
518 }
519
520 /* Free a formal. */
521
522 static void
523 del_formal (formal_entry *formal)
524 {
525 sb_kill (&formal->actual);
526 sb_kill (&formal->def);
527 sb_kill (&formal->name);
528 free (formal);
529 }
530
531 /* Pick up the formal parameters of a macro definition. */
532
533 static size_t
534 do_formals (macro_entry *macro, size_t idx, sb *in)
535 {
536 formal_entry **p = &macro->formals;
537 const char *name;
538
539 idx = sb_skip_white (idx, in);
540 while (idx < in->len)
541 {
542 formal_entry *formal = new_formal ();
543 size_t cidx;
544
545 idx = get_token (idx, in, &formal->name);
546 if (formal->name.len == 0)
547 {
548 if (macro->formal_count)
549 --idx;
550 del_formal (formal); /* 'formal' goes out of scope. */
551 break;
552 }
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])))
562 {
563 /* Got a qualifier. */
564 sb qual;
565
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);
588 }
589 if (idx < in->len && in->ptr[idx] == '=')
590 {
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)
595 {
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);
602 }
603 }
604
605 /* Add to macro's hash table. */
606 if (str_hash_insert (macro->formal_hash, name, formal, 0) != NULL)
607 {
608 as_bad_where (macro->file, macro->line,
609 _("A parameter named `%s' "
610 "already exists for macro `%s'"),
611 name, macro->name);
612 }
613
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)
622 {
623 idx = cidx;
624 break;
625 }
626 }
627
628 if (macro_mri)
629 {
630 formal_entry *formal = new_formal ();
631
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";
640
641 sb_add_string (&formal->name, name);
642
643 /* Add to macro's hash table. */
644 if (str_hash_insert (macro->formal_hash, name, formal, 0) != NULL)
645 {
646 as_bad_where (macro->file, macro->line,
647 _("Reserved word `%s' used as parameter in macro `%s'"),
648 name, macro->name);
649 }
650
651 formal->index = NARG_INDEX;
652 *p = formal;
653 }
654
655 return idx;
656 }
657
658 /* Free the memory allocated to a macro. */
659
660 static void
661 free_macro (macro_entry *macro)
662 {
663 formal_entry *formal;
664
665 for (formal = macro->formals; formal; )
666 {
667 formal_entry *f;
668
669 f = formal;
670 formal = formal->next;
671 del_formal (f);
672 }
673 htab_delete (macro->formal_hash);
674 sb_kill (&macro->sub);
675 free (macro);
676 }
677
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. */
681
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)
687 {
688 macro_entry *macro;
689 sb name;
690 const char *error = NULL;
691
692 macro = XNEW (macro_entry);
693 sb_new (&macro->sub);
694 sb_new (&name);
695 macro->file = file;
696 macro->line = line;
697
698 macro->formal_count = 0;
699 macro->formals = 0;
700 macro->formal_hash = str_htab_create ();
701
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)
706 {
707 sb_add_sb (&name, label);
708 macro->name = sb_terminate (&name);
709 if (idx < in->len && in->ptr[idx] == '(')
710 {
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'");
717 }
718 else
719 {
720 /* It's the label: MACRO formals,... sort */
721 idx = do_formals (macro, idx, in);
722 }
723 }
724 else
725 {
726 size_t cidx;
727
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;
738 }
739 if (!error && idx < in->len)
740 error = _("Bad parameter list for macro `%s'");
741
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)
746 {
747 if (str_hash_insert (macro_hash, macro->name, macro, 0) != NULL)
748 error = _("Macro `%s' was already defined");
749 }
750
751 if (namep != NULL)
752 *namep = macro->name;
753
754 if (!error)
755 macro_defined = 1;
756 else
757 free_macro (macro);
758
759 return error;
760 }
761
762 /* Scan a token, and then skip KIND. */
763
764 static size_t
765 get_apost_token (size_t idx, sb *in, sb *name, int kind)
766 {
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;
774 }
775
776 /* Substitute the actual value for a formal parameter. */
777
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)
781 {
782 size_t src;
783 formal_entry *ptr;
784
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)
795 {
796 if (ptr->actual.len)
797 {
798 sb_add_sb (out, &ptr->actual);
799 }
800 else
801 {
802 sb_add_sb (out, &ptr->def);
803 }
804 }
805 else if (kind == '&')
806 {
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, '&');
812 }
813 else if (copyifnotthere)
814 {
815 sb_add_sb (out, t);
816 }
817 else
818 {
819 sb_add_char (out, '\\');
820 sb_add_sb (out, t);
821 }
822 return src;
823 }
824
825 /* Expand the body of a macro. */
826
827 static const char *
828 macro_expand_body (sb *in, sb *out, formal_entry *formals,
829 struct htab *formal_hash, const macro_entry *macro)
830 {
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;
836
837 sb_new (&t);
838
839 while (src < in->len && !err)
840 {
841 if (in->ptr[src] == '&')
842 {
843 sb_reset (&t);
844 if (macro_mri)
845 {
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++]);
850 }
851 else
852 {
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);
856 }
857 }
858 else if (in->ptr[src] == '\\')
859 {
860 src++;
861 if (src < in->len && in->ptr[src] == '(')
862 {
863 /* Sub in till the next ')' literally. */
864 src++;
865 while (src < in->len && in->ptr[src] != ')')
866 {
867 sb_add_char (out, in->ptr[src++]);
868 }
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 `)'"));
875 }
876 else if (src < in->len && in->ptr[src] == '@')
877 {
878 /* Sub in the macro invocation number. */
879
880 char buffer[12];
881 src++;
882 sprintf (buffer, "%d", macro_number);
883 sb_add_string (out, buffer);
884 }
885 else if (src < in->len && in->ptr[src] == '&')
886 {
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++;
892 }
893 else if (macro_mri && src < in->len && ISALNUM (in->ptr[src]))
894 {
895 int ind;
896 formal_entry *f;
897
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)
906 {
907 if (f->index == ind - 1)
908 {
909 if (f->actual.len != 0)
910 sb_add_sb (out, &f->actual);
911 else
912 sb_add_sb (out, &f->def);
913 break;
914 }
915 }
916 }
917 else
918 {
919 sb_reset (&t);
920 src = sub_actual (src, in, &t, formal_hash, '\'', out, 0);
921 }
922 }
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] == '@')))
928 {
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)
935 {
936 sb_reset (&t);
937 src = sub_actual (src, in, &t, formal_hash,
938 (macro_strip_at && inquote) ? '@' : '\'',
939 out, 1);
940 }
941 else
942 {
943 src = sb_skip_white (src + 5, in);
944 while (in->ptr[src] != '\n')
945 {
946 const char *name;
947 formal_entry *f = new_formal ();
948
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)
952 {
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);
957 }
958 else
959 {
960 static int loccnt;
961 char buf[20];
962
963 f->index = LOCAL_INDEX;
964 f->next = loclist;
965 loclist = f;
966
967 sprintf (buf, IS_ELF ? ".LL%04x" : "LL%04x", ++loccnt);
968 sb_add_string (&f->actual, buf);
969 }
970
971 src = sb_skip_comma (src, in);
972 }
973 }
974 }
975 else if (in->ptr[src] == '"'
976 || (macro_mri && in->ptr[src] == '\''))
977 {
978 inquote = !inquote;
979 sb_add_char (out, in->ptr[src++]);
980 }
981 else if (in->ptr[src] == '@' && macro_strip_at)
982 {
983 ++src;
984 if (src < in->len
985 && in->ptr[src] == '@')
986 {
987 sb_add_char (out, '@');
988 ++src;
989 }
990 }
991 else if (macro_mri
992 && in->ptr[src] == '='
993 && src + 1 < in->len
994 && in->ptr[src + 1] == '=')
995 {
996 formal_entry *ptr;
997
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)
1002 {
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);
1014 }
1015 else
1016 {
1017 if (ptr->actual.len)
1018 {
1019 sb_add_string (out, "-1");
1020 }
1021 else
1022 {
1023 sb_add_char (out, '0');
1024 }
1025 }
1026 }
1027 else
1028 {
1029 if (in->ptr[src] == '\n')
1030 ++macro_line;
1031 sb_add_char (out, in->ptr[src++]);
1032 }
1033 }
1034
1035 sb_kill (&t);
1036
1037 while (loclist != NULL)
1038 {
1039 formal_entry *f;
1040 const char *name;
1041
1042 f = loclist->next;
1043 name = sb_terminate (&loclist->name);
1044 str_hash_delete (formal_hash, name);
1045 del_formal (loclist);
1046 loclist = f;
1047 }
1048
1049 if (!err && (out->len == 0 || out->ptr[out->len - 1] != '\n'))
1050 sb_add_char (out, '\n');
1051 return err;
1052 }
1053
1054 /* Assign values to the formal parameters of a macro, and expand the
1055 body. */
1056
1057 static const char *
1058 macro_expand (size_t idx, sb *in, macro_entry *m, sb *out)
1059 {
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;
1066
1067 sb_new (&t);
1068
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;
1075
1076 if (macro_mri)
1077 {
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] == '.')
1081 {
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')
1088 {
1089 formal_entry *n = new_formal ();
1090
1091 n->index = QUAL_INDEX;
1092
1093 n->next = m->formals;
1094 m->formals = n;
1095
1096 idx = get_any_string (idx, in, &n->actual);
1097 }
1098 }
1099 }
1100
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)
1104 {
1105 size_t scan;
1106
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] == '=')
1115 {
1116 is_keyword = 1;
1117
1118 /* It's OK to go from positional to keyword. */
1119
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] != '=')
1125 {
1126 err = _("confusion in formal parameters");
1127 break;
1128 }
1129
1130 /* Lookup the formal in the macro's list. */
1131 ptr = str_hash_find (m->formal_hash, sb_terminate (&t));
1132 if (!ptr)
1133 {
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);
1139 }
1140 else
1141 {
1142 /* Insert this value into the right place. */
1143 if (ptr->actual.len)
1144 {
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);
1149 }
1150 idx = get_any_string (idx + 1, in, &ptr->actual);
1151 if (ptr->actual.len > 0)
1152 ++narg;
1153 }
1154 }
1155 else
1156 {
1157 if (is_keyword)
1158 {
1159 err = _("can't mix positional and keyword arguments");
1160 break;
1161 }
1162
1163 if (!f)
1164 {
1165 formal_entry **pf;
1166 int c;
1167
1168 if (!macro_mri)
1169 {
1170 err = _("too many positional arguments");
1171 break;
1172 }
1173
1174 f = new_formal ();
1175
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;
1184 }
1185
1186 if (f->type != FORMAL_VARARG)
1187 idx = get_any_string (idx, in, &f->actual);
1188 else
1189 {
1190 sb_add_buffer (&f->actual, in->ptr + idx, in->len - idx);
1191 idx = in->len;
1192 }
1193 if (f->actual.len > 0)
1194 ++narg;
1195 do
1196 {
1197 f = f->next;
1198 }
1199 while (f != NULL && f->index < 0);
1200 }
1201
1202 if (! macro_mri)
1203 idx = sb_skip_comma (idx, in);
1204 else
1205 {
1206 if (in->ptr[idx] == ',')
1207 ++idx;
1208 if (ISWHITE (in->ptr[idx]))
1209 break;
1210 }
1211 }
1212
1213 if (! err)
1214 {
1215 for (ptr = m->formals; ptr; ptr = ptr->next)
1216 {
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);
1221 }
1222
1223 if (macro_mri)
1224 {
1225 char buffer[20];
1226
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);
1232 }
1233
1234 err = macro_expand_body (&m->sub, out, m->formals, m->formal_hash, m);
1235 }
1236
1237 /* Discard any unnamed formal arguments. */
1238 if (macro_mri)
1239 {
1240 formal_entry **pf;
1241
1242 pf = &m->formals;
1243 while (*pf != NULL)
1244 {
1245 if ((*pf)->name.len != 0)
1246 pf = &(*pf)->next;
1247 else
1248 {
1249 f = (*pf)->next;
1250 del_formal (*pf);
1251 *pf = f;
1252 }
1253 }
1254 }
1255
1256 sb_kill (&t);
1257 if (!err)
1258 macro_number++;
1259
1260 return err;
1261 }
1262
1263 /* Check for a macro. If one is found, put the expansion into
1264 *EXPAND. Return 1 if a macro is found, 0 otherwise. */
1265
1266 int
1267 check_macro (const char *line, sb *expand,
1268 const char **error, macro_entry **info)
1269 {
1270 const char *s;
1271 char *copy, *cls;
1272 macro_entry *macro;
1273 sb line_sb;
1274
1275 if (! is_name_beginner (*line)
1276 && (! macro_mri || *line != '.'))
1277 return 0;
1278
1279 s = line + 1;
1280 while (is_part_of_name (*s))
1281 ++s;
1282 if (is_name_ender (*s))
1283 ++s;
1284
1285 copy = xmemdup0 (line, s - line);
1286 for (cls = copy; *cls != '\0'; cls ++)
1287 *cls = TOLOWER (*cls);
1288
1289 macro = str_hash_find (macro_hash, copy);
1290 free (copy);
1291
1292 if (macro == NULL)
1293 return 0;
1294
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++);
1299
1300 sb_new (expand);
1301 *error = macro_expand (0, &line_sb, macro, expand);
1302
1303 sb_kill (&line_sb);
1304
1305 /* Export the macro information if requested. */
1306 if (info)
1307 *info = macro;
1308
1309 return 1;
1310 }
1311
1312 /* Delete a macro. */
1313
1314 void
1315 delete_macro (const char *name)
1316 {
1317 char *copy;
1318 size_t i, len;
1319 macro_entry *macro;
1320
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';
1326
1327 macro = str_hash_find (macro_hash, copy);
1328 if (macro != NULL)
1329 {
1330 free_macro (macro);
1331 str_hash_delete (macro_hash, copy);
1332 }
1333 else
1334 as_warn (_("Attempt to purge non-existing macro `%s'"), copy);
1335 free (copy);
1336 }
1337
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. */
1341
1342 const char *
1343 expand_irp (int irpc, size_t idx, sb *in, sb *out, size_t (*get_line) (sb *))
1344 {
1345 sb sub;
1346 formal_entry f;
1347 struct htab *h;
1348 const char *err = NULL;
1349
1350 idx = sb_skip_white (idx, in);
1351
1352 sb_new (&sub);
1353 if (! buffer_and_nest (NULL, "ENDR", &sub, get_line))
1354 return _("unexpected end of file in irp or irpc");
1355
1356 sb_new (&f.name);
1357 sb_new (&f.def);
1358 sb_new (&f.actual);
1359
1360 idx = get_token (idx, in, &f.name);
1361 if (f.name.len == 0)
1362 return _("missing model parameter");
1363
1364 h = str_htab_create ();
1365
1366 str_hash_insert (h, sb_terminate (&f.name), &f, 0);
1367
1368 f.index = 1;
1369 f.next = NULL;
1370 f.type = FORMAL_OPTIONAL;
1371
1372 sb_reset (out);
1373
1374 idx = sb_skip_comma (idx, in);
1375 if (idx >= in->len)
1376 {
1377 /* Expand once with a null string. */
1378 err = macro_expand_body (&sub, out, &f, h, 0);
1379 }
1380 else
1381 {
1382 bool in_quotes = false;
1383
1384 if (irpc && in->ptr[idx] == '"')
1385 {
1386 in_quotes = true;
1387 ++idx;
1388 }
1389
1390 while (idx < in->len)
1391 {
1392 if (!irpc)
1393 idx = get_any_string (idx, in, &f.actual);
1394 else
1395 {
1396 if (in->ptr[idx] == '"')
1397 {
1398 size_t nxt;
1399
1400 if (irpc)
1401 in_quotes = ! in_quotes;
1402
1403 nxt = sb_skip_white (idx + 1, in);
1404 if (nxt >= in->len)
1405 {
1406 idx = nxt;
1407 break;
1408 }
1409 }
1410 sb_reset (&f.actual);
1411 sb_add_char (&f.actual, in->ptr[idx]);
1412 ++idx;
1413 }
1414
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);
1422 }
1423 }
1424
1425 htab_delete (h);
1426 sb_kill (&f.actual);
1427 sb_kill (&f.def);
1428 sb_kill (&f.name);
1429 sb_kill (&sub);
1430
1431 return err;
1432 }