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