Coverage Report

Created: 2026-07-12 09:22

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