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