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