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