1 /* expr.c -operands, expressions- 2 Copyright (C) 1987-2025 Free Software Foundation, Inc. 3 4 This file is part of GAS, the GNU Assembler. 5 6 GAS is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3, or (at your option) 9 any later version. 10 11 GAS is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with GAS; see the file COPYING. If not, write to the Free 18 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 19 02110-1301, USA. */ 20 21 /* This is really a branch office of as-read.c. I split it out to clearly 22 distinguish the world of expressions from the world of statements. 23 (It also gives smaller files to re-compile.) 24 Here, "operand"s are of expressions, not instructions. */ 25 26 #define min(a, b) ((a) < (b) ? (a) : (b)) 27 28 #include "as.h" 29 #include "safe-ctype.h" 30 31 #include <limits.h> 32 #ifndef CHAR_BIT 33 #define CHAR_BIT 8 34 #endif 35 36 bool literal_prefix_dollar_hex = false; 37 38 static void clean_up_expression (expressionS * expressionP); 39 40 /* We keep a mapping of expression symbols to file positions, so that 41 we can provide better error messages. */ 42 43 struct expr_symbol_line { 44 struct expr_symbol_line *next; 45 symbolS *sym; 46 const char *file; 47 unsigned int line; 48 }; 49 50 static struct expr_symbol_line *expr_symbol_lines; 51 52 static const expressionS zero = { .X_op = O_constant }; 53 54 /* Build a dummy symbol to hold a complex expression. This is how we 56 build expressions up out of other expressions. The symbol is put 57 into the fake section expr_section. */ 58 59 symbolS * 60 make_expr_symbol (const expressionS *expressionP) 61 { 62 symbolS *symbolP; 63 struct expr_symbol_line *n; 64 65 if (expressionP->X_op == O_symbol 66 && expressionP->X_add_number == 0) 67 return expressionP->X_add_symbol; 68 69 if (expressionP->X_op == O_big) 70 { 71 /* This won't work, because the actual value is stored in 72 generic_floating_point_number or generic_bignum, and we are 73 going to lose it if we haven't already. */ 74 if (expressionP->X_add_number > 0) 75 as_bad (_("bignum invalid")); 76 else 77 as_bad (_("floating point number invalid")); 78 expressionP = &zero; 79 } 80 81 /* Putting constant symbols in absolute_section rather than 82 expr_section is convenient for the old a.out code, for which 83 S_GET_SEGMENT does not always retrieve the value put in by 84 S_SET_SEGMENT. */ 85 symbolP = symbol_create (FAKE_LABEL_NAME, 86 (expressionP->X_op == O_constant 87 ? absolute_section 88 : expressionP->X_op == O_register 89 ? reg_section 90 : expr_section), 91 &zero_address_frag, 0); 92 symbol_set_value_expression (symbolP, expressionP); 93 94 if (expressionP->X_op == O_constant) 95 resolve_symbol_value (symbolP); 96 97 n = notes_alloc (sizeof (*n)); 98 n->sym = symbolP; 99 n->file = as_where (&n->line); 100 n->next = expr_symbol_lines; 101 expr_symbol_lines = n; 102 103 return symbolP; 104 } 105 106 /* Return the file and line number for an expr symbol. Return 107 non-zero if something was found, 0 if no information is known for 108 the symbol. */ 109 110 int 111 expr_symbol_where (symbolS *sym, const char **pfile, unsigned int *pline) 112 { 113 struct expr_symbol_line *l; 114 115 for (l = expr_symbol_lines; l != NULL; l = l->next) 116 { 117 if (l->sym == sym) 118 { 119 *pfile = l->file; 120 *pline = l->line; 121 return 1; 122 } 123 } 124 125 return 0; 126 } 127 128 /* Look up a previously used .startof. / .sizeof. symbol, or make a fresh 129 one. */ 130 static symbolS **seen[2]; 131 static unsigned int nr_seen[2]; 132 133 static symbolS * 134 symbol_lookup_or_make (const char *name, bool start) 135 { 136 char *buf = concat (start ? ".startof." : ".sizeof.", name, (char *) NULL); 137 symbolS *symbolP; 138 unsigned int i; 139 140 for (i = 0; i < nr_seen[start]; ++i) 141 { 142 symbolP = seen[start][i]; 143 144 if (! symbolP) 145 break; 146 147 name = S_GET_NAME (symbolP); 148 if ((symbols_case_sensitive 149 ? strcmp (buf, name) 150 : strcasecmp (buf, name)) == 0) 151 { 152 free (buf); 153 return symbolP; 154 } 155 } 156 157 symbolP = symbol_make (buf); 158 free (buf); 159 160 if (i >= nr_seen[start]) 161 { 162 unsigned int nr = (i + 1) * 2; 163 164 seen[start] = XRESIZEVEC (symbolS *, seen[start], nr); 165 nr_seen[start] = nr; 166 memset (&seen[start][i + 1], 0, (nr - i - 1) * sizeof(seen[0][0])); 167 } 168 169 seen[start][i] = symbolP; 170 171 return symbolP; 172 } 173 174 /* Utilities for building expressions. 176 Since complex expressions are recorded as symbols for use in other 177 expressions these return a symbolS * and not an expressionS *. 178 These explicitly do not take an "add_number" argument. */ 179 /* ??? For completeness' sake one might want expr_build_symbol. 180 It would just return its argument. */ 181 182 /* Build an expression for an unsigned constant. 183 The corresponding one for signed constants is missing because 184 there's currently no need for it. One could add an unsigned_p flag 185 but that seems more clumsy. */ 186 187 symbolS * 188 expr_build_uconstant (offsetT value) 189 { 190 expressionS e; 191 192 e.X_op = O_constant; 193 e.X_add_number = value; 194 e.X_unsigned = 1; 195 e.X_extrabit = 0; 196 return make_expr_symbol (&e); 197 } 198 199 /* Build any floating-point literal here. 201 Also build any bignum literal here. */ 202 203 /* Seems atof_machine can backscan through generic_bignum and hit whatever 204 happens to be loaded before it in memory. And its way too complicated 205 for me to fix right. Thus a hack. JF: Just make generic_bignum bigger, 206 and never write into the early words, thus they'll always be zero. 207 I hate Dean's floating-point code. Bleh. */ 208 LITTLENUM_TYPE generic_bignum[SIZE_OF_LARGE_NUMBER + 6]; 209 210 FLONUM_TYPE generic_floating_point_number = { 211 &generic_bignum[6], /* low. (JF: Was 0) */ 212 &generic_bignum[SIZE_OF_LARGE_NUMBER + 6 - 1], /* high. JF: (added +6) */ 213 0, /* leader. */ 214 0, /* exponent. */ 215 0 /* sign. */ 216 }; 217 218 219 static void 221 floating_constant (expressionS *expressionP) 222 { 223 /* input_line_pointer -> floating-point constant. */ 224 int error_code; 225 226 error_code = atof_generic (&input_line_pointer, ".", EXP_CHARS, 227 &generic_floating_point_number); 228 229 if (error_code) 230 { 231 if (error_code == ERROR_EXPONENT_OVERFLOW) 232 { 233 as_bad (_("bad floating-point constant: exponent overflow")); 234 } 235 else 236 { 237 as_bad (_("bad floating-point constant: unknown error code=%d"), 238 error_code); 239 } 240 } 241 expressionP->X_op = O_big; 242 /* input_line_pointer -> just after constant, which may point to 243 whitespace. */ 244 expressionP->X_add_number = -1; 245 } 246 247 uint32_t 248 generic_bignum_to_int32 (void) 249 { 250 return ((((uint32_t) generic_bignum[1] & LITTLENUM_MASK) 251 << LITTLENUM_NUMBER_OF_BITS) 252 | ((uint32_t) generic_bignum[0] & LITTLENUM_MASK)); 253 } 254 255 uint64_t 256 generic_bignum_to_int64 (void) 257 { 258 return ((((((((uint64_t) generic_bignum[3] & LITTLENUM_MASK) 259 << LITTLENUM_NUMBER_OF_BITS) 260 | ((uint64_t) generic_bignum[2] & LITTLENUM_MASK)) 261 << LITTLENUM_NUMBER_OF_BITS) 262 | ((uint64_t) generic_bignum[1] & LITTLENUM_MASK)) 263 << LITTLENUM_NUMBER_OF_BITS) 264 | ((uint64_t) generic_bignum[0] & LITTLENUM_MASK)); 265 } 266 267 static void 268 integer_constant (int radix, expressionS *expressionP) 269 { 270 char *start; /* Start of number. */ 271 char *suffix = NULL; 272 char c; 273 valueT number; /* Offset or (absolute) value. */ 274 short int digit; /* Value of next digit in current radix. */ 275 int too_many_digits = 0; /* If we see >= this number of. */ 276 char *name; /* Points to name of symbol. */ 277 symbolS *symbolP; /* Points to symbol. */ 278 279 bool small; /* True if fits in 32 bits (64 bits with BFD64). */ 280 281 /* May be bignum, or may fit in 32 bits. */ 282 /* Most numbers fit into 32 bits, and we want this case to be fast. 283 so we pretend it will fit into 32 bits. If, after making up a 32 284 bit number, we realise that we have scanned more digits than 285 comfortably fit into 32 bits, we re-scan the digits coding them 286 into a bignum. For decimal and octal numbers we are 287 conservative: Some numbers may be assumed bignums when in fact 288 they do fit into 32 bits. Numbers of any radix can have excess 289 leading zeros: We strive to recognise this and cast them back 290 into 32 bits. We must check that the bignum really is more than 291 32 bits, and change it back to a 32-bit number if it fits. The 292 number we are looking for is expected to be positive, but if it 293 fits into 32 bits as an unsigned number, we let it be a 32-bit 294 number. The cavalier approach is for speed in ordinary cases. */ 295 /* This has been extended for 64 bits. We blindly assume that if 296 you're compiling in 64-bit mode, the target is a 64-bit machine. 297 This should be cleaned up. */ 298 299 #ifdef BFD64 300 #define valuesize 64 301 #else /* includes non-bfd case, mostly */ 302 #define valuesize 32 303 #endif 304 305 if (is_end_of_stmt (*input_line_pointer)) 306 { 307 expressionP->X_op = O_absent; 308 return; 309 } 310 311 if ((NUMBERS_WITH_SUFFIX || flag_m68k_mri) && radix == 0) 312 { 313 int flt = 0; 314 315 /* In MRI mode, the number may have a suffix indicating the 316 radix. For that matter, it might actually be a floating 317 point constant. */ 318 for (suffix = input_line_pointer; ISALNUM (*suffix); suffix++) 319 { 320 if (*suffix == 'e' || *suffix == 'E') 321 flt = 1; 322 } 323 324 if (suffix == input_line_pointer) 325 { 326 radix = 10; 327 suffix = NULL; 328 } 329 else 330 { 331 c = *--suffix; 332 c = TOUPPER (c); 333 /* If we have both NUMBERS_WITH_SUFFIX and LOCAL_LABELS_FB, 334 we distinguish between 'B' and 'b'. This is the case for 335 Z80. */ 336 if ((NUMBERS_WITH_SUFFIX && LOCAL_LABELS_FB ? *suffix : c) == 'B') 337 radix = 2; 338 else if (c == 'D') 339 radix = 10; 340 else if (c == 'O' || c == 'Q') 341 radix = 8; 342 else if (c == 'H') 343 radix = 16; 344 else if (suffix[1] == '.' || c == 'E' || flt) 345 { 346 floating_constant (expressionP); 347 return; 348 } 349 else 350 { 351 radix = 10; 352 suffix = NULL; 353 } 354 } 355 } 356 357 switch (radix) 358 { 359 case 2: 360 too_many_digits = valuesize + 1; 361 break; 362 case 8: 363 too_many_digits = (valuesize + 2) / 3 + 1; 364 break; 365 case 16: 366 too_many_digits = (valuesize + 3) / 4 + 1; 367 break; 368 case 10: 369 too_many_digits = (valuesize + 11) / 4; /* Very rough. */ 370 break; 371 } 372 #undef valuesize 373 start = input_line_pointer; 374 c = *input_line_pointer++; 375 for (number = 0; 376 (digit = hex_value (c)) < radix; 377 c = *input_line_pointer++) 378 { 379 number = number * radix + digit; 380 } 381 /* c contains character after number. */ 382 /* input_line_pointer->char after c. */ 383 small = (input_line_pointer - start - 1) < too_many_digits; 384 385 if (radix == 16 && c == '_') 386 { 387 /* This is literal of the form 0x333_0_12345678_1. 388 This example is equivalent to 0x00000333000000001234567800000001. */ 389 390 int num_little_digits = 0; 391 int i; 392 input_line_pointer = start; /* -> 1st digit. */ 393 394 know (LITTLENUM_NUMBER_OF_BITS == 16); 395 396 for (c = '_'; c == '_'; num_little_digits += 2) 397 { 398 399 /* Convert one 64-bit word. */ 400 int ndigit = 0; 401 number = 0; 402 for (c = *input_line_pointer++; 403 (digit = hex_value (c)) < radix; 404 c = *(input_line_pointer++)) 405 { 406 number = number * radix + digit; 407 ndigit++; 408 } 409 410 /* Check for 8 digit per word max. */ 411 if (ndigit > 8) 412 as_bad (_("a bignum with underscores may not have more than 8 hex digits in any word")); 413 414 /* Add this chunk to the bignum. 415 Shift things down 2 little digits. */ 416 know (LITTLENUM_NUMBER_OF_BITS == 16); 417 for (i = min (num_little_digits + 1, SIZE_OF_LARGE_NUMBER - 1); 418 i >= 2; 419 i--) 420 generic_bignum[i] = generic_bignum[i - 2]; 421 422 /* Add the new digits as the least significant new ones. */ 423 generic_bignum[0] = number & 0xffffffff; 424 generic_bignum[1] = number >> 16; 425 } 426 427 /* Again, c is char after number, input_line_pointer->after c. */ 428 429 if (num_little_digits > SIZE_OF_LARGE_NUMBER - 1) 430 num_little_digits = SIZE_OF_LARGE_NUMBER - 1; 431 432 gas_assert (num_little_digits >= 4); 433 434 if (num_little_digits != 8) 435 as_bad (_("a bignum with underscores must have exactly 4 words")); 436 437 /* We might have some leading zeros. These can be trimmed to give 438 us a change to fit this constant into a small number. */ 439 while (generic_bignum[num_little_digits - 1] == 0 440 && num_little_digits > 1) 441 num_little_digits--; 442 443 if (num_little_digits <= 2) 444 { 445 /* will fit into 32 bits. */ 446 number = generic_bignum_to_int32 (); 447 small = 1; 448 } 449 #ifdef BFD64 450 else if (num_little_digits <= 4) 451 { 452 /* Will fit into 64 bits. */ 453 number = generic_bignum_to_int64 (); 454 small = 1; 455 } 456 #endif 457 else 458 { 459 small = 0; 460 461 /* Number of littlenums in the bignum. */ 462 number = num_little_digits; 463 } 464 } 465 else if (!small) 466 { 467 /* We saw a lot of digits. manufacture a bignum the hard way. */ 468 LITTLENUM_TYPE *leader; /* -> high order littlenum of the bignum. */ 469 LITTLENUM_TYPE *pointer; /* -> littlenum we are frobbing now. */ 470 long carry; 471 472 leader = generic_bignum; 473 generic_bignum[0] = 0; 474 generic_bignum[1] = 0; 475 generic_bignum[2] = 0; 476 generic_bignum[3] = 0; 477 input_line_pointer = start; /* -> 1st digit. */ 478 c = *input_line_pointer++; 479 for (; (carry = hex_value (c)) < radix; c = *input_line_pointer++) 480 { 481 for (pointer = generic_bignum; pointer <= leader; pointer++) 482 { 483 long work; 484 485 work = carry + radix * *pointer; 486 *pointer = work & LITTLENUM_MASK; 487 carry = work >> LITTLENUM_NUMBER_OF_BITS; 488 } 489 if (carry) 490 { 491 if (leader < generic_bignum + SIZE_OF_LARGE_NUMBER - 1) 492 { 493 /* Room to grow a longer bignum. */ 494 *++leader = carry; 495 } 496 } 497 } 498 /* Again, c is char after number. */ 499 /* input_line_pointer -> after c. */ 500 know (LITTLENUM_NUMBER_OF_BITS == 16); 501 if (leader < generic_bignum + 2) 502 { 503 /* Will fit into 32 bits. */ 504 number = generic_bignum_to_int32 (); 505 small = 1; 506 } 507 #ifdef BFD64 508 else if (leader < generic_bignum + 4) 509 { 510 /* Will fit into 64 bits. */ 511 number = generic_bignum_to_int64 (); 512 small = 1; 513 } 514 #endif 515 else 516 { 517 /* Number of littlenums in the bignum. */ 518 number = leader - generic_bignum + 1; 519 } 520 } 521 522 if ((NUMBERS_WITH_SUFFIX || flag_m68k_mri) 523 && suffix != NULL 524 && input_line_pointer - 1 == suffix) 525 c = *input_line_pointer++; 526 527 #ifndef tc_allow_U_suffix 528 #define tc_allow_U_suffix 1 529 #endif 530 bool u_seen = !tc_allow_U_suffix; 531 /* PR 19910: Look for, and ignore, a U suffix to the number. */ 532 if (!u_seen && (c == 'U' || c == 'u')) 533 { 534 c = *input_line_pointer++; 535 u_seen = true; 536 } 537 538 #ifndef tc_allow_L_suffix 539 #define tc_allow_L_suffix 1 540 #endif 541 bool l_seen = !tc_allow_L_suffix; 542 /* PR 20732: Look for, and ignore, a L or LL suffix to the number. */ 543 if (tc_allow_L_suffix && (c == 'L' || c == 'l')) 544 { 545 c = * input_line_pointer++; 546 l_seen = true; 547 if (c == 'L' || c == 'l') 548 c = *input_line_pointer++; 549 if (!u_seen && (c == 'U' || c == 'u')) 550 c = *input_line_pointer++; 551 } 552 553 if (small) 554 { 555 /* Here with number, in correct radix. c is the next char. */ 556 bool maybe_label = suffix == NULL 557 && (!tc_allow_U_suffix || !u_seen) 558 && (!tc_allow_L_suffix || !l_seen) 559 && (radix == 10 || 560 (radix == 8 && input_line_pointer == start + 1)); 561 562 if (LOCAL_LABELS_FB && c == 'b' && maybe_label) 563 { 564 /* Backward ref to local label. 565 Because it is backward, expect it to be defined. */ 566 /* Construct a local label. */ 567 name = fb_label_name (number, 0); 568 569 /* Seen before, or symbol is defined: OK. */ 570 symbolP = symbol_find (name); 571 if ((symbolP != NULL) && (S_IS_DEFINED (symbolP))) 572 { 573 expressionP->X_op = O_symbol; 574 expressionP->X_add_symbol = symbolP; 575 } 576 else 577 { 578 /* Either not seen or not defined. */ 579 /* @@ Should print out the original string instead of 580 the parsed number. */ 581 as_bad (_("backward ref to unknown label \"%d:\""), 582 (int) number); 583 expressionP->X_op = O_constant; 584 } 585 586 expressionP->X_add_number = 0; 587 } /* case 'b' */ 588 else if (LOCAL_LABELS_FB && c == 'f' && maybe_label) 589 { 590 /* Forward reference. Expect symbol to be undefined or 591 unknown. undefined: seen it before. unknown: never seen 592 it before. 593 594 Construct a local label name, then an undefined symbol. 595 Don't create a xseg frag for it: caller may do that. 596 Just return it as never seen before. */ 597 name = fb_label_name (number, 1); 598 symbolP = symbol_find_or_make (name); 599 /* We have no need to check symbol properties. */ 600 expressionP->X_op = O_symbol; 601 expressionP->X_add_symbol = symbolP; 602 expressionP->X_add_number = 0; 603 } /* case 'f' */ 604 else if (LOCAL_LABELS_DOLLAR && c == '$' && maybe_label) 605 { 606 /* If the dollar label is *currently* defined, then this is just 607 another reference to it. If it is not *currently* defined, 608 then this is a fresh instantiation of that number, so create 609 it. */ 610 611 if (dollar_label_defined (number)) 612 { 613 name = dollar_label_name (number, 0); 614 symbolP = symbol_find (name); 615 know (symbolP != NULL); 616 } 617 else 618 { 619 name = dollar_label_name (number, 1); 620 symbolP = symbol_find_or_make (name); 621 } 622 623 expressionP->X_op = O_symbol; 624 expressionP->X_add_symbol = symbolP; 625 expressionP->X_add_number = 0; 626 } /* case '$' */ 627 else 628 { 629 expressionP->X_op = O_constant; 630 expressionP->X_add_number = number; 631 input_line_pointer--; /* Restore following character. */ 632 } /* Really just a number. */ 633 } 634 else 635 { 636 /* Not a small number. */ 637 expressionP->X_op = O_big; 638 expressionP->X_add_number = number; /* Number of littlenums. */ 639 expressionP->X_unsigned = 1; 640 input_line_pointer--; /* -> char following number. */ 641 } 642 } 643 644 /* Parse an MRI multi character constant. */ 645 646 static void 647 mri_char_constant (expressionS *expressionP) 648 { 649 int i; 650 651 if (*input_line_pointer == '\'' 652 && input_line_pointer[1] != '\'') 653 { 654 expressionP->X_op = O_constant; 655 expressionP->X_add_number = 0; 656 return; 657 } 658 659 /* In order to get the correct byte ordering, we must build the 660 number in reverse. */ 661 for (i = SIZE_OF_LARGE_NUMBER - 1; i >= 0; i--) 662 { 663 int j; 664 665 generic_bignum[i] = 0; 666 for (j = 0; j < CHARS_PER_LITTLENUM; j++) 667 { 668 if (*input_line_pointer == '\'') 669 { 670 if (input_line_pointer[1] != '\'') 671 break; 672 ++input_line_pointer; 673 } 674 generic_bignum[i] <<= 8; 675 generic_bignum[i] += *input_line_pointer; 676 ++input_line_pointer; 677 } 678 679 if (i < SIZE_OF_LARGE_NUMBER - 1) 680 { 681 /* If there is more than one littlenum, left justify the 682 last one to make it match the earlier ones. If there is 683 only one, we can just use the value directly. */ 684 for (; j < CHARS_PER_LITTLENUM; j++) 685 generic_bignum[i] <<= 8; 686 } 687 688 if (*input_line_pointer == '\'' 689 && input_line_pointer[1] != '\'') 690 break; 691 } 692 693 if (i < 0) 694 { 695 as_bad (_("character constant too large")); 696 i = 0; 697 } 698 699 if (i > 0) 700 { 701 int c; 702 int j; 703 704 c = SIZE_OF_LARGE_NUMBER - i; 705 for (j = 0; j < c; j++) 706 generic_bignum[j] = generic_bignum[i + j]; 707 i = c; 708 } 709 710 know (LITTLENUM_NUMBER_OF_BITS == 16); 711 if (i > 2) 712 { 713 expressionP->X_op = O_big; 714 expressionP->X_add_number = i; 715 expressionP->X_unsigned = 1; 716 } 717 else 718 { 719 expressionP->X_op = O_constant; 720 if (i < 2) 721 expressionP->X_add_number = generic_bignum[0] & LITTLENUM_MASK; 722 else 723 expressionP->X_add_number = 724 (((generic_bignum[1] & LITTLENUM_MASK) 725 << LITTLENUM_NUMBER_OF_BITS) 726 | (generic_bignum[0] & LITTLENUM_MASK)); 727 } 728 729 /* Skip the final closing quote. */ 730 ++input_line_pointer; 731 } 732 733 /* Return an expression representing the current location. This 734 handles the magic symbol `.'. */ 735 736 void 737 current_location (expressionS *expressionp, enum expr_mode mode) 738 { 739 if (now_seg == absolute_section) 740 { 741 expressionp->X_op = O_constant; 742 expressionp->X_add_number = abs_section_offset; 743 } 744 else 745 { 746 expressionp->X_op = O_symbol; 747 if (mode != expr_defer_incl_dot) 748 { 749 expressionp->X_add_symbol = symbol_temp_new_now (); 750 #ifdef tc_new_dot_label 751 tc_new_dot_label (expressionp->X_add_symbol); 752 #endif 753 } 754 else 755 expressionp->X_add_symbol = &dot_symbol; 756 expressionp->X_add_number = 0; 757 } 758 } 759 760 /* Make a symbol for the current location ('.'). */ 761 762 symbolS * 763 expr_build_dot (void) 764 { 765 if (now_seg != absolute_section) 766 { 767 symbolS *symbolP = symbol_temp_new_now (); 768 769 #ifdef tc_new_dot_label 770 tc_new_dot_label (symbolP); 771 #endif 772 return symbolP; 773 } 774 775 return expr_build_uconstant (abs_section_offset); 776 } 777 778 /* Copy an expression, preserving X_md. */ 779 780 static void expr_copy (expressionS *dst, const expressionS *src) 781 { 782 unsigned short md = dst->X_md; 783 784 *dst = *src; 785 dst->X_md = md; 786 } 787 788 #ifndef md_register_arithmetic 789 # define md_register_arithmetic 1 790 #endif 791 792 /* In: Input_line_pointer points to 1st char of operand, which may 793 be a space. 794 795 Out: An expressionS. 796 The operand may have been empty: in this case X_op == O_absent. 797 Input_line_pointer->(next non-blank) char after operand. */ 798 799 static segT 800 operand (expressionS *expressionP, enum expr_mode mode) 801 { 802 char c; 803 symbolS *symbolP; /* Points to symbol. */ 804 char *name; /* Points to name of symbol. */ 805 segT segment; 806 operatorT op = O_absent; /* For unary operators. */ 807 808 /* All integers are regarded as unsigned unless they are negated. 809 This is because the only thing which cares whether a number is 810 unsigned is the code in emit_expr which extends constants into 811 bignums. It should only sign extend negative numbers, so that 812 something like ``.quad 0x80000000'' is not sign extended even 813 though it appears negative if valueT is 32 bits. */ 814 expressionP->X_unsigned = 1; 815 expressionP->X_extrabit = 0; 816 817 /* Digits, assume it is a bignum. */ 818 819 SKIP_WHITESPACE (); /* Leading whitespace is part of operand. */ 820 c = *input_line_pointer++; /* input_line_pointer -> past char in c. */ 821 822 if (is_end_of_stmt (c)) 823 goto eol; 824 825 switch (c) 826 { 827 case '1': 828 case '2': 829 case '3': 830 case '4': 831 case '5': 832 case '6': 833 case '7': 834 case '8': 835 case '9': 836 input_line_pointer--; 837 838 integer_constant ((NUMBERS_WITH_SUFFIX || flag_m68k_mri) 839 ? 0 : 10, 840 expressionP); 841 break; 842 843 #ifdef LITERAL_PREFIXPERCENT_BIN 844 case '%': 845 integer_constant (2, expressionP); 846 break; 847 #endif 848 849 case '0': 850 /* Non-decimal radix. */ 851 852 if (NUMBERS_WITH_SUFFIX || flag_m68k_mri) 853 { 854 char *s; 855 856 /* Check for a hex or float constant. */ 857 for (s = input_line_pointer; hex_p (*s); s++) 858 ; 859 if (*s == 'h' || *s == 'H' || *input_line_pointer == '.') 860 { 861 --input_line_pointer; 862 integer_constant (0, expressionP); 863 break; 864 } 865 } 866 c = *input_line_pointer; 867 switch (c) 868 { 869 case 'o': 870 case 'O': 871 case 'q': 872 case 'Q': 873 case '8': 874 case '9': 875 if (NUMBERS_WITH_SUFFIX || flag_m68k_mri) 876 { 877 integer_constant (0, expressionP); 878 break; 879 } 880 /* Fall through. */ 881 default: 882 default_case: 883 if (c && strchr (FLT_CHARS, c)) 884 { 885 input_line_pointer++; 886 floating_constant (expressionP); 887 expressionP->X_add_number = - TOLOWER (c); 888 } 889 else 890 { 891 /* The string was only zero. */ 892 expressionP->X_op = O_constant; 893 expressionP->X_add_number = 0; 894 } 895 896 break; 897 898 case 'x': 899 case 'X': 900 if (flag_m68k_mri) 901 goto default_case; 902 input_line_pointer++; 903 integer_constant (16, expressionP); 904 break; 905 906 case 'b': 907 if (LOCAL_LABELS_FB && !flag_m68k_mri 908 && input_line_pointer[1] != '0' 909 && input_line_pointer[1] != '1') 910 { 911 /* Parse this as a back reference to label 0. */ 912 input_line_pointer--; 913 integer_constant (10, expressionP); 914 break; 915 } 916 /* Otherwise, parse this as a binary number. */ 917 /* Fall through. */ 918 case 'B': 919 if (input_line_pointer[1] == '0' 920 || input_line_pointer[1] == '1') 921 { 922 input_line_pointer++; 923 integer_constant (2, expressionP); 924 break; 925 } 926 if (flag_m68k_mri || NUMBERS_WITH_SUFFIX) 927 input_line_pointer++; 928 goto default_case; 929 930 case 'l': 931 case 'L': 932 /* Accept an L suffix to the zero. */ 933 if (tc_allow_L_suffix) 934 goto numeric; 935 goto default_case; 936 937 case 'u': 938 case 'U': 939 /* Accept a U suffix to the zero. */ 940 if (!tc_allow_U_suffix) 941 goto default_case; 942 /* Fall through. */ 943 case '0': 944 case '1': 945 case '2': 946 case '3': 947 case '4': 948 case '5': 949 case '6': 950 case '7': 951 numeric: 952 integer_constant ((flag_m68k_mri || NUMBERS_WITH_SUFFIX) 953 ? 0 : 8, 954 expressionP); 955 break; 956 957 case 'f': 958 if (LOCAL_LABELS_FB) 959 { 960 int is_label = 1; 961 962 /* If it says "0f" and it could possibly be a floating point 963 number, make it one. Otherwise, make it a local label, 964 and try to deal with parsing the rest later. */ 965 if (!is_end_of_stmt (input_line_pointer[1]) 966 && strchr (FLT_CHARS, 'f') != NULL) 967 { 968 char *cp = input_line_pointer + 1; 969 970 atof_generic (&cp, ".", EXP_CHARS, 971 &generic_floating_point_number); 972 973 /* Was nothing parsed, or does it look like an 974 expression? */ 975 is_label = (cp == input_line_pointer + 1 976 || (cp == input_line_pointer + 2 977 && (cp[-1] == '-' || cp[-1] == '+')) 978 || *cp == 'f' 979 || *cp == 'b'); 980 } 981 if (is_label) 982 { 983 input_line_pointer--; 984 integer_constant (10, expressionP); 985 break; 986 } 987 } 988 /* Fall through. */ 989 990 case 'd': 991 case 'D': 992 if (flag_m68k_mri || NUMBERS_WITH_SUFFIX) 993 { 994 integer_constant (0, expressionP); 995 break; 996 } 997 /* Fall through. */ 998 case 'F': 999 case 'r': 1000 case 'e': 1001 case 'E': 1002 case 'g': 1003 case 'G': 1004 input_line_pointer++; 1005 floating_constant (expressionP); 1006 expressionP->X_add_number = - TOLOWER (c); 1007 break; 1008 1009 case '$': 1010 if (LOCAL_LABELS_DOLLAR) 1011 { 1012 integer_constant (10, expressionP); 1013 break; 1014 } 1015 else 1016 goto default_case; 1017 } 1018 1019 break; 1020 1021 #ifndef NEED_INDEX_OPERATOR 1022 case '[': 1023 # ifdef md_need_index_operator 1024 if (md_need_index_operator()) 1025 goto de_fault; 1026 # endif 1027 #endif 1028 /* Fall through. */ 1029 case '(': 1030 /* Didn't begin with digit & not a name. */ 1031 segment = expr (0, expressionP, mode); 1032 /* expression () will pass trailing whitespace. */ 1033 if ((c == '(' && *input_line_pointer != ')') 1034 || (c == '[' && *input_line_pointer != ']')) 1035 { 1036 if (* input_line_pointer) 1037 as_bad (_("found '%c', expected: '%c'"), 1038 * input_line_pointer, c == '(' ? ')' : ']'); 1039 else 1040 as_bad (_("missing '%c'"), c == '(' ? ')' : ']'); 1041 } 1042 else 1043 input_line_pointer++; 1044 SKIP_ALL_WHITESPACE (); 1045 /* Here with input_line_pointer -> char after "(...)". */ 1046 return segment; 1047 1048 #ifdef TC_M68K 1049 case 'E': 1050 if (! flag_m68k_mri || *input_line_pointer != '\'') 1051 goto de_fault; 1052 as_bad (_("EBCDIC constants are not supported")); 1053 /* Fall through. */ 1054 case 'A': 1055 if (! flag_m68k_mri || *input_line_pointer != '\'') 1056 goto de_fault; 1057 ++input_line_pointer; 1058 #endif 1059 /* Fall through. */ 1060 case '\'': 1061 if (! flag_m68k_mri) 1062 { 1063 /* Warning: to conform to other people's assemblers NO 1064 ESCAPEMENT is permitted for a single quote. The next 1065 character, parity errors and all, is taken as the value 1066 of the operand. VERY KINKY. */ 1067 expressionP->X_op = O_constant; 1068 expressionP->X_add_number = *input_line_pointer++; 1069 break; 1070 } 1071 1072 mri_char_constant (expressionP); 1073 break; 1074 1075 #ifdef TC_M68K 1076 case '"': 1077 /* Double quote is the bitwise not operator in MRI mode. */ 1078 if (! flag_m68k_mri) 1079 goto de_fault; 1080 #endif 1081 /* Fall through. */ 1082 case '~': 1083 /* '~' is permitted to start a label on the Delta. */ 1084 if (is_name_beginner (c)) 1085 goto isname; 1086 op = O_bit_not; 1087 goto unary; 1088 1089 case '!': 1090 op = O_logical_not; 1091 goto unary; 1092 1093 case '-': 1094 op = O_uminus; 1095 /* Fall through. */ 1096 case '+': 1097 { 1098 unary: 1099 operand (expressionP, mode); 1100 1101 #ifdef md_optimize_expr 1102 if (md_optimize_expr (NULL, op, expressionP)) 1103 { 1104 /* Skip. */ 1105 ; 1106 } 1107 else 1108 #endif 1109 if (expressionP->X_op == O_constant) 1110 { 1111 /* input_line_pointer -> char after operand. */ 1112 if (op == O_uminus) 1113 { 1114 expressionP->X_add_number 1115 = - (addressT) expressionP->X_add_number; 1116 /* Notice: '-' may overflow: no warning is given. 1117 This is compatible with other people's 1118 assemblers. Sigh. */ 1119 expressionP->X_unsigned = 0; 1120 if (expressionP->X_add_number) 1121 expressionP->X_extrabit ^= 1; 1122 } 1123 else if (op == O_bit_not) 1124 { 1125 expressionP->X_add_number = ~ expressionP->X_add_number; 1126 expressionP->X_extrabit ^= 1; 1127 expressionP->X_unsigned = 0; 1128 } 1129 else if (op == O_logical_not) 1130 { 1131 expressionP->X_add_number = ! expressionP->X_add_number; 1132 expressionP->X_unsigned = 1; 1133 expressionP->X_extrabit = 0; 1134 } 1135 } 1136 else if (expressionP->X_op == O_big 1137 && expressionP->X_add_number <= 0 1138 && op == O_uminus 1139 && (generic_floating_point_number.sign == '+' 1140 || generic_floating_point_number.sign == 'P')) 1141 { 1142 /* Negative flonum (eg, -1.000e0). */ 1143 if (generic_floating_point_number.sign == '+') 1144 generic_floating_point_number.sign = '-'; 1145 else 1146 generic_floating_point_number.sign = 'N'; 1147 } 1148 else if (expressionP->X_op == O_big 1149 && expressionP->X_add_number > 0) 1150 { 1151 int i; 1152 1153 if (op == O_uminus || op == O_bit_not) 1154 { 1155 for (i = 0; i < expressionP->X_add_number; ++i) 1156 generic_bignum[i] = ~generic_bignum[i]; 1157 1158 /* Extend the bignum to at least the size of .octa. */ 1159 if (expressionP->X_add_number < SIZE_OF_LARGE_NUMBER) 1160 { 1161 expressionP->X_add_number = SIZE_OF_LARGE_NUMBER; 1162 for (; i < expressionP->X_add_number; ++i) 1163 generic_bignum[i] = ~(LITTLENUM_TYPE) 0; 1164 } 1165 1166 if (op == O_uminus) 1167 for (i = 0; i < expressionP->X_add_number; ++i) 1168 { 1169 generic_bignum[i] += 1; 1170 if (generic_bignum[i]) 1171 break; 1172 } 1173 1174 expressionP->X_unsigned = 0; 1175 } 1176 else if (op == O_logical_not) 1177 { 1178 for (i = 0; i < expressionP->X_add_number; ++i) 1179 if (generic_bignum[i] != 0) 1180 break; 1181 expressionP->X_add_number = i >= expressionP->X_add_number; 1182 expressionP->X_op = O_constant; 1183 expressionP->X_unsigned = 1; 1184 expressionP->X_extrabit = 0; 1185 } 1186 } 1187 else if (expressionP->X_op != O_illegal 1188 && expressionP->X_op != O_absent) 1189 { 1190 if (op != O_absent) 1191 { 1192 expressionP->X_add_symbol = make_expr_symbol (expressionP); 1193 expressionP->X_op = op; 1194 expressionP->X_add_number = 0; 1195 } 1196 else if (!md_register_arithmetic && expressionP->X_op == O_register) 1197 { 1198 /* Convert to binary '+'. */ 1199 expressionP->X_op_symbol = make_expr_symbol (expressionP); 1200 expressionP->X_add_symbol = make_expr_symbol (&zero); 1201 expressionP->X_add_number = 0; 1202 expressionP->X_op = O_add; 1203 } 1204 } 1205 else 1206 as_warn (_("Unary operator %c ignored because bad operand follows"), 1207 c); 1208 } 1209 break; 1210 1211 #if !defined (DOLLAR_DOT) && !defined (TC_M68K) 1212 case '$': 1213 if (literal_prefix_dollar_hex) 1214 { 1215 /* $L is the start of a local label, not a hex constant. */ 1216 if (* input_line_pointer == 'L') 1217 goto isname; 1218 integer_constant (16, expressionP); 1219 } 1220 else 1221 { 1222 goto isname; 1223 } 1224 break; 1225 #else 1226 case '$': 1227 /* '$' is the program counter when in MRI mode, or when 1228 DOLLAR_DOT is defined. */ 1229 #ifndef DOLLAR_DOT 1230 if (! flag_m68k_mri) 1231 goto de_fault; 1232 #endif 1233 if (DOLLAR_AMBIGU && hex_p (*input_line_pointer)) 1234 { 1235 /* In MRI mode and on Z80, '$' is also used as the prefix 1236 for a hexadecimal constant. */ 1237 integer_constant (16, expressionP); 1238 break; 1239 } 1240 1241 if (is_part_of_name (*input_line_pointer)) 1242 goto isname; 1243 1244 current_location (expressionP, mode); 1245 break; 1246 #endif 1247 1248 case '.': 1249 if (!is_part_of_name (*input_line_pointer)) 1250 { 1251 current_location (expressionP, mode); 1252 break; 1253 } 1254 else if ((strncasecmp (input_line_pointer, "startof.", 8) == 0 1255 && ! is_part_of_name (input_line_pointer[8])) 1256 || (strncasecmp (input_line_pointer, "sizeof.", 7) == 0 1257 && ! is_part_of_name (input_line_pointer[7]))) 1258 { 1259 int start; 1260 1261 start = (input_line_pointer[1] == 't' 1262 || input_line_pointer[1] == 'T'); 1263 input_line_pointer += start ? 8 : 7; 1264 SKIP_WHITESPACE (); 1265 1266 /* Cover for the as_bad () invocations below. */ 1267 expressionP->X_op = O_absent; 1268 1269 if (*input_line_pointer != '(') 1270 as_bad (_("syntax error in .startof. or .sizeof.")); 1271 else 1272 { 1273 ++input_line_pointer; 1274 SKIP_WHITESPACE (); 1275 c = get_symbol_name (& name); 1276 if (! *name) 1277 { 1278 as_bad (_("expected symbol name")); 1279 (void) restore_line_pointer (c); 1280 if (c == ')') 1281 ++input_line_pointer; 1282 break; 1283 } 1284 1285 expressionP->X_op = O_symbol; 1286 expressionP->X_add_symbol = symbol_lookup_or_make (name, start); 1287 expressionP->X_add_number = 0; 1288 1289 restore_line_pointer (c); 1290 SKIP_WHITESPACE (); 1291 if (*input_line_pointer != ')') 1292 as_bad (_("syntax error in .startof. or .sizeof.")); 1293 else 1294 ++input_line_pointer; 1295 } 1296 break; 1297 } 1298 else 1299 { 1300 goto isname; 1301 } 1302 1303 case ',': 1304 eol: 1305 /* Can't imagine any other kind of operand. */ 1306 expressionP->X_op = O_absent; 1307 input_line_pointer--; 1308 break; 1309 1310 #ifdef TC_M68K 1311 case '%': 1312 if (! flag_m68k_mri) 1313 goto de_fault; 1314 integer_constant (2, expressionP); 1315 break; 1316 1317 case '@': 1318 if (! flag_m68k_mri) 1319 goto de_fault; 1320 integer_constant (8, expressionP); 1321 break; 1322 1323 case ':': 1324 if (! flag_m68k_mri) 1325 goto de_fault; 1326 1327 /* In MRI mode, this is a floating point constant represented 1328 using hexadecimal digits. */ 1329 1330 ++input_line_pointer; 1331 integer_constant (16, expressionP); 1332 break; 1333 1334 case '*': 1335 if (! flag_m68k_mri || is_part_of_name (*input_line_pointer)) 1336 goto de_fault; 1337 1338 current_location (expressionP, mode); 1339 break; 1340 #endif 1341 1342 default: 1343 #if defined(md_need_index_operator) || defined(TC_M68K) 1344 de_fault: 1345 #endif 1346 if (is_name_beginner (c) || c == '"') /* Here if did not begin with a digit. */ 1347 { 1348 /* Identifier begins here. 1349 This is kludged for speed, so code is repeated. */ 1350 isname: 1351 -- input_line_pointer; 1352 c = get_symbol_name (&name); 1353 1354 #ifdef md_operator 1355 { 1356 op = md_operator (name, 1, &c); 1357 switch (op) 1358 { 1359 case O_uminus: 1360 restore_line_pointer (c); 1361 c = '-'; 1362 goto unary; 1363 case O_bit_not: 1364 restore_line_pointer (c); 1365 c = '~'; 1366 goto unary; 1367 case O_logical_not: 1368 restore_line_pointer (c); 1369 c = '!'; 1370 goto unary; 1371 case O_illegal: 1372 as_bad (_("invalid use of operator \"%s\""), name); 1373 break; 1374 default: 1375 break; 1376 } 1377 1378 if (op != O_absent && op != O_illegal) 1379 { 1380 restore_line_pointer (c); 1381 expr (9, expressionP, mode); 1382 expressionP->X_add_symbol = make_expr_symbol (expressionP); 1383 expressionP->X_op_symbol = NULL; 1384 expressionP->X_add_number = 0; 1385 expressionP->X_op = op; 1386 break; 1387 } 1388 } 1389 #endif 1390 1391 #ifdef md_parse_name 1392 /* This is a hook for the backend to parse certain names 1393 specially in certain contexts. If a name always has a 1394 specific value, it can often be handled by simply 1395 entering it in the symbol table. */ 1396 if (md_parse_name (name, expressionP, mode, &c)) 1397 { 1398 restore_line_pointer (c); 1399 break; 1400 } 1401 #endif 1402 1403 symbolP = symbol_find_or_make (name); 1404 1405 /* If we have an absolute symbol or a reg, then we know its 1406 value now. */ 1407 segment = S_GET_SEGMENT (symbolP); 1408 if (!expr_defer_p (mode) 1409 && segment == absolute_section 1410 && !S_FORCE_RELOC (symbolP, 0)) 1411 { 1412 expressionP->X_op = O_constant; 1413 expressionP->X_add_number = S_GET_VALUE (symbolP); 1414 } 1415 else if (!expr_defer_p (mode) && segment == reg_section) 1416 { 1417 if (md_register_arithmetic) 1418 { 1419 expressionP->X_op = O_register; 1420 expressionP->X_add_number = S_GET_VALUE (symbolP); 1421 } 1422 else 1423 { 1424 expr_copy (expressionP, 1425 symbol_get_value_expression (symbolP)); 1426 resolve_register (expressionP); 1427 } 1428 } 1429 else 1430 { 1431 expressionP->X_op = O_symbol; 1432 expressionP->X_add_symbol = symbolP; 1433 expressionP->X_add_number = 0; 1434 } 1435 1436 restore_line_pointer (c); 1437 } 1438 else 1439 { 1440 /* Let the target try to parse it. Success is indicated by changing 1441 the X_op field to something other than O_absent and pointing 1442 input_line_pointer past the expression. If it can't parse the 1443 expression, X_op and input_line_pointer should be unchanged. */ 1444 expressionP->X_op = O_absent; 1445 --input_line_pointer; 1446 md_operand (expressionP); 1447 if (expressionP->X_op == O_absent) 1448 { 1449 ++input_line_pointer; 1450 as_bad (_("bad expression")); 1451 expressionP->X_op = O_constant; 1452 expressionP->X_add_number = 0; 1453 } 1454 } 1455 break; 1456 } 1457 1458 /* It is more 'efficient' to clean up the expressionS when they are 1459 created. Doing it here saves lines of code. */ 1460 clean_up_expression (expressionP); 1461 SKIP_ALL_WHITESPACE (); /* -> 1st char after operand. */ 1462 know (!is_whitespace (*input_line_pointer)); 1463 1464 /* The PA port needs this information. */ 1465 if (expressionP->X_add_symbol) 1466 symbol_mark_used (expressionP->X_add_symbol); 1467 1468 if (!expr_defer_p (mode)) 1469 { 1470 expressionP->X_add_symbol 1471 = symbol_clone_if_forward_ref (expressionP->X_add_symbol); 1472 expressionP->X_op_symbol 1473 = symbol_clone_if_forward_ref (expressionP->X_op_symbol); 1474 } 1475 1476 switch (expressionP->X_op) 1477 { 1478 default: 1479 return absolute_section; 1480 case O_symbol: 1481 return S_GET_SEGMENT (expressionP->X_add_symbol); 1482 case O_register: 1483 return reg_section; 1484 } 1485 } 1486 1487 /* Internal. Simplify a struct expression for use by expr (). */ 1489 1490 /* In: address of an expressionS. 1491 The X_op field of the expressionS may only take certain values. 1492 Elsewise we waste time special-case testing. Sigh. Ditto SEG_ABSENT. 1493 1494 Out: expressionS may have been modified: 1495 Unused fields zeroed to help expr (). */ 1496 1497 static void 1498 clean_up_expression (expressionS *expressionP) 1499 { 1500 switch (expressionP->X_op) 1501 { 1502 case O_illegal: 1503 case O_absent: 1504 expressionP->X_add_number = 0; 1505 /* Fall through. */ 1506 case O_big: 1507 case O_constant: 1508 case O_register: 1509 expressionP->X_add_symbol = NULL; 1510 /* Fall through. */ 1511 case O_symbol: 1512 case O_uminus: 1513 case O_bit_not: 1514 expressionP->X_op_symbol = NULL; 1515 break; 1516 default: 1517 break; 1518 } 1519 } 1520 1521 /* Expression parser. */ 1523 1524 /* We allow an empty expression, and just assume (absolute,0) silently. 1525 Unary operators and parenthetical expressions are treated as operands. 1526 As usual, Q==quantity==operand, O==operator, X==expression mnemonics. 1527 1528 We used to do an aho/ullman shift-reduce parser, but the logic got so 1529 warped that I flushed it and wrote a recursive-descent parser instead. 1530 Now things are stable, would anybody like to write a fast parser? 1531 Most expressions are either register (which does not even reach here) 1532 or 1 symbol. Then "symbol+constant" and "symbol-symbol" are common. 1533 So I guess it doesn't really matter how inefficient more complex expressions 1534 are parsed. 1535 1536 After expr(RANK,resultP) input_line_pointer->operator of rank <= RANK. 1537 Also, we have consumed any leading or trailing spaces (operand does that) 1538 and done all intervening operators. 1539 1540 This returns the segment of the result, which will be 1541 absolute_section or the segment of a symbol. */ 1542 1543 #undef __ 1544 #define __ O_illegal 1545 #ifndef O_SINGLE_EQ 1546 #define O_SINGLE_EQ O_illegal 1547 #endif 1548 1549 /* Maps ASCII -> operators. */ 1550 static const operatorT op_encoding[256] = { 1551 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, 1552 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, 1553 1554 __, O_bit_or_not, __, __, __, O_modulus, O_bit_and, __, 1555 __, __, O_multiply, O_add, __, O_subtract, __, O_divide, 1556 __, __, __, __, __, __, __, __, 1557 __, __, __, __, O_lt, O_SINGLE_EQ, O_gt, __, 1558 __, __, __, __, __, __, __, __, 1559 __, __, __, __, __, __, __, __, 1560 __, __, __, __, __, __, __, __, 1561 __, __, __, 1562 #ifdef NEED_INDEX_OPERATOR 1563 O_index, 1564 #else 1565 __, 1566 #endif 1567 __, __, O_bit_exclusive_or, __, 1568 __, __, __, __, __, __, __, __, 1569 __, __, __, __, __, __, __, __, 1570 __, __, __, __, __, __, __, __, 1571 __, __, __, __, O_bit_inclusive_or, __, __, __, 1572 1573 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, 1574 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, 1575 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, 1576 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, 1577 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, 1578 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, 1579 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, 1580 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __ 1581 }; 1582 1583 /* Rank Examples 1584 0 operand, (expression) 1585 1 || 1586 2 && 1587 3 == <> < <= >= > 1588 4 + - 1589 5 used for * / % in MRI mode 1590 6 & ^ ! | 1591 7 * / % << >> 1592 8 unary - unary ~ 1593 */ 1594 static operator_rankT op_rank[O_max] = { 1595 0, /* O_illegal */ 1596 0, /* O_absent */ 1597 0, /* O_constant */ 1598 0, /* O_symbol */ 1599 0, /* O_symbol_rva */ 1600 0, /* O_secidx */ 1601 0, /* O_register */ 1602 0, /* O_big */ 1603 9, /* O_uminus */ 1604 9, /* O_bit_not */ 1605 9, /* O_logical_not */ 1606 8, /* O_multiply */ 1607 8, /* O_divide */ 1608 8, /* O_modulus */ 1609 8, /* O_left_shift */ 1610 8, /* O_right_shift */ 1611 7, /* O_bit_inclusive_or */ 1612 7, /* O_bit_or_not */ 1613 7, /* O_bit_exclusive_or */ 1614 7, /* O_bit_and */ 1615 5, /* O_add */ 1616 5, /* O_subtract */ 1617 4, /* O_eq */ 1618 4, /* O_ne */ 1619 4, /* O_lt */ 1620 4, /* O_le */ 1621 4, /* O_ge */ 1622 4, /* O_gt */ 1623 3, /* O_logical_and */ 1624 2, /* O_logical_or */ 1625 1, /* O_index */ 1626 }; 1627 1628 /* Unfortunately, in MRI mode for the m68k, multiplication and 1629 division have lower precedence than the bit wise operators. This 1630 function sets the operator precedences correctly for the current 1631 mode. Also, MRI uses a different bit_not operator, and this fixes 1632 that as well. */ 1633 1634 #define STANDARD_MUL_PRECEDENCE 8 1635 #define MRI_MUL_PRECEDENCE 6 1636 1637 void 1638 expr_set_precedence (void) 1639 { 1640 if (flag_m68k_mri) 1641 { 1642 op_rank[O_multiply] = MRI_MUL_PRECEDENCE; 1643 op_rank[O_divide] = MRI_MUL_PRECEDENCE; 1644 op_rank[O_modulus] = MRI_MUL_PRECEDENCE; 1645 } 1646 else 1647 { 1648 op_rank[O_multiply] = STANDARD_MUL_PRECEDENCE; 1649 op_rank[O_divide] = STANDARD_MUL_PRECEDENCE; 1650 op_rank[O_modulus] = STANDARD_MUL_PRECEDENCE; 1651 } 1652 } 1653 1654 void 1655 expr_set_rank (operatorT op, operator_rankT rank) 1656 { 1657 gas_assert (op >= O_md1 && op < ARRAY_SIZE (op_rank)); 1658 op_rank[op] = rank; 1659 } 1660 1661 /* Initialize the expression parser. */ 1662 1663 void 1664 expr_begin (void) 1665 { 1666 expr_set_precedence (); 1667 1668 /* Verify that X_op field is wide enough. */ 1669 { 1670 expressionS e; 1671 e.X_op = O_max; 1672 gas_assert (e.X_op == O_max); 1673 } 1674 1675 memset (seen, 0, sizeof seen); 1676 memset (nr_seen, 0, sizeof nr_seen); 1677 expr_symbol_lines = NULL; 1678 } 1679 1680 void 1681 expr_end (void) 1682 { 1683 for (size_t i = 0; i < ARRAY_SIZE (seen); i++) 1684 free (seen[i]); 1685 } 1686 1687 /* Return the encoding for the operator at INPUT_LINE_POINTER, and 1689 sets NUM_CHARS to the number of characters in the operator. 1690 Does not advance INPUT_LINE_POINTER. */ 1691 1692 static inline operatorT 1693 operatorf (int *num_chars) 1694 { 1695 int c; 1696 operatorT ret; 1697 1698 c = *input_line_pointer & 0xff; 1699 *num_chars = 1; 1700 1701 if (is_end_of_stmt (c)) 1702 return O_illegal; 1703 1704 #ifdef md_operator 1705 if (is_name_beginner (c)) 1706 { 1707 char *name; 1708 char ec = get_symbol_name (& name); 1709 1710 ret = md_operator (name, 2, &ec); 1711 switch (ret) 1712 { 1713 case O_absent: 1714 *input_line_pointer = ec; 1715 input_line_pointer = name; 1716 break; 1717 case O_uminus: 1718 case O_bit_not: 1719 case O_logical_not: 1720 as_bad (_("invalid use of operator \"%s\""), name); 1721 ret = O_illegal; 1722 /* FALLTHROUGH */ 1723 default: 1724 *input_line_pointer = ec; 1725 *num_chars = input_line_pointer - name; 1726 input_line_pointer = name; 1727 return ret; 1728 } 1729 } 1730 #endif 1731 1732 switch (c) 1733 { 1734 default: 1735 ret = op_encoding[c]; 1736 #ifdef md_operator 1737 if (ret == O_illegal) 1738 { 1739 char *start = input_line_pointer; 1740 1741 ret = md_operator (NULL, 2, NULL); 1742 if (ret != O_illegal) 1743 *num_chars = input_line_pointer - start; 1744 input_line_pointer = start; 1745 } 1746 #endif 1747 return ret; 1748 1749 case '+': 1750 case '-': 1751 return op_encoding[c]; 1752 1753 case '<': 1754 switch (input_line_pointer[1]) 1755 { 1756 default: 1757 return op_encoding[c]; 1758 case '<': 1759 ret = O_left_shift; 1760 break; 1761 case '>': 1762 ret = O_ne; 1763 break; 1764 case '=': 1765 ret = O_le; 1766 break; 1767 } 1768 *num_chars = 2; 1769 return ret; 1770 1771 case '=': 1772 if (input_line_pointer[1] != '=') 1773 return op_encoding[c]; 1774 1775 *num_chars = 2; 1776 return O_eq; 1777 1778 case '>': 1779 switch (input_line_pointer[1]) 1780 { 1781 default: 1782 return op_encoding[c]; 1783 case '>': 1784 ret = O_right_shift; 1785 break; 1786 case '=': 1787 ret = O_ge; 1788 break; 1789 } 1790 *num_chars = 2; 1791 return ret; 1792 1793 case '!': 1794 switch (input_line_pointer[1]) 1795 { 1796 case '!': 1797 /* We accept !! as equivalent to ^ for MRI compatibility. */ 1798 *num_chars = 2; 1799 return O_bit_exclusive_or; 1800 case '=': 1801 /* We accept != as equivalent to <>. */ 1802 *num_chars = 2; 1803 return O_ne; 1804 default: 1805 if (flag_m68k_mri) 1806 return O_bit_inclusive_or; 1807 return op_encoding[c]; 1808 } 1809 1810 case '|': 1811 if (input_line_pointer[1] != '|') 1812 return op_encoding[c]; 1813 1814 *num_chars = 2; 1815 return O_logical_or; 1816 1817 case '&': 1818 if (input_line_pointer[1] != '&') 1819 return op_encoding[c]; 1820 1821 *num_chars = 2; 1822 return O_logical_and; 1823 } 1824 1825 /* NOTREACHED */ 1826 } 1827 1828 /* Implement "word-size + 1 bit" addition for 1829 {resultP->X_extrabit:resultP->X_add_number} + {rhs_highbit:amount}. This 1830 is used so that the full range of unsigned word values and the full range of 1831 signed word values can be represented in an O_constant expression, which is 1832 useful e.g. for .sleb128 directives. */ 1833 1834 void 1835 add_to_result (expressionS *resultP, offsetT amount, int rhs_highbit) 1836 { 1837 valueT ures = resultP->X_add_number; 1838 valueT uamount = amount; 1839 1840 resultP->X_add_number += uamount; 1841 1842 resultP->X_extrabit ^= rhs_highbit; 1843 1844 if (ures + uamount < ures) 1845 resultP->X_extrabit ^= 1; 1846 } 1847 1848 /* Similarly, for subtraction. */ 1849 1850 void 1851 subtract_from_result (expressionS *resultP, offsetT amount, int rhs_highbit) 1852 { 1853 valueT ures = resultP->X_add_number; 1854 valueT uamount = amount; 1855 1856 resultP->X_add_number -= uamount; 1857 1858 resultP->X_extrabit ^= rhs_highbit; 1859 1860 if (ures < uamount) 1861 resultP->X_extrabit ^= 1; 1862 } 1863 1864 /* Parse an expression. */ 1865 1866 segT 1867 expr (int rankarg, /* Larger # is higher rank. */ 1868 expressionS *resultP, /* Deliver result here. */ 1869 enum expr_mode mode /* Controls behavior. */) 1870 { 1871 operator_rankT rank = (operator_rankT) rankarg; 1872 segT retval; 1873 expressionS right; 1874 operatorT op_left; 1875 operatorT op_right; 1876 int op_chars; 1877 1878 know (rankarg >= 0); 1879 1880 /* Save the value of dot for the fixup code. */ 1881 if (rank == 0) 1882 symbol_set_value_now (&dot_symbol); 1883 1884 retval = operand (resultP, mode); 1885 1886 /* operand () gobbles spaces. */ 1887 know (!is_whitespace (*input_line_pointer)); 1888 1889 op_left = operatorf (&op_chars); 1890 while (op_left != O_illegal && op_rank[op_left] > rank) 1891 { 1892 segT rightseg; 1893 bool is_unsigned; 1894 offsetT frag_off; 1895 1896 input_line_pointer += op_chars; /* -> after operator. */ 1897 1898 right.X_md = 0; 1899 rightseg = expr (op_rank[op_left], &right, mode); 1900 if (right.X_op == O_absent) 1901 { 1902 as_warn (_("missing operand; zero assumed")); 1903 right.X_op = O_constant; 1904 right.X_add_number = 0; 1905 right.X_add_symbol = NULL; 1906 right.X_op_symbol = NULL; 1907 } 1908 1909 know (!is_whitespace (*input_line_pointer)); 1910 1911 if (op_left == O_index) 1912 { 1913 if (*input_line_pointer != ']') 1914 as_bad ("missing right bracket"); 1915 else 1916 { 1917 ++input_line_pointer; 1918 SKIP_WHITESPACE (); 1919 } 1920 } 1921 1922 op_right = operatorf (&op_chars); 1923 1924 know (op_right == O_illegal || op_left == O_index 1925 || op_rank[op_right] <= op_rank[op_left]); 1926 know (op_left >= O_multiply); 1927 #ifndef md_operator 1928 know (op_left <= O_index); 1929 #else 1930 know (op_left < O_max); 1931 #endif 1932 1933 /* input_line_pointer->after right-hand quantity. */ 1934 /* left-hand quantity in resultP. */ 1935 /* right-hand quantity in right. */ 1936 /* operator in op_left. */ 1937 1938 if (resultP->X_op == O_big) 1939 { 1940 if (resultP->X_add_number > 0) 1941 as_warn (_("left operand is a bignum; integer 0 assumed")); 1942 else 1943 as_warn (_("left operand is a float; integer 0 assumed")); 1944 resultP->X_op = O_constant; 1945 resultP->X_add_number = 0; 1946 resultP->X_add_symbol = NULL; 1947 resultP->X_op_symbol = NULL; 1948 } 1949 if (right.X_op == O_big) 1950 { 1951 if (right.X_add_number > 0) 1952 as_warn (_("right operand is a bignum; integer 0 assumed")); 1953 else 1954 as_warn (_("right operand is a float; integer 0 assumed")); 1955 right.X_op = O_constant; 1956 right.X_add_number = 0; 1957 right.X_add_symbol = NULL; 1958 right.X_op_symbol = NULL; 1959 } 1960 1961 is_unsigned = resultP->X_unsigned && right.X_unsigned; 1962 1963 if (expr_defer_p (mode) 1964 && ((resultP->X_add_symbol != NULL 1965 && S_IS_FORWARD_REF (resultP->X_add_symbol)) 1966 || (right.X_add_symbol != NULL 1967 && S_IS_FORWARD_REF (right.X_add_symbol)))) 1968 goto general; 1969 1970 /* Optimize common cases. */ 1971 #ifdef md_optimize_expr 1972 if (md_optimize_expr (resultP, op_left, &right)) 1973 { 1974 /* Skip. */ 1975 is_unsigned = resultP->X_unsigned; 1976 } 1977 else 1978 #endif 1979 if (op_left == O_add && right.X_op == O_constant 1980 && (md_register_arithmetic || resultP->X_op != O_register)) 1981 { 1982 /* X + constant. */ 1983 add_to_result (resultP, right.X_add_number, right.X_extrabit); 1984 } 1985 /* This case comes up in PIC code. */ 1986 else if (op_left == O_subtract 1987 && right.X_op == O_symbol 1988 && resultP->X_op == O_symbol 1989 && retval == rightseg 1990 #ifdef md_allow_local_subtract 1991 && md_allow_local_subtract (resultP, & right, rightseg) 1992 #endif 1993 && ((SEG_NORMAL (rightseg) 1994 && !S_FORCE_RELOC (resultP->X_add_symbol, 0) 1995 && !S_FORCE_RELOC (right.X_add_symbol, 0)) 1996 || right.X_add_symbol == resultP->X_add_symbol) 1997 && frag_offset_fixed_p (symbol_get_frag (resultP->X_add_symbol), 1998 symbol_get_frag (right.X_add_symbol), 1999 &frag_off)) 2000 { 2001 offsetT symval_diff = (S_GET_VALUE (resultP->X_add_symbol) 2002 - S_GET_VALUE (right.X_add_symbol)); 2003 subtract_from_result (resultP, right.X_add_number, right.X_extrabit); 2004 subtract_from_result (resultP, frag_off / OCTETS_PER_BYTE, 0); 2005 add_to_result (resultP, symval_diff, symval_diff < 0); 2006 resultP->X_op = O_constant; 2007 resultP->X_add_symbol = 0; 2008 is_unsigned = false; 2009 } 2010 else if (op_left == O_subtract && right.X_op == O_constant 2011 && (md_register_arithmetic || resultP->X_op != O_register)) 2012 { 2013 /* X - constant. */ 2014 subtract_from_result (resultP, right.X_add_number, right.X_extrabit); 2015 is_unsigned = false; 2016 } 2017 else if (op_left == O_add && resultP->X_op == O_constant 2018 && (md_register_arithmetic || right.X_op != O_register)) 2019 { 2020 /* Constant + X. */ 2021 resultP->X_op = right.X_op; 2022 resultP->X_add_symbol = right.X_add_symbol; 2023 resultP->X_op_symbol = right.X_op_symbol; 2024 add_to_result (resultP, right.X_add_number, right.X_extrabit); 2025 retval = rightseg; 2026 } 2027 else if (resultP->X_op == O_constant && right.X_op == O_constant) 2028 { 2029 /* Constant OP constant. */ 2030 offsetT v = right.X_add_number; 2031 if (v == 0 && (op_left == O_divide || op_left == O_modulus)) 2032 { 2033 as_warn (_("division by zero")); 2034 v = 1; 2035 } 2036 switch (op_left) 2037 { 2038 default: goto general; 2039 case O_multiply: 2040 /* Do the multiply as unsigned to silence ubsan. The 2041 result is of course the same when we throw away high 2042 bits of the result. */ 2043 resultP->X_add_number *= (valueT) v; 2044 break; 2045 2046 case O_divide: 2047 if (v == 1) 2048 break; 2049 if (v == -1) 2050 { 2051 /* Dividing the largest negative value representable in offsetT 2052 by -1 has a non-representable result in common binary 2053 notation. Treat it as negation instead, carried out as an 2054 unsigned operation to avoid UB. */ 2055 resultP->X_add_number = - (valueT) resultP->X_add_number; 2056 } 2057 else 2058 resultP->X_add_number /= v; 2059 break; 2060 2061 case O_modulus: 2062 /* See above for why in particular -1 needs special casing. 2063 While the operation is UB in C, mathematically it has a well- 2064 defined result. */ 2065 if (v == 1 || v == -1) 2066 resultP->X_add_number = 0; 2067 else 2068 resultP->X_add_number %= v; 2069 break; 2070 2071 case O_left_shift: 2072 case O_right_shift: 2073 /* We always use unsigned shifts. According to the ISO 2074 C standard, left shift of a signed type having a 2075 negative value is undefined behaviour, and right 2076 shift of a signed type having negative value is 2077 implementation defined. Left shift of a signed type 2078 when the result overflows is also undefined 2079 behaviour. So don't trigger ubsan warnings or rely 2080 on characteristics of the compiler. */ 2081 if ((valueT) v >= sizeof (valueT) * CHAR_BIT) 2082 { 2083 as_warn_value_out_of_range (_("shift count"), v, 0, 2084 sizeof (valueT) * CHAR_BIT - 1, 2085 NULL, 0); 2086 resultP->X_add_number = 0; 2087 } 2088 else if (op_left == O_left_shift) 2089 resultP->X_add_number 2090 = (valueT) resultP->X_add_number << (valueT) v; 2091 else 2092 resultP->X_add_number 2093 = (valueT) resultP->X_add_number >> (valueT) v; 2094 is_unsigned = resultP->X_unsigned; 2095 break; 2096 case O_bit_inclusive_or: resultP->X_add_number |= v; break; 2097 case O_bit_or_not: resultP->X_add_number |= ~v; break; 2098 case O_bit_exclusive_or: resultP->X_add_number ^= v; break; 2099 case O_bit_and: resultP->X_add_number &= v; break; 2100 /* Constant + constant (O_add) is handled by the 2101 previous if statement for constant + X, so is omitted 2102 here. */ 2103 case O_subtract: 2104 subtract_from_result (resultP, v, 0); 2105 is_unsigned = false; 2106 break; 2107 case O_eq: 2108 resultP->X_add_number = 2109 resultP->X_add_number == v ? ~ (offsetT) 0 : 0; 2110 is_unsigned = false; 2111 break; 2112 case O_ne: 2113 resultP->X_add_number = 2114 resultP->X_add_number != v ? ~ (offsetT) 0 : 0; 2115 is_unsigned = false; 2116 break; 2117 case O_lt: 2118 resultP->X_add_number = 2119 resultP->X_add_number < v ? ~ (offsetT) 0 : 0; 2120 is_unsigned = false; 2121 break; 2122 case O_le: 2123 resultP->X_add_number = 2124 resultP->X_add_number <= v ? ~ (offsetT) 0 : 0; 2125 is_unsigned = false; 2126 break; 2127 case O_ge: 2128 resultP->X_add_number = 2129 resultP->X_add_number >= v ? ~ (offsetT) 0 : 0; 2130 is_unsigned = false; 2131 break; 2132 case O_gt: 2133 resultP->X_add_number = 2134 resultP->X_add_number > v ? ~ (offsetT) 0 : 0; 2135 is_unsigned = false; 2136 break; 2137 case O_logical_and: 2138 resultP->X_add_number = resultP->X_add_number && v; 2139 is_unsigned = true; 2140 break; 2141 case O_logical_or: 2142 resultP->X_add_number = resultP->X_add_number || v; 2143 is_unsigned = true; 2144 break; 2145 } 2146 } 2147 else if (resultP->X_op == O_symbol 2148 && right.X_op == O_symbol 2149 && (op_left == O_add 2150 || op_left == O_subtract 2151 || (resultP->X_add_number == 0 2152 && right.X_add_number == 0))) 2153 { 2154 /* Symbol OP symbol. */ 2155 resultP->X_op = op_left; 2156 resultP->X_op_symbol = right.X_add_symbol; 2157 if (op_left == O_add) 2158 add_to_result (resultP, right.X_add_number, right.X_extrabit); 2159 else if (op_left == O_subtract) 2160 { 2161 subtract_from_result (resultP, right.X_add_number, 2162 right.X_extrabit); 2163 if (retval == rightseg 2164 && SEG_NORMAL (retval) 2165 && !S_FORCE_RELOC (resultP->X_add_symbol, 0) 2166 && !S_FORCE_RELOC (right.X_add_symbol, 0)) 2167 { 2168 retval = absolute_section; 2169 rightseg = absolute_section; 2170 } 2171 } 2172 } 2173 else 2174 { 2175 general: 2176 /* The general case. */ 2177 resultP->X_add_symbol = make_expr_symbol (resultP); 2178 resultP->X_op_symbol = make_expr_symbol (&right); 2179 resultP->X_op = op_left; 2180 resultP->X_add_number = 0; 2181 resultP->X_extrabit = 0; 2182 } 2183 2184 resultP->X_unsigned = is_unsigned; 2185 2186 if (retval != rightseg) 2187 { 2188 if (retval == undefined_section) 2189 ; 2190 else if (rightseg == undefined_section) 2191 retval = rightseg; 2192 else if (retval == expr_section) 2193 ; 2194 else if (rightseg == expr_section) 2195 retval = rightseg; 2196 else if (retval == reg_section) 2197 ; 2198 else if (rightseg == reg_section) 2199 retval = rightseg; 2200 else if (rightseg == absolute_section) 2201 ; 2202 else if (retval == absolute_section) 2203 retval = rightseg; 2204 #ifdef DIFF_EXPR_OK 2205 else if (op_left == O_subtract) 2206 ; 2207 #endif 2208 else 2209 as_bad (_("operation combines symbols in different segments")); 2210 } 2211 2212 op_left = op_right; 2213 } /* While next operator is >= this rank. */ 2214 2215 /* The PA port needs this information. */ 2216 if (resultP->X_add_symbol) 2217 symbol_mark_used (resultP->X_add_symbol); 2218 2219 if (rank == 0 && mode == expr_evaluate) 2220 resolve_expression (resultP); 2221 2222 return resultP->X_op == O_constant ? absolute_section : retval; 2223 } 2224 2225 /* Resolve an expression without changing any symbols/sub-expressions 2226 used. */ 2227 2228 int 2229 resolve_expression (expressionS *expressionP) 2230 { 2231 /* Help out with CSE. */ 2232 valueT final_val = expressionP->X_add_number; 2233 symbolS *add_symbol = expressionP->X_add_symbol; 2234 symbolS *orig_add_symbol = add_symbol; 2235 symbolS *op_symbol = expressionP->X_op_symbol; 2236 operatorT op = expressionP->X_op; 2237 valueT left, right; 2238 segT seg_left, seg_right; 2239 fragS *frag_left, *frag_right; 2240 offsetT frag_off; 2241 2242 switch (op) 2243 { 2244 default: 2245 return 0; 2246 2247 case O_constant: 2248 case O_register: 2249 left = 0; 2250 break; 2251 2252 case O_symbol: 2253 case O_symbol_rva: 2254 if (!snapshot_symbol (&add_symbol, &left, &seg_left, &frag_left)) 2255 return 0; 2256 2257 break; 2258 2259 case O_uminus: 2260 case O_bit_not: 2261 case O_logical_not: 2262 if (!snapshot_symbol (&add_symbol, &left, &seg_left, &frag_left)) 2263 return 0; 2264 2265 if (seg_left != absolute_section) 2266 return 0; 2267 2268 if (op == O_logical_not) 2269 left = !left; 2270 else if (op == O_uminus) 2271 left = -left; 2272 else 2273 left = ~left; 2274 op = O_constant; 2275 break; 2276 2277 case O_multiply: 2278 case O_divide: 2279 case O_modulus: 2280 case O_left_shift: 2281 case O_right_shift: 2282 case O_bit_inclusive_or: 2283 case O_bit_or_not: 2284 case O_bit_exclusive_or: 2285 case O_bit_and: 2286 case O_add: 2287 case O_subtract: 2288 case O_eq: 2289 case O_ne: 2290 case O_lt: 2291 case O_le: 2292 case O_ge: 2293 case O_gt: 2294 case O_logical_and: 2295 case O_logical_or: 2296 if (!snapshot_symbol (&add_symbol, &left, &seg_left, &frag_left) 2297 || !snapshot_symbol (&op_symbol, &right, &seg_right, &frag_right)) 2298 return 0; 2299 2300 /* Simplify addition or subtraction of a constant by folding the 2301 constant into X_add_number. */ 2302 if (op == O_add) 2303 { 2304 if (seg_right == absolute_section) 2305 { 2306 final_val += right; 2307 op = O_symbol; 2308 break; 2309 } 2310 else if (seg_left == absolute_section) 2311 { 2312 final_val += left; 2313 left = right; 2314 seg_left = seg_right; 2315 add_symbol = op_symbol; 2316 orig_add_symbol = expressionP->X_op_symbol; 2317 op = O_symbol; 2318 break; 2319 } 2320 } 2321 else if (op == O_subtract) 2322 { 2323 if (seg_right == absolute_section) 2324 { 2325 final_val -= right; 2326 op = O_symbol; 2327 break; 2328 } 2329 } 2330 2331 /* Equality and non-equality tests are permitted on anything. 2332 Subtraction, and other comparison operators are permitted if 2333 both operands are in the same section. 2334 Shifts by constant zero are permitted on anything. 2335 Multiplies, bit-ors, and bit-ands with constant zero are 2336 permitted on anything. 2337 Multiplies and divides by constant one are permitted on 2338 anything. 2339 Binary operations with both operands being the same register 2340 or undefined symbol are permitted if the result doesn't depend 2341 on the input value. 2342 Otherwise, both operands must be absolute. We already handled 2343 the case of addition or subtraction of a constant above. */ 2344 frag_off = 0; 2345 if (!(seg_left == absolute_section 2346 && seg_right == absolute_section) 2347 && !(op == O_eq || op == O_ne) 2348 && !((op == O_subtract 2349 || op == O_lt || op == O_le || op == O_ge || op == O_gt) 2350 && seg_left == seg_right 2351 && (finalize_syms 2352 || frag_offset_fixed_p (frag_left, frag_right, &frag_off) 2353 || (op == O_gt 2354 && frag_gtoffset_p (left, frag_left, 2355 right, frag_right, &frag_off))) 2356 && (seg_left != reg_section || left == right) 2357 && (seg_left != undefined_section || add_symbol == op_symbol))) 2358 { 2359 if ((seg_left == absolute_section && left == 0) 2360 || (seg_right == absolute_section && right == 0)) 2361 { 2362 if (op == O_bit_exclusive_or || op == O_bit_inclusive_or) 2363 { 2364 if (!(seg_right == absolute_section && right == 0)) 2365 { 2366 seg_left = seg_right; 2367 left = right; 2368 add_symbol = op_symbol; 2369 orig_add_symbol = expressionP->X_op_symbol; 2370 } 2371 op = O_symbol; 2372 break; 2373 } 2374 else if (op == O_left_shift || op == O_right_shift) 2375 { 2376 if (!(seg_left == absolute_section && left == 0)) 2377 { 2378 op = O_symbol; 2379 break; 2380 } 2381 } 2382 else if (op != O_multiply 2383 && op != O_bit_or_not && op != O_bit_and) 2384 return 0; 2385 } 2386 else if (op == O_multiply 2387 && seg_left == absolute_section && left == 1) 2388 { 2389 seg_left = seg_right; 2390 left = right; 2391 add_symbol = op_symbol; 2392 orig_add_symbol = expressionP->X_op_symbol; 2393 op = O_symbol; 2394 break; 2395 } 2396 else if ((op == O_multiply || op == O_divide) 2397 && seg_right == absolute_section && right == 1) 2398 { 2399 op = O_symbol; 2400 break; 2401 } 2402 else if (!(left == right 2403 && ((seg_left == reg_section && seg_right == reg_section) 2404 || (seg_left == undefined_section 2405 && seg_right == undefined_section 2406 && add_symbol == op_symbol)))) 2407 return 0; 2408 else if (op == O_bit_and || op == O_bit_inclusive_or) 2409 { 2410 op = O_symbol; 2411 break; 2412 } 2413 else if (op != O_bit_exclusive_or && op != O_bit_or_not) 2414 return 0; 2415 } 2416 2417 right += frag_off / OCTETS_PER_BYTE; 2418 switch (op) 2419 { 2420 case O_add: left += right; break; 2421 case O_subtract: left -= right; break; 2422 case O_multiply: left *= right; break; 2423 case O_divide: 2424 if (right == 0) 2425 return 0; 2426 /* See expr() for reasons of the special casing. */ 2427 if (right == 1) 2428 break; 2429 if ((offsetT) right == -1) 2430 left = -left; 2431 else 2432 left = (offsetT) left / (offsetT) right; 2433 break; 2434 case O_modulus: 2435 if (right == 0) 2436 return 0; 2437 /* Again, see expr() for reasons of the special casing. */ 2438 if (right == 1 || (offsetT) right == -1) 2439 left = 0; 2440 else 2441 left = (offsetT) left % (offsetT) right; 2442 break; 2443 case O_left_shift: 2444 if (right >= sizeof (left) * CHAR_BIT) 2445 left = 0; 2446 else 2447 left <<= right; 2448 break; 2449 case O_right_shift: 2450 if (right >= sizeof (left) * CHAR_BIT) 2451 left = 0; 2452 else 2453 left >>= right; 2454 break; 2455 case O_bit_inclusive_or: left |= right; break; 2456 case O_bit_or_not: left |= ~right; break; 2457 case O_bit_exclusive_or: left ^= right; break; 2458 case O_bit_and: left &= right; break; 2459 case O_eq: 2460 case O_ne: 2461 left = (left == right 2462 && seg_left == seg_right 2463 && (finalize_syms || frag_left == frag_right) 2464 && (seg_left != undefined_section 2465 || add_symbol == op_symbol) 2466 ? ~ (valueT) 0 : 0); 2467 if (op == O_ne) 2468 left = ~left; 2469 break; 2470 case O_lt: 2471 left = (offsetT) left < (offsetT) right ? ~ (valueT) 0 : 0; 2472 break; 2473 case O_le: 2474 left = (offsetT) left <= (offsetT) right ? ~ (valueT) 0 : 0; 2475 break; 2476 case O_ge: 2477 left = (offsetT) left >= (offsetT) right ? ~ (valueT) 0 : 0; 2478 break; 2479 case O_gt: 2480 left = (offsetT) left > (offsetT) right ? ~ (valueT) 0 : 0; 2481 break; 2482 case O_logical_and: left = left && right; break; 2483 case O_logical_or: left = left || right; break; 2484 default: abort (); 2485 } 2486 2487 op = O_constant; 2488 break; 2489 } 2490 2491 if (op == O_symbol) 2492 { 2493 if (seg_left == absolute_section) 2494 op = O_constant; 2495 else if (seg_left == reg_section && final_val == 0) 2496 op = O_register; 2497 else if (!symbol_same_p (add_symbol, orig_add_symbol)) 2498 final_val += left; 2499 expressionP->X_add_symbol = add_symbol; 2500 } 2501 expressionP->X_op = op; 2502 2503 if (op == O_constant || op == O_register) 2504 final_val += left; 2505 expressionP->X_add_number = final_val; 2506 2507 return 1; 2508 } 2509 2510 /* "Look through" register equates. */ 2511 void resolve_register (expressionS *expP) 2512 { 2513 symbolS *sym; 2514 offsetT acc = 0; 2515 const expressionS *e = expP; 2516 2517 if (expP->X_op != O_symbol) 2518 return; 2519 2520 do 2521 { 2522 if (!md_register_arithmetic && e->X_add_number) 2523 break; 2524 sym = e->X_add_symbol; 2525 acc += e->X_add_number; 2526 e = symbol_get_value_expression (sym); 2527 } 2528 while (symbol_equated_p (sym)); 2529 2530 if (e->X_op == O_register) 2531 { 2532 expr_copy (expP, e); 2533 expP->X_add_number += acc; 2534 } 2535 } 2536 2537 /* This lives here because it belongs equally in expr.c & read.c. 2539 expr.c is just a branch office read.c anyway, and putting it 2540 here lessens the crowd at read.c. 2541 2542 Assume input_line_pointer is at start of symbol name, or the 2543 start of a double quote enclosed symbol name. Advance 2544 input_line_pointer past symbol name. Turn that character into a '\0', 2545 returning its former value, which may be the closing double quote. 2546 2547 This allows a string compare (RMS wants symbol names to be strings) 2548 of the symbol name. 2549 2550 NOTE: The input buffer is further altered when adjacent strings are 2551 concatenated by the function. Callers caring about the original buffer 2552 contents will need to make a copy before calling here. 2553 2554 There will always be a char following symbol name, because all good 2555 lines end in end-of-line. */ 2556 2557 char 2558 get_symbol_name (char ** ilp_return) 2559 { 2560 char c; 2561 2562 * ilp_return = input_line_pointer; 2563 /* We accept FAKE_LABEL_CHAR in a name in case this is being called with a 2564 constructed string. */ 2565 if (is_name_beginner (c = *input_line_pointer++) 2566 || (input_from_string && c == FAKE_LABEL_CHAR)) 2567 { 2568 while (is_part_of_name (c = *input_line_pointer++) 2569 || (input_from_string && c == FAKE_LABEL_CHAR)) 2570 ; 2571 if (is_name_ender (c)) 2572 c = *input_line_pointer++; 2573 } 2574 else if (c == '"') 2575 { 2576 char *dst = input_line_pointer; 2577 2578 * ilp_return = input_line_pointer; 2579 for (;;) 2580 { 2581 c = *input_line_pointer++; 2582 2583 if (c == 0) 2584 { 2585 as_warn (_("missing closing '\"'")); 2586 break; 2587 } 2588 2589 if (c == '"') 2590 { 2591 char *ilp_save = input_line_pointer; 2592 2593 SKIP_WHITESPACE (); 2594 if (*input_line_pointer == '"') 2595 { 2596 ++input_line_pointer; 2597 continue; 2598 } 2599 input_line_pointer = ilp_save; 2600 break; 2601 } 2602 2603 if (c == '\\') 2604 switch (*input_line_pointer) 2605 { 2606 case '"': 2607 case '\\': 2608 c = *input_line_pointer++; 2609 break; 2610 2611 default: 2612 if (c != 0) 2613 as_warn (_("'\\%c' in quoted symbol name; " 2614 "behavior may change in the future"), 2615 *input_line_pointer); 2616 break; 2617 } 2618 2619 *dst++ = c; 2620 } 2621 *dst = 0; 2622 } 2623 *--input_line_pointer = 0; 2624 return c; 2625 } 2626 2627 /* Replace the NUL character pointed to by input_line_pointer 2628 with C. If C is \" then advance past it. Return the character 2629 now pointed to by input_line_pointer. */ 2630 2631 char 2632 restore_line_pointer (char c) 2633 { 2634 * input_line_pointer = c; 2635 if (c == '"') 2636 c = * ++ input_line_pointer; 2637 return c; 2638 } 2639 2640 unsigned int 2641 get_single_number (void) 2642 { 2643 expressionS exp; 2644 operand (&exp, expr_normal); 2645 return exp.X_add_number; 2646 } 2647