Adjust test of with_ppl.
[deliverable/binutils-gdb.git] / gas / macro.c
CommitLineData
fea17916 1/* macro.c - macro support for gas
2da5c037 2 Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
818236e5 3 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
252b5132
RH
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
ec2655a6 12 the Free Software Foundation; either version 3, or (at your option)
252b5132
RH
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
4b4da160
NC
22 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
23 02110-1301, USA. */
252b5132 24
89658e52 25#include "as.h"
3882b010 26#include "safe-ctype.h"
252b5132 27#include "sb.h"
252b5132
RH
28#include "macro.h"
29
252b5132 30/* The routines in this file handle macro definition and expansion.
fea17916 31 They are called by gas. */
252b5132 32
252b5132
RH
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
c1d05a60 48struct hash_control *macro_hash;
252b5132
RH
49
50/* Whether any macros have been defined. */
51
52int macro_defined;
53
fea17916 54/* Whether we are in alternate syntax mode. */
252b5132
RH
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
254d758c 68static int (*macro_expr) (const char *, int, sb *, int *);
252b5132
RH
69
70/* Number of macro expansions that have been done. */
71
72static int macro_number;
73
74/* Initialize macro processing. */
75
76void
254d758c 77macro_init (int alternate, int mri, int strip_at,
91d6fa6a 78 int (*exp) (const char *, int, sb *, int *))
252b5132
RH
79{
80 macro_hash = hash_new ();
81 macro_defined = 0;
82 macro_alternate = alternate;
83 macro_mri = mri;
84 macro_strip_at = strip_at;
91d6fa6a 85 macro_expr = exp;
252b5132
RH
86}
87
caa32fe5
NC
88/* Switch in and out of alternate mode on the fly. */
89
90void
2766e5e4 91macro_set_alternate (int alternate)
caa32fe5
NC
92{
93 macro_alternate = alternate;
94}
95
252b5132
RH
96/* Switch in and out of MRI mode on the fly. */
97
98void
254d758c 99macro_mri_mode (int mri)
252b5132
RH
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.
ca3bc58f 107 FROM may be NULL (or will be ignored) if TO is "ENDR".
252b5132
RH
108 Add a new input line to an sb using GET_LINE.
109 Return 1 on success, 0 on unexpected EOF. */
110
111int
254d758c
KH
112buffer_and_nest (const char *from, const char *to, sb *ptr,
113 int (*get_line) (sb *))
252b5132 114{
ca3bc58f 115 int from_len;
252b5132
RH
116 int to_len = strlen (to);
117 int depth = 1;
118 int line_start = ptr->len;
119
120 int more = get_line (ptr);
121
ca3bc58f
JB
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
252b5132
RH
130 while (more)
131 {
0e470c55 132 /* Try to find the first pseudo op on the line. */
252b5132 133 int i = line_start;
f19df8f7 134 bfd_boolean had_colon = FALSE;
252b5132 135
0e470c55
AM
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. */
252b5132 140
0e470c55
AM
141 if (! LABELS_WITHOUT_COLONS)
142 {
143 /* Skip leading whitespace. */
144 while (i < ptr->len && ISWHITE (ptr->ptr[i]))
145 i++;
146 }
252b5132 147
0e470c55
AM
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++;
0e470c55
AM
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] != ':')
5e75c3ab 163 {
f19df8f7
AM
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;
0e470c55
AM
170 i = line_start;
171 break;
5e75c3ab 172 }
0e470c55
AM
173 i++;
174 line_start = i;
f19df8f7 175 had_colon = TRUE;
252b5132 176 }
0e470c55 177
29f8404c 178 /* Skip trailing whitespace. */
252b5132
RH
179 while (i < ptr->len && ISWHITE (ptr->ptr[i]))
180 i++;
181
182 if (i < ptr->len && (ptr->ptr[i] == '.'
ca3bc58f 183 || NO_PSEUDO_DOT
252b5132
RH
184 || macro_mri))
185 {
ca3bc58f 186 if (! flag_m68k_mri && ptr->ptr[i] == '.')
29f8404c 187 i++;
ca3bc58f
JB
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)
29f8404c 199 && (ptr->len == (i + from_len)
5e75c3ab
JB
200 || ! (is_part_of_name (ptr->ptr[i + from_len])
201 || is_name_ender (ptr->ptr[i + from_len]))))
252b5132 202 depth++;
c1eae114 203 if (strncasecmp (ptr->ptr + i, to, to_len) == 0
29f8404c 204 && (ptr->len == (i + to_len)
5e75c3ab
JB
205 || ! (is_part_of_name (ptr->ptr[i + to_len])
206 || is_name_ender (ptr->ptr[i + to_len]))))
252b5132
RH
207 {
208 depth--;
209 if (depth == 0)
210 {
29f8404c 211 /* Reset the string to not include the ending rune. */
252b5132
RH
212 ptr->len = line_start;
213 break;
214 }
215 }
216 }
217
0822d075
NC
218 /* Add the original end-of-line char to the end and keep running. */
219 sb_add_char (ptr, more);
252b5132
RH
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
254d758c 231get_token (int idx, sb *in, sb *name)
252b5132
RH
232{
233 if (idx < in->len
5e75c3ab 234 && is_name_beginner (in->ptr[idx]))
252b5132
RH
235 {
236 sb_add_char (name, in->ptr[idx++]);
237 while (idx < in->len
5e75c3ab
JB
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]))
252b5132
RH
244 {
245 sb_add_char (name, in->ptr[idx++]);
246 }
247 }
29f8404c 248 /* Ignore trailing &. */
252b5132
RH
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
254d758c 257getstring (int idx, sb *in, sb *acc)
252b5132 258{
252b5132 259 while (idx < in->len
29f8404c 260 && (in->ptr[idx] == '"'
252b5132
RH
261 || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
262 || (in->ptr[idx] == '\'' && macro_alternate)))
263 {
2f6178c1 264 if (in->ptr[idx] == '<')
252b5132
RH
265 {
266 int nest = 0;
267 idx++;
0e31b3e1 268 while ((in->ptr[idx] != '>' || nest)
252b5132
RH
269 && idx < in->len)
270 {
271 if (in->ptr[idx] == '!')
272 {
29f8404c 273 idx++;
252b5132
RH
274 sb_add_char (acc, in->ptr[idx++]);
275 }
276 else
277 {
0e31b3e1 278 if (in->ptr[idx] == '>')
252b5132 279 nest--;
0e31b3e1 280 if (in->ptr[idx] == '<')
252b5132
RH
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];
c06ae4f2 290 int escaped = 0;
29f8404c 291
252b5132 292 idx++;
29f8404c 293
252b5132
RH
294 while (idx < in->len)
295 {
29f8404c 296 if (in->ptr[idx - 1] == '\\')
c06ae4f2
UC
297 escaped ^= 1;
298 else
299 escaped = 0;
300
252b5132
RH
301 if (macro_alternate && in->ptr[idx] == '!')
302 {
e972090a 303 idx ++;
29f8404c 304
1994a7c7
NC
305 sb_add_char (acc, in->ptr[idx]);
306
e972090a 307 idx ++;
252b5132 308 }
c06ae4f2
UC
309 else if (escaped && in->ptr[idx] == tchar)
310 {
311 sb_add_char (acc, tchar);
e972090a 312 idx ++;
c06ae4f2 313 }
252b5132
RH
314 else
315 {
316 if (in->ptr[idx] == tchar)
317 {
e972090a 318 idx ++;
29f8404c 319
252b5132
RH
320 if (idx >= in->len || in->ptr[idx] != tchar)
321 break;
322 }
29f8404c 323
252b5132 324 sb_add_char (acc, in->ptr[idx]);
e972090a 325 idx ++;
252b5132
RH
326 }
327 }
328 }
329 }
29f8404c 330
252b5132
RH
331 return idx;
332}
333
334/* Fetch string from the input stream,
335 rules:
336 'Bxyx<whitespace> -> return 'Bxyza
df40eaf9
NC
337 %<expr> -> return string of decimal value of <expr>
338 "string" -> return string
2f6178c1 339 (string) -> return (string-including-whitespaces)
df40eaf9 340 xyx<whitespace> -> return xyz. */
252b5132
RH
341
342static int
be03cc84 343get_any_string (int idx, sb *in, sb *out)
252b5132
RH
344{
345 sb_reset (out);
346 idx = sb_skip_white (idx, in);
347
348 if (idx < in->len)
349 {
9df59bba 350 if (in->len > idx + 2 && in->ptr[idx + 1] == '\'' && ISBASE (in->ptr[idx]))
252b5132
RH
351 {
352 while (!ISSEP (in->ptr[idx]))
353 sb_add_char (out, in->ptr[idx++]);
354 }
be03cc84 355 else if (in->ptr[idx] == '%' && macro_alternate)
252b5132
RH
356 {
357 int val;
358 char buf[20];
df40eaf9 359
29f8404c 360 /* Turns the next expression into a string. */
06f030db 361 /* xgettext: no-c-format */
252b5132
RH
362 idx = (*macro_expr) (_("% operator needs absolute expression"),
363 idx + 1,
364 in,
365 &val);
d1a6c242 366 sprintf (buf, "%d", val);
252b5132
RH
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 {
9f6f925e 373 if (macro_alternate && ! macro_strip_at && in->ptr[idx] != '<')
252b5132 374 {
29f8404c 375 /* Keep the quotes. */
9f6f925e 376 sb_add_char (out, '"');
252b5132 377 idx = getstring (idx, in, out);
9f6f925e 378 sb_add_char (out, '"');
252b5132
RH
379 }
380 else
381 {
382 idx = getstring (idx, in, out);
383 }
384 }
29f8404c 385 else
252b5132 386 {
1e9cc1c2 387 char *br_buf = (char *) xmalloc(1);
0e31b3e1
JB
388 char *in_br = br_buf;
389
390 *in_br = '\0';
29f8404c 391 while (idx < in->len
0e31b3e1
JB
392 && (*in_br
393 || (in->ptr[idx] != ' '
394 && in->ptr[idx] != '\t'))
be03cc84
JB
395 && in->ptr[idx] != ','
396 && (in->ptr[idx] != '<'
397 || (! macro_alternate && ! macro_mri)))
252b5132 398 {
0e31b3e1 399 char tchar = in->ptr[idx];
df40eaf9 400
0e31b3e1
JB
401 switch (tchar)
402 {
403 case '"':
404 case '\'':
252b5132
RH
405 sb_add_char (out, in->ptr[idx++]);
406 while (idx < in->len
407 && in->ptr[idx] != tchar)
29f8404c 408 sb_add_char (out, in->ptr[idx++]);
252b5132 409 if (idx == in->len)
29f8404c 410 return idx;
0e31b3e1
JB
411 break;
412 case '(':
413 case '[':
414 if (in_br > br_buf)
415 --in_br;
416 else
417 {
1e9cc1c2 418 br_buf = (char *) xmalloc(strlen(in_br) + 2);
0e31b3e1
JB
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;
252b5132 433 }
0e31b3e1
JB
434 sb_add_char (out, tchar);
435 ++idx;
252b5132 436 }
0e31b3e1 437 free(br_buf);
252b5132
RH
438 }
439 }
440
441 return idx;
442}
443
6eaeac8a
JB
444/* Allocate a new formal. */
445
446static formal_entry *
447new_formal (void)
448{
449 formal_entry *formal;
450
1e9cc1c2 451 formal = (formal_entry *) xmalloc (sizeof (formal_entry));
6eaeac8a
JB
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
252b5132
RH
472/* Pick up the formal parameters of a macro definition. */
473
474static int
254d758c 475do_formals (macro_entry *macro, int idx, sb *in)
252b5132
RH
476{
477 formal_entry **p = &macro->formals;
02ddf156 478 const char *name;
252b5132 479
057f53c1 480 idx = sb_skip_white (idx, in);
252b5132
RH
481 while (idx < in->len)
482 {
6eaeac8a 483 formal_entry *formal = new_formal ();
057f53c1 484 int cidx;
252b5132 485
252b5132
RH
486 idx = get_token (idx, in, &formal->name);
487 if (formal->name.len == 0)
057f53c1
JB
488 {
489 if (macro->formal_count)
490 --idx;
491 break;
492 }
252b5132 493 idx = sb_skip_white (idx, in);
057f53c1 494 /* This is a formal. */
6eaeac8a
JB
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 }
057f53c1 529 if (idx < in->len && in->ptr[idx] == '=')
252b5132 530 {
057f53c1 531 /* Got a default. */
be03cc84 532 idx = get_any_string (idx + 1, in, &formal->def);
057f53c1 533 idx = sb_skip_white (idx, in);
6eaeac8a
JB
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 }
252b5132
RH
543 }
544
29f8404c 545 /* Add to macro's hash table. */
02ddf156
JB
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);
252b5132 554
057f53c1 555 formal->index = macro->formal_count++;
6eaeac8a
JB
556 *p = formal;
557 p = &formal->next;
558 if (formal->type == FORMAL_VARARG)
559 break;
057f53c1 560 cidx = idx;
252b5132 561 idx = sb_skip_comma (idx, in);
057f53c1
JB
562 if (idx != cidx && idx >= in->len)
563 {
564 idx = cidx;
565 break;
566 }
252b5132
RH
567 }
568
569 if (macro_mri)
570 {
6eaeac8a 571 formal_entry *formal = new_formal ();
252b5132
RH
572
573 /* Add a special NARG formal, which macro_expand will set to the
574 number of arguments. */
252b5132
RH
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
29f8404c 584 /* Add to macro's hash table. */
02ddf156
JB
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);
252b5132
RH
591 hash_jam (macro->formal_hash, name, formal);
592
593 formal->index = NARG_INDEX;
594 *p = formal;
252b5132
RH
595 }
596
597 return idx;
598}
599
f19df8f7
AM
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
252b5132
RH
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 *
254d758c 625define_macro (int idx, sb *in, sb *label,
02ddf156
JB
626 int (*get_line) (sb *),
627 char *file, unsigned int line,
628 const char **namep)
252b5132
RH
629{
630 macro_entry *macro;
631 sb name;
02ddf156 632 const char *error = NULL;
252b5132
RH
633
634 macro = (macro_entry *) xmalloc (sizeof (macro_entry));
635 sb_new (&macro->sub);
636 sb_new (&name);
02ddf156
JB
637 macro->file = file;
638 macro->line = line;
252b5132
RH
639
640 macro->formal_count = 0;
641 macro->formals = 0;
e6ca91be 642 macro->formal_hash = hash_new ();
252b5132
RH
643
644 idx = sb_skip_white (idx, in);
645 if (! buffer_and_nest ("MACRO", "ENDM", &macro->sub, get_line))
02ddf156 646 error = _("unexpected end of file in macro `%s' definition");
252b5132
RH
647 if (label != NULL && label->len != 0)
648 {
649 sb_add_sb (&name, label);
02ddf156 650 macro->name = sb_terminate (&name);
252b5132
RH
651 if (idx < in->len && in->ptr[idx] == '(')
652 {
29f8404c 653 /* It's the label: MACRO (formals,...) sort */
252b5132 654 idx = do_formals (macro, idx + 1, in);
02ddf156
JB
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'");
252b5132
RH
659 }
660 else
661 {
29f8404c 662 /* It's the label: MACRO formals,... sort */
252b5132
RH
663 idx = do_formals (macro, idx, in);
664 }
665 }
666 else
667 {
057f53c1
JB
668 int cidx;
669
252b5132 670 idx = get_token (idx, in, &name);
02ddf156 671 macro->name = sb_terminate (&name);
057f53c1 672 if (name.len == 0)
02ddf156 673 error = _("Missing macro name");
057f53c1
JB
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;
252b5132 680 }
02ddf156
JB
681 if (!error && idx < in->len)
682 error = _("Bad parameter list for macro `%s'");
252b5132 683
29f8404c 684 /* And stick it in the macro hash table. */
252b5132 685 for (idx = 0; idx < name.len; idx++)
3882b010 686 name.ptr[idx] = TOLOWER (name.ptr[idx]);
02ddf156
JB
687 if (hash_find (macro_hash, macro->name))
688 error = _("Macro `%s' was already defined");
689 if (!error)
5a49b8ac 690 error = hash_jam (macro_hash, macro->name, (void *) macro);
252b5132
RH
691
692 if (namep != NULL)
02ddf156
JB
693 *namep = macro->name;
694
695 if (!error)
696 macro_defined = 1;
697 else
698 free_macro (macro);
252b5132 699
02ddf156 700 return error;
252b5132
RH
701}
702
703/* Scan a token, and then skip KIND. */
704
705static int
254d758c 706get_apost_token (int idx, sb *in, sb *name, int kind)
252b5132
RH
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
254d758c
KH
720sub_actual (int start, sb *in, sb *t, struct hash_control *formal_hash,
721 int kind, sb *out, int copyifnotthere)
252b5132
RH
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, '&');
c1ed1235 750 sb_add_sb (out, t);
d1f52f54
AM
751 if (src != start && in->ptr[src - 1] == '&')
752 sb_add_char (out, '&');
252b5132
RH
753 }
754 else if (copyifnotthere)
755 {
756 sb_add_sb (out, t);
757 }
29f8404c 758 else
252b5132
RH
759 {
760 sb_add_char (out, '\\');
761 sb_add_sb (out, t);
762 }
763 return src;
764}
765
766/* Expand the body of a macro. */
767
768static const char *
254d758c 769macro_expand_body (sb *in, sb *out, formal_entry *formals,
02ddf156 770 struct hash_control *formal_hash, const macro_entry *macro)
252b5132
RH
771{
772 sb t;
02ddf156 773 int src = 0, inquote = 0, macro_line = 0;
252b5132 774 formal_entry *loclist = NULL;
02ddf156 775 const char *err = NULL;
252b5132
RH
776
777 sb_new (&t);
778
02ddf156 779 while (src < in->len && !err)
252b5132
RH
780 {
781 if (in->ptr[src] == '&')
782 {
783 sb_reset (&t);
784 if (macro_mri)
785 {
786 if (src + 1 < in->len && in->ptr[src + 1] == '&')
787 src = sub_actual (src + 2, in, &t, formal_hash, '\'', out, 1);
788 else
789 sb_add_char (out, in->ptr[src++]);
790 }
791 else
792 {
d1f52f54
AM
793 /* Permit macro parameter substition delineated with
794 an '&' prefix and optional '&' suffix. */
252b5132
RH
795 src = sub_actual (src + 1, in, &t, formal_hash, '&', out, 0);
796 }
797 }
798 else if (in->ptr[src] == '\\')
799 {
800 src++;
5e75c3ab 801 if (src < in->len && in->ptr[src] == '(')
252b5132 802 {
29f8404c 803 /* Sub in till the next ')' literally. */
252b5132
RH
804 src++;
805 while (src < in->len && in->ptr[src] != ')')
806 {
807 sb_add_char (out, in->ptr[src++]);
808 }
02ddf156 809 if (src < in->len)
252b5132 810 src++;
02ddf156
JB
811 else if (!macro)
812 err = _("missing `)'");
252b5132 813 else
02ddf156 814 as_bad_where (macro->file, macro->line + macro_line, _("missing `)'"));
252b5132 815 }
5e75c3ab 816 else if (src < in->len && in->ptr[src] == '@')
252b5132 817 {
29f8404c 818 /* Sub in the macro invocation number. */
252b5132
RH
819
820 char buffer[10];
821 src++;
a2984248 822 sprintf (buffer, "%d", macro_number);
252b5132
RH
823 sb_add_string (out, buffer);
824 }
5e75c3ab 825 else if (src < in->len && in->ptr[src] == '&')
252b5132
RH
826 {
827 /* This is a preprocessor variable name, we don't do them
29f8404c 828 here. */
252b5132
RH
829 sb_add_char (out, '\\');
830 sb_add_char (out, '&');
831 src++;
832 }
5e75c3ab 833 else if (macro_mri && src < in->len && ISALNUM (in->ptr[src]))
252b5132
RH
834 {
835 int ind;
836 formal_entry *f;
837
3882b010 838 if (ISDIGIT (in->ptr[src]))
252b5132 839 ind = in->ptr[src] - '0';
3882b010 840 else if (ISUPPER (in->ptr[src]))
252b5132
RH
841 ind = in->ptr[src] - 'A' + 10;
842 else
843 ind = in->ptr[src] - 'a' + 10;
844 ++src;
845 for (f = formals; f != NULL; f = f->next)
846 {
847 if (f->index == ind - 1)
848 {
849 if (f->actual.len != 0)
850 sb_add_sb (out, &f->actual);
851 else
852 sb_add_sb (out, &f->def);
853 break;
854 }
855 }
856 }
857 else
858 {
859 sb_reset (&t);
860 src = sub_actual (src, in, &t, formal_hash, '\'', out, 0);
861 }
862 }
863 else if ((macro_alternate || macro_mri)
5e75c3ab 864 && is_name_beginner (in->ptr[src])
252b5132
RH
865 && (! inquote
866 || ! macro_strip_at
867 || (src > 0 && in->ptr[src - 1] == '@')))
868 {
02ddf156 869 if (! macro
252b5132
RH
870 || src + 5 >= in->len
871 || strncasecmp (in->ptr + src, "LOCAL", 5) != 0
aa27de95
NC
872 || ! ISWHITE (in->ptr[src + 5])
873 /* PR 11507: Skip keyword LOCAL if it is found inside a quoted string. */
874 || inquote)
252b5132
RH
875 {
876 sb_reset (&t);
877 src = sub_actual (src, in, &t, formal_hash,
878 (macro_strip_at && inquote) ? '@' : '\'',
879 out, 1);
880 }
881 else
882 {
252b5132 883 src = sb_skip_white (src + 5, in);
fea17916 884 while (in->ptr[src] != '\n')
252b5132 885 {
02ddf156 886 const char *name;
6eaeac8a 887 formal_entry *f = new_formal ();
252b5132 888
252b5132 889 src = get_token (src, in, &f->name);
02ddf156
JB
890 name = sb_terminate (&f->name);
891 if (! hash_find (formal_hash, name))
892 {
893 static int loccnt;
894 char buf[20];
252b5132 895
02ddf156
JB
896 f->index = LOCAL_INDEX;
897 f->next = loclist;
898 loclist = f;
899
900 sprintf (buf, IS_ELF ? ".LL%04x" : "LL%04x", ++loccnt);
901 sb_add_string (&f->actual, buf);
902
903 err = hash_jam (formal_hash, name, f);
904 if (err != NULL)
905 break;
906 }
907 else
908 {
909 as_bad_where (macro->file,
910 macro->line + macro_line,
911 _("`%s' was already used as parameter (or another local) name"),
912 name);
6eaeac8a 913 del_formal (f);
02ddf156 914 }
252b5132
RH
915
916 src = sb_skip_comma (src, in);
917 }
918 }
919 }
252b5132
RH
920 else if (in->ptr[src] == '"'
921 || (macro_mri && in->ptr[src] == '\''))
922 {
923 inquote = !inquote;
924 sb_add_char (out, in->ptr[src++]);
925 }
926 else if (in->ptr[src] == '@' && macro_strip_at)
927 {
928 ++src;
929 if (src < in->len
930 && in->ptr[src] == '@')
931 {
932 sb_add_char (out, '@');
933 ++src;
934 }
935 }
936 else if (macro_mri
937 && in->ptr[src] == '='
938 && src + 1 < in->len
939 && in->ptr[src + 1] == '=')
940 {
941 formal_entry *ptr;
942
943 sb_reset (&t);
944 src = get_token (src + 2, in, &t);
945 ptr = (formal_entry *) hash_find (formal_hash, sb_terminate (&t));
946 if (ptr == NULL)
947 {
948 /* FIXME: We should really return a warning string here,
949 but we can't, because the == might be in the MRI
950 comment field, and, since the nature of the MRI
951 comment field depends upon the exact instruction
952 being used, we don't have enough information here to
953 figure out whether it is or not. Instead, we leave
954 the == in place, which should cause a syntax error if
955 it is not in a comment. */
956 sb_add_char (out, '=');
957 sb_add_char (out, '=');
958 sb_add_sb (out, &t);
959 }
960 else
961 {
962 if (ptr->actual.len)
963 {
964 sb_add_string (out, "-1");
965 }
966 else
967 {
968 sb_add_char (out, '0');
969 }
970 }
971 }
972 else
973 {
02ddf156
JB
974 if (in->ptr[src] == '\n')
975 ++macro_line;
252b5132
RH
976 sb_add_char (out, in->ptr[src++]);
977 }
978 }
979
980 sb_kill (&t);
981
982 while (loclist != NULL)
983 {
984 formal_entry *f;
818236e5 985 const char *name;
252b5132
RH
986
987 f = loclist->next;
818236e5
AM
988 name = sb_terminate (&loclist->name);
989 hash_delete (formal_hash, name, f == NULL);
6eaeac8a 990 del_formal (loclist);
252b5132
RH
991 loclist = f;
992 }
993
02ddf156 994 return err;
252b5132
RH
995}
996
997/* Assign values to the formal parameters of a macro, and expand the
998 body. */
999
1000static const char *
254d758c 1001macro_expand (int idx, sb *in, macro_entry *m, sb *out)
252b5132
RH
1002{
1003 sb t;
1004 formal_entry *ptr;
1005 formal_entry *f;
252b5132
RH
1006 int is_keyword = 0;
1007 int narg = 0;
6eaeac8a 1008 const char *err = NULL;
252b5132
RH
1009
1010 sb_new (&t);
29f8404c
KH
1011
1012 /* Reset any old value the actuals may have. */
252b5132 1013 for (f = m->formals; f; f = f->next)
29f8404c 1014 sb_reset (&f->actual);
252b5132
RH
1015 f = m->formals;
1016 while (f != NULL && f->index < 0)
1017 f = f->next;
1018
1019 if (macro_mri)
1020 {
1021 /* The macro may be called with an optional qualifier, which may
1022 be referred to in the macro body as \0. */
1023 if (idx < in->len && in->ptr[idx] == '.')
d1a6c242
KH
1024 {
1025 /* The Microtec assembler ignores this if followed by a white space.
1026 (Macro invocation with empty extension) */
1027 idx++;
1028 if ( idx < in->len
1029 && in->ptr[idx] != ' '
1030 && in->ptr[idx] != '\t')
1031 {
6eaeac8a 1032 formal_entry *n = new_formal ();
d1a6c242 1033
d1a6c242
KH
1034 n->index = QUAL_INDEX;
1035
1036 n->next = m->formals;
1037 m->formals = n;
1038
be03cc84 1039 idx = get_any_string (idx, in, &n->actual);
d1a6c242
KH
1040 }
1041 }
1042 }
252b5132 1043
29f8404c 1044 /* Peel off the actuals and store them away in the hash tables' actuals. */
252b5132 1045 idx = sb_skip_white (idx, in);
fea17916 1046 while (idx < in->len)
252b5132
RH
1047 {
1048 int scan;
1049
29f8404c 1050 /* Look and see if it's a positional or keyword arg. */
252b5132
RH
1051 scan = idx;
1052 while (scan < in->len
1053 && !ISSEP (in->ptr[scan])
1054 && !(macro_mri && in->ptr[scan] == '\'')
1055 && (!macro_alternate && in->ptr[scan] != '='))
1056 scan++;
1057 if (scan < in->len && !macro_alternate && in->ptr[scan] == '=')
1058 {
1059 is_keyword = 1;
1060
1061 /* It's OK to go from positional to keyword. */
1062
1063 /* This is a keyword arg, fetch the formal name and
29f8404c 1064 then the actual stuff. */
252b5132
RH
1065 sb_reset (&t);
1066 idx = get_token (idx, in, &t);
1067 if (in->ptr[idx] != '=')
6eaeac8a
JB
1068 {
1069 err = _("confusion in formal parameters");
1070 break;
1071 }
252b5132 1072
29f8404c 1073 /* Lookup the formal in the macro's list. */
252b5132
RH
1074 ptr = (formal_entry *) hash_find (m->formal_hash, sb_terminate (&t));
1075 if (!ptr)
c0ba1095
AM
1076 {
1077 as_bad (_("Parameter named `%s' does not exist for macro `%s'"),
1078 t.ptr,
1079 m->name);
1080 sb_reset (&t);
1081 idx = get_any_string (idx + 1, in, &t);
1082 }
252b5132
RH
1083 else
1084 {
29f8404c 1085 /* Insert this value into the right place. */
6eaeac8a
JB
1086 if (ptr->actual.len)
1087 {
1088 as_warn (_("Value for parameter `%s' of macro `%s' was already specified"),
1089 ptr->name.ptr,
1090 m->name);
1091 sb_reset (&ptr->actual);
1092 }
be03cc84 1093 idx = get_any_string (idx + 1, in, &ptr->actual);
252b5132
RH
1094 if (ptr->actual.len > 0)
1095 ++narg;
1096 }
1097 }
1098 else
1099 {
252b5132 1100 if (is_keyword)
6eaeac8a
JB
1101 {
1102 err = _("can't mix positional and keyword arguments");
1103 break;
1104 }
252b5132
RH
1105
1106 if (!f)
1107 {
1108 formal_entry **pf;
1109 int c;
1110
1111 if (!macro_mri)
6eaeac8a
JB
1112 {
1113 err = _("too many positional arguments");
1114 break;
1115 }
252b5132 1116
6eaeac8a 1117 f = new_formal ();
252b5132
RH
1118
1119 c = -1;
1120 for (pf = &m->formals; *pf != NULL; pf = &(*pf)->next)
1121 if ((*pf)->index >= c)
1122 c = (*pf)->index + 1;
1123 if (c == -1)
1124 c = 0;
1125 *pf = f;
1126 f->index = c;
1127 }
1128
6eaeac8a 1129 if (f->type != FORMAL_VARARG)
be03cc84 1130 idx = get_any_string (idx, in, &f->actual);
6eaeac8a
JB
1131 else
1132 {
1133 sb_add_buffer (&f->actual, in->ptr + idx, in->len - idx);
1134 idx = in->len;
1135 }
252b5132
RH
1136 if (f->actual.len > 0)
1137 ++narg;
1138 do
1139 {
1140 f = f->next;
1141 }
1142 while (f != NULL && f->index < 0);
1143 }
1144
1145 if (! macro_mri)
1146 idx = sb_skip_comma (idx, in);
1147 else
1148 {
1149 if (in->ptr[idx] == ',')
1150 ++idx;
1151 if (ISWHITE (in->ptr[idx]))
1152 break;
1153 }
1154 }
1155
6eaeac8a 1156 if (! err)
252b5132 1157 {
6eaeac8a
JB
1158 for (ptr = m->formals; ptr; ptr = ptr->next)
1159 {
1160 if (ptr->type == FORMAL_REQUIRED && ptr->actual.len == 0)
1161 as_bad (_("Missing value for required parameter `%s' of macro `%s'"),
1162 ptr->name.ptr,
1163 m->name);
1164 }
252b5132 1165
6eaeac8a
JB
1166 if (macro_mri)
1167 {
1168 char buffer[20];
1169
1170 sb_reset (&t);
1171 sb_add_string (&t, macro_strip_at ? "$NARG" : "NARG");
1172 ptr = (formal_entry *) hash_find (m->formal_hash, sb_terminate (&t));
1173 sprintf (buffer, "%d", narg);
1174 sb_add_string (&ptr->actual, buffer);
1175 }
1176
1177 err = macro_expand_body (&m->sub, out, m->formals, m->formal_hash, m);
1178 }
252b5132
RH
1179
1180 /* Discard any unnamed formal arguments. */
1181 if (macro_mri)
1182 {
1183 formal_entry **pf;
1184
1185 pf = &m->formals;
1186 while (*pf != NULL)
1187 {
1188 if ((*pf)->name.len != 0)
1189 pf = &(*pf)->next;
1190 else
1191 {
252b5132 1192 f = (*pf)->next;
6eaeac8a 1193 del_formal (*pf);
252b5132
RH
1194 *pf = f;
1195 }
1196 }
1197 }
1198
1199 sb_kill (&t);
02ddf156
JB
1200 if (!err)
1201 macro_number++;
252b5132 1202
02ddf156 1203 return err;
252b5132
RH
1204}
1205
1206/* Check for a macro. If one is found, put the expansion into
fea17916 1207 *EXPAND. Return 1 if a macro is found, 0 otherwise. */
252b5132
RH
1208
1209int
254d758c
KH
1210check_macro (const char *line, sb *expand,
1211 const char **error, macro_entry **info)
252b5132
RH
1212{
1213 const char *s;
91d6fa6a 1214 char *copy, *cls;
252b5132
RH
1215 macro_entry *macro;
1216 sb line_sb;
1217
5e75c3ab 1218 if (! is_name_beginner (*line)
252b5132
RH
1219 && (! macro_mri || *line != '.'))
1220 return 0;
1221
1222 s = line + 1;
5e75c3ab
JB
1223 while (is_part_of_name (*s))
1224 ++s;
1225 if (is_name_ender (*s))
252b5132
RH
1226 ++s;
1227
1228 copy = (char *) alloca (s - line + 1);
1229 memcpy (copy, line, s - line);
1230 copy[s - line] = '\0';
91d6fa6a
NC
1231 for (cls = copy; *cls != '\0'; cls ++)
1232 *cls = TOLOWER (*cls);
252b5132
RH
1233
1234 macro = (macro_entry *) hash_find (macro_hash, copy);
1235
1236 if (macro == NULL)
1237 return 0;
1238
1239 /* Wrap the line up in an sb. */
1240 sb_new (&line_sb);
1241 while (*s != '\0' && *s != '\n' && *s != '\r')
1242 sb_add_char (&line_sb, *s++);
1243
1244 sb_new (expand);
fea17916 1245 *error = macro_expand (0, &line_sb, macro, expand);
252b5132
RH
1246
1247 sb_kill (&line_sb);
1248
29f8404c 1249 /* Export the macro information if requested. */
9f10757c
TW
1250 if (info)
1251 *info = macro;
1252
252b5132
RH
1253 return 1;
1254}
1255
1256/* Delete a macro. */
1257
1258void
254d758c 1259delete_macro (const char *name)
252b5132 1260{
e6ca91be
JB
1261 char *copy;
1262 size_t i, len;
1263 macro_entry *macro;
1264
1265 len = strlen (name);
1266 copy = (char *) alloca (len + 1);
1267 for (i = 0; i < len; ++i)
1268 copy[i] = TOLOWER (name[i]);
1269 copy[i] = '\0';
1270
818236e5
AM
1271 /* We can only ask hash_delete to free memory if we are deleting
1272 macros in reverse order to their definition.
1273 So just clear out the entry. */
1e9cc1c2 1274 if ((macro = (macro_entry *) hash_find (macro_hash, copy)) != NULL)
e6ca91be
JB
1275 {
1276 hash_jam (macro_hash, copy, NULL);
1277 free_macro (macro);
1278 }
1279 else
1280 as_warn (_("Attempt to purge non-existant macro `%s'"), copy);
252b5132
RH
1281}
1282
1283/* Handle the MRI IRP and IRPC pseudo-ops. These are handled as a
1284 combined macro definition and execution. This returns NULL on
1285 success, or an error message otherwise. */
1286
1287const char *
254d758c 1288expand_irp (int irpc, int idx, sb *in, sb *out, int (*get_line) (sb *))
252b5132 1289{
252b5132
RH
1290 sb sub;
1291 formal_entry f;
1292 struct hash_control *h;
1293 const char *err;
1294
252b5132
RH
1295 idx = sb_skip_white (idx, in);
1296
1297 sb_new (&sub);
ca3bc58f 1298 if (! buffer_and_nest (NULL, "ENDR", &sub, get_line))
252b5132 1299 return _("unexpected end of file in irp or irpc");
29f8404c 1300
252b5132
RH
1301 sb_new (&f.name);
1302 sb_new (&f.def);
1303 sb_new (&f.actual);
1304
1305 idx = get_token (idx, in, &f.name);
1306 if (f.name.len == 0)
1307 return _("missing model parameter");
1308
1309 h = hash_new ();
1310 err = hash_jam (h, sb_terminate (&f.name), &f);
1311 if (err != NULL)
1312 return err;
1313
1314 f.index = 1;
1315 f.next = NULL;
6eaeac8a 1316 f.type = FORMAL_OPTIONAL;
252b5132
RH
1317
1318 sb_reset (out);
1319
1320 idx = sb_skip_comma (idx, in);
fea17916 1321 if (idx >= in->len)
252b5132
RH
1322 {
1323 /* Expand once with a null string. */
fea17916 1324 err = macro_expand_body (&sub, out, &f, h, 0);
252b5132
RH
1325 }
1326 else
1327 {
465e5617
NC
1328 bfd_boolean in_quotes = FALSE;
1329
252b5132 1330 if (irpc && in->ptr[idx] == '"')
465e5617
NC
1331 {
1332 in_quotes = TRUE;
1333 ++idx;
1334 }
1335
fea17916 1336 while (idx < in->len)
252b5132
RH
1337 {
1338 if (!irpc)
be03cc84 1339 idx = get_any_string (idx, in, &f.actual);
252b5132
RH
1340 else
1341 {
1342 if (in->ptr[idx] == '"')
1343 {
1344 int nxt;
1345
465e5617
NC
1346 if (irpc)
1347 in_quotes = ! in_quotes;
1348
252b5132 1349 nxt = sb_skip_white (idx + 1, in);
fea17916 1350 if (nxt >= in->len)
252b5132
RH
1351 {
1352 idx = nxt;
1353 break;
1354 }
1355 }
1356 sb_reset (&f.actual);
1357 sb_add_char (&f.actual, in->ptr[idx]);
1358 ++idx;
1359 }
465e5617 1360
fea17916 1361 err = macro_expand_body (&sub, out, &f, h, 0);
252b5132 1362 if (err != NULL)
02ddf156 1363 break;
252b5132
RH
1364 if (!irpc)
1365 idx = sb_skip_comma (idx, in);
465e5617 1366 else if (! in_quotes)
252b5132
RH
1367 idx = sb_skip_white (idx, in);
1368 }
1369 }
1370
1371 hash_die (h);
6eaeac8a
JB
1372 sb_kill (&f.actual);
1373 sb_kill (&f.def);
1374 sb_kill (&f.name);
252b5132
RH
1375 sb_kill (&sub);
1376
02ddf156 1377 return err;
252b5132 1378}
This page took 0.544579 seconds and 4 git commands to generate.