Coverage Report

Created: 2026-10-02 09:53

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
4
#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
49.6k
{
59
49.6k
  symbolS *symbolP;
60
49.6k
  struct expr_symbol_line *n;
61
62
49.6k
  if (expressionP->X_op == O_symbol
63
23.6k
      && expressionP->X_add_number == 0)
64
23.6k
    return expressionP->X_add_symbol;
65
66
26.0k
  if (expressionP->X_op == O_big)
67
67
    {
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
67
      if (expressionP->X_add_number > 0)
72
1
  as_bad (_("bignum invalid"));
73
66
      else
74
66
  as_bad (_("floating point number invalid"));
75
67
      expressionP = &zero;
76
67
    }
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
26.0k
  symbolP = symbol_create (FAKE_LABEL_NAME,
83
26.0k
         (expressionP->X_op == O_constant
84
26.0k
          ? absolute_section
85
26.0k
          : expressionP->X_op == O_register
86
14.4k
            ? reg_section
87
14.4k
            : expr_section),
88
26.0k
         &zero_address_frag, 0);
89
26.0k
  symbol_set_value_expression (symbolP, expressionP);
90
91
26.0k
  if (expressionP->X_op == O_constant)
92
11.6k
    resolve_symbol_value (symbolP);
93
94
26.0k
  n = notes_alloc (sizeof (*n));
95
26.0k
  n->sym = symbolP;
96
26.0k
  n->file = as_where (&n->line);
97
26.0k
  n->next = expr_symbol_lines;
98
26.0k
  expr_symbol_lines = n;
99
100
26.0k
  return symbolP;
101
49.6k
}
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
13
{
133
13
  char *buf = concat (start ? ".startof." : ".sizeof.", name, (char *) NULL);
134
13
  symbolS *symbolP;
135
13
  unsigned int i;
136
137
38
  for (i = 0; i < nr_seen[start]; ++i)
138
33
    {
139
33
    symbolP = seen[start][i];
140
141
33
    if (! symbolP)
142
4
      break;
143
144
29
    name = S_GET_NAME (symbolP);
145
29
    if ((symbols_case_sensitive
146
29
   ? strcmp (buf, name)
147
29
   : strcasecmp (buf, name)) == 0)
148
4
      {
149
4
  free (buf);
150
4
  return symbolP;
151
4
      }
152
29
    }
153
154
9
  symbolP = symbol_make (buf);
155
9
  free (buf);
156
157
9
  if (i >= nr_seen[start])
158
5
    {
159
5
      unsigned int nr = (i + 1) * 2;
160
161
5
      seen[start] = XRESIZEVEC (symbolS *, seen[start], nr);
162
5
      nr_seen[start] = nr;
163
5
      memset (&seen[start][i + 1], 0, (nr - i - 1) * sizeof(seen[0][0]));
164
5
    }
165
166
9
  seen[start][i] = symbolP;
167
168
9
  return symbolP;
169
13
}
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
120
{
216
  /* input_line_pointer -> floating-point constant.  */
217
120
  int error_code;
218
219
120
  error_code = atof_generic (&input_line_pointer, ".", EXP_CHARS,
220
120
           &generic_floating_point_number);
221
222
120
  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
120
  expressionP->X_op = O_big;
235
  /* input_line_pointer -> just after constant, which may point to
236
     whitespace.  */
237
120
  expressionP->X_add_number = -1;
238
120
}
239
240
uint32_t
241
generic_bignum_to_int32 (void)
242
0
{
243
0
  return ((((uint32_t) generic_bignum[1] & LITTLENUM_MASK)
244
0
     << LITTLENUM_NUMBER_OF_BITS)
245
0
    | ((uint32_t) generic_bignum[0] & LITTLENUM_MASK));
246
0
}
247
248
uint64_t
249
generic_bignum_to_int64 (void)
250
20
{
251
20
  return ((((((((uint64_t) generic_bignum[3] & LITTLENUM_MASK)
252
20
         << LITTLENUM_NUMBER_OF_BITS)
253
20
        | ((uint64_t) generic_bignum[2] & LITTLENUM_MASK))
254
20
       << LITTLENUM_NUMBER_OF_BITS)
255
20
      | ((uint64_t) generic_bignum[1] & LITTLENUM_MASK))
256
20
     << LITTLENUM_NUMBER_OF_BITS)
257
20
    | ((uint64_t) generic_bignum[0] & LITTLENUM_MASK));
258
20
}
259
260
static void
261
integer_constant (int radix, expressionS *expressionP)
262
48.0k
{
263
48.0k
  char *start;    /* Start of number.  */
264
48.0k
  char *suffix = NULL;
265
48.0k
  char c;
266
48.0k
  valueT number;  /* Offset or (absolute) value.  */
267
48.0k
  short int digit;  /* Value of next digit in current radix.  */
268
48.0k
  int too_many_digits = 0;  /* If we see >= this number of.  */
269
48.0k
  char *name;   /* Points to name of symbol.  */
270
48.0k
  symbolS *symbolP; /* Points to symbol.  */
271
272
48.0k
  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
48.0k
#ifdef BFD64
293
48.0k
#define valuesize 64
294
#else /* includes non-bfd case, mostly */
295
#define valuesize 32
296
#endif
297
298
48.0k
  if (is_end_of_stmt (*input_line_pointer))
299
6
    {
300
6
      expressionP->X_op = O_absent;
301
6
      return;
302
6
    }
303
304
48.0k
  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
48.0k
  switch (radix)
351
48.0k
    {
352
1
    case 2:
353
1
      too_many_digits = valuesize + 1;
354
1
      break;
355
426
    case 8:
356
426
      too_many_digits = (valuesize + 2) / 3 + 1;
357
426
      break;
358
352
    case 16:
359
352
      too_many_digits = (valuesize + 3) / 4 + 1;
360
352
      break;
361
47.2k
    case 10:
362
47.2k
      too_many_digits = (valuesize + 11) / 4; /* Very rough.  */
363
47.2k
      break;
364
48.0k
    }
365
48.0k
#undef valuesize
366
48.0k
  start = input_line_pointer;
367
48.0k
  c = *input_line_pointer++;
368
48.0k
  for (number = 0;
369
137k
       (digit = hex_value (c)) < radix;
370
89.2k
       c = *input_line_pointer++)
371
89.2k
    {
372
89.2k
      number = number * radix + digit;
373
89.2k
    }
374
  /* c contains character after number.  */
375
  /* input_line_pointer->char after c.  */
376
48.0k
  small = (input_line_pointer - start - 1) < too_many_digits;
377
378
48.0k
  if (radix == 16 && c == '_')
379
1
    {
380
      /* This is literal of the form 0x333_0_12345678_1.
381
   This example is equivalent to 0x00000333000000001234567800000001.  */
382
383
1
      int num_little_digits = 0;
384
1
      int i;
385
1
      input_line_pointer = start; /* -> 1st digit.  */
386
387
1
      know (LITTLENUM_NUMBER_OF_BITS == 16);
388
389
5
      for (c = '_'; c == '_'; num_little_digits += 2)
390
4
  {
391
392
    /* Convert one 64-bit word.  */
393
4
    int ndigit = 0;
394
4
    number = 0;
395
4
    for (c = *input_line_pointer++;
396
16
         (digit = hex_value (c)) < radix;
397
12
         c = *(input_line_pointer++))
398
12
      {
399
12
        number = number * radix + digit;
400
12
        ndigit++;
401
12
      }
402
403
    /* Check for 8 digit per word max.  */
404
4
    if (ndigit > 8)
405
0
      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
4
    know (LITTLENUM_NUMBER_OF_BITS == 16);
410
4
    for (i = min (num_little_digits + 1, SIZE_OF_LARGE_NUMBER - 1);
411
16
         i >= 2;
412
12
         i--)
413
12
      generic_bignum[i] = generic_bignum[i - 2];
414
415
    /* Add the new digits as the least significant new ones.  */
416
4
    generic_bignum[0] = number & 0xffffffff;
417
4
    generic_bignum[1] = number >> 16;
418
4
  }
419
420
      /* Again, c is char after number, input_line_pointer->after c.  */
421
422
1
      if (num_little_digits > SIZE_OF_LARGE_NUMBER - 1)
423
0
  num_little_digits = SIZE_OF_LARGE_NUMBER - 1;
424
425
1
      gas_assert (num_little_digits >= 4);
426
427
1
      if (num_little_digits != 8)
428
0
  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
3
      while (generic_bignum[num_little_digits - 1] == 0
433
2
       && num_little_digits > 1)
434
2
  num_little_digits--;
435
436
1
      if (num_little_digits <= 2)
437
0
  {
438
    /* will fit into 32 bits.  */
439
0
    number = generic_bignum_to_int32 ();
440
0
    small = 1;
441
0
  }
442
1
#ifdef BFD64
443
1
      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
1
#endif
450
1
      else
451
1
  {
452
1
    small = 0;
453
454
    /* Number of littlenums in the bignum.  */
455
1
    number = num_little_digits;
456
1
  }
457
1
    }
458
48.0k
  else if (!small)
459
53
    {
460
      /* We saw a lot of digits. manufacture a bignum the hard way.  */
461
53
      LITTLENUM_TYPE *leader; /* -> high order littlenum of the bignum.  */
462
53
      LITTLENUM_TYPE *pointer;  /* -> littlenum we are frobbing now.  */
463
53
      long carry;
464
465
53
      leader = generic_bignum;
466
53
      generic_bignum[0] = 0;
467
53
      generic_bignum[1] = 0;
468
53
      generic_bignum[2] = 0;
469
53
      generic_bignum[3] = 0;
470
53
      input_line_pointer = start; /* -> 1st digit.  */
471
53
      c = *input_line_pointer++;
472
2.01k
      for (; (carry = hex_value (c)) < radix; c = *input_line_pointer++)
473
1.95k
  {
474
16.3k
    for (pointer = generic_bignum; pointer <= leader; pointer++)
475
14.3k
      {
476
14.3k
        long work;
477
478
14.3k
        work = carry + radix * *pointer;
479
14.3k
        *pointer = work & LITTLENUM_MASK;
480
14.3k
        carry = work >> LITTLENUM_NUMBER_OF_BITS;
481
14.3k
      }
482
1.95k
    if (carry)
483
523
      {
484
523
        if (leader < generic_bignum + SIZE_OF_LARGE_NUMBER - 1)
485
315
    {
486
      /* Room to grow a longer bignum.  */
487
315
      *++leader = carry;
488
315
    }
489
523
      }
490
1.95k
  }
491
      /* Again, c is char after number.  */
492
      /* input_line_pointer -> after c.  */
493
53
      know (LITTLENUM_NUMBER_OF_BITS == 16);
494
53
      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
53
#ifdef BFD64
501
53
      else if (leader < generic_bignum + 4)
502
20
  {
503
    /* Will fit into 64 bits.  */
504
20
    number = generic_bignum_to_int64 ();
505
20
    small = 1;
506
20
  }
507
33
#endif
508
33
      else
509
33
  {
510
    /* Number of littlenums in the bignum.  */
511
33
    number = leader - generic_bignum + 1;
512
33
  }
513
53
    }
514
515
48.0k
  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
48.0k
#ifndef tc_allow_U_suffix
521
144k
#define tc_allow_U_suffix 1
522
48.0k
#endif
523
48.0k
  bool u_seen = !tc_allow_U_suffix;
524
  /* PR 19910: Look for, and ignore, a U suffix to the number.  */
525
48.0k
  if (!u_seen && (c == 'U' || c == 'u'))
526
2
    {
527
2
      c = *input_line_pointer++;
528
2
      u_seen = true;
529
2
    }
530
531
48.0k
#ifndef tc_allow_L_suffix
532
240k
#define tc_allow_L_suffix 1
533
48.0k
#endif
534
48.0k
  bool l_seen = !tc_allow_L_suffix;
535
  /* PR 20732: Look for, and ignore, a L or LL suffix to the number.  */
536
48.0k
  if (tc_allow_L_suffix && (c == 'L' || c == 'l'))
537
12
    {
538
12
      c = * input_line_pointer++;
539
12
      l_seen = true;
540
12
      if (c == 'L' || c == 'l')
541
0
  c = *input_line_pointer++;
542
12
      if (!u_seen && (c == 'U' || c == 'u'))
543
4
  c = *input_line_pointer++;
544
12
    }
545
546
48.0k
  if (small)
547
47.9k
    {
548
      /* Here with number, in correct radix. c is the next char.  */
549
47.9k
      bool maybe_label = suffix == NULL
550
47.9k
       && (!tc_allow_U_suffix || !u_seen)
551
47.9k
       && (!tc_allow_L_suffix || !l_seen)
552
47.9k
       && (radix == 10 ||
553
776
           (radix == 8 && input_line_pointer == start + 1));
554
555
47.9k
      if (LOCAL_LABELS_FB && c == 'b' && maybe_label)
556
0
  {
557
    /* Backward ref to local label.
558
       Because it is backward, expect it to be defined.  */
559
    /* Construct a local label.  */
560
0
    name = fb_label_name (number, 0);
561
562
    /* Seen before, or symbol is defined: OK.  */
563
0
    symbolP = symbol_find (name);
564
0
    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
0
    else
570
0
      {
571
        /* Either not seen or not defined.  */
572
        /* @@ Should print out the original string instead of
573
     the parsed number.  */
574
0
        as_bad (_("backward ref to unknown label \"%d:\""),
575
0
          (int) number);
576
0
        expressionP->X_op = O_constant;
577
0
      }
578
579
0
    expressionP->X_add_number = 0;
580
0
  }      /* case 'b' */
581
47.9k
      else if (LOCAL_LABELS_FB && c == 'f' && maybe_label)
582
17
  {
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
17
    name = fb_label_name (number, 1);
591
17
    symbolP = symbol_find_or_make (name);
592
    /* We have no need to check symbol properties.  */
593
17
    expressionP->X_op = O_symbol;
594
17
    expressionP->X_add_symbol = symbolP;
595
17
    expressionP->X_add_number = 0;
596
17
  }      /* case 'f' */
597
47.9k
      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
47.9k
      else
621
47.9k
  {
622
47.9k
    expressionP->X_op = O_constant;
623
47.9k
    expressionP->X_add_number = number;
624
47.9k
    input_line_pointer--; /* Restore following character.  */
625
47.9k
  }      /* Really just a number.  */
626
47.9k
    }
627
34
  else
628
34
    {
629
      /* Not a small number.  */
630
34
      expressionP->X_op = O_big;
631
34
      expressionP->X_add_number = number; /* Number of littlenums.  */
632
34
      expressionP->X_unsigned = 1;
633
34
      input_line_pointer--; /* -> char following number.  */
634
34
    }
635
48.0k
}
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
5.55k
{
732
5.55k
  if (now_seg == absolute_section)
733
435
    {
734
435
      expressionp->X_op = O_constant;
735
435
      expressionp->X_add_number = abs_section_offset;
736
435
    }
737
5.11k
  else
738
5.11k
    {
739
5.11k
      expressionp->X_op = O_symbol;
740
5.11k
      if (mode != expr_defer_incl_dot)
741
5.11k
  {
742
5.11k
    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
5.11k
  }
747
0
      else
748
0
    expressionp->X_add_symbol = &dot_symbol;
749
5.11k
      expressionp->X_add_number = 0;
750
5.11k
    }
751
5.55k
}
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
2.46k
{
775
2.46k
  unsigned short md = dst->X_md;
776
777
2.46k
  *dst = *src;
778
2.46k
  dst->X_md = md;
779
2.46k
}
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
170k
{
795
170k
  char c;
796
170k
  symbolS *symbolP; /* Points to symbol.  */
797
170k
  char *name;   /* Points to name of symbol.  */
798
170k
  segT segment;
799
170k
  operatorT op = O_absent; /* For unary operators.  */
800
801
#ifdef md_expr_init
802
  md_expr_init (expressionP);
803
#else
804
170k
  memset (expressionP, 0, sizeof (*expressionP));
805
170k
#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
170k
  expressionP->X_unsigned = 1;        \
814
170k
815
  /* Digits, assume it is a bignum.  */
816
817
170k
  SKIP_WHITESPACE ();    /* Leading whitespace is part of operand.  */
818
170k
  c = *input_line_pointer++;  /* input_line_pointer -> past char in c.  */
819
820
170k
  if (is_end_of_stmt (c))
821
5.31k
    goto eol;
822
823
164k
  switch (c)
824
164k
    {
825
15.9k
    case '1':
826
24.6k
    case '2':
827
25.9k
    case '3':
828
27.9k
    case '4':
829
39.0k
    case '5':
830
39.6k
    case '6':
831
43.3k
    case '7':
832
46.8k
    case '8':
833
47.2k
    case '9':
834
47.2k
      input_line_pointer--;
835
836
47.2k
      integer_constant ((NUMBERS_WITH_SUFFIX || flag_m68k_mri)
837
47.2k
      ? 0 : 10,
838
47.2k
      expressionP);
839
47.2k
      break;
840
841
#ifdef LITERAL_PREFIXPERCENT_BIN
842
    case '%':
843
      integer_constant (2, expressionP);
844
      break;
845
#endif
846
847
2.95k
    case '0':
848
      /* Non-decimal radix.  */
849
850
2.95k
      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
2.95k
      c = *input_line_pointer;
865
2.95k
      switch (c)
866
2.95k
  {
867
0
  case 'o':
868
0
  case 'O':
869
0
  case 'q':
870
0
  case 'Q':
871
1
  case '8':
872
3
  case '9':
873
3
    if (NUMBERS_WITH_SUFFIX || flag_m68k_mri)
874
0
      {
875
0
        integer_constant (0, expressionP);
876
0
        break;
877
0
      }
878
    /* Fall through.  */
879
2.04k
  default:
880
2.05k
  default_case:
881
2.05k
    if (c && strchr (FLT_CHARS, c))
882
0
      {
883
0
        input_line_pointer++;
884
0
        floating_constant (expressionP);
885
0
        expressionP->X_add_number = - TOLOWER (c);
886
0
      }
887
2.05k
    else
888
2.05k
      {
889
        /* The string was only zero.  */
890
2.05k
        expressionP->X_op = O_constant;
891
2.05k
        expressionP->X_add_number = 0;
892
2.05k
      }
893
894
2.05k
    break;
895
896
357
  case 'x':
897
358
  case 'X':
898
358
    if (flag_m68k_mri)
899
0
      goto default_case;
900
358
    input_line_pointer++;
901
358
    integer_constant (16, expressionP);
902
358
    break;
903
904
1
  case 'b':
905
1
    if (LOCAL_LABELS_FB && !flag_m68k_mri
906
1
        && input_line_pointer[1] != '0'
907
1
        && input_line_pointer[1] != '1')
908
0
      {
909
        /* Parse this as a back reference to label 0.  */
910
0
        input_line_pointer--;
911
0
        integer_constant (10, expressionP);
912
0
        break;
913
0
      }
914
    /* Otherwise, parse this as a binary number.  */
915
    /* Fall through.  */
916
1
  case 'B':
917
1
    if (input_line_pointer[1] == '0'
918
1
        || input_line_pointer[1] == '1')
919
1
      {
920
1
        input_line_pointer++;
921
1
        integer_constant (2, expressionP);
922
1
        break;
923
1
      }
924
0
    if (flag_m68k_mri || NUMBERS_WITH_SUFFIX)
925
0
      input_line_pointer++;
926
0
    goto default_case;
927
928
0
  case 'l':
929
0
  case 'L':
930
    /* Accept an L suffix to the zero.  */
931
0
    if (tc_allow_L_suffix)
932
0
      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
355
  case '0':
942
368
  case '1':
943
368
  case '2':
944
370
  case '3':
945
398
  case '4':
946
399
  case '5':
947
416
  case '6':
948
426
  case '7':
949
426
  numeric:
950
426
    integer_constant ((flag_m68k_mri || NUMBERS_WITH_SUFFIX)
951
426
          ? 0 : 8,
952
426
          expressionP);
953
426
    break;
954
955
35
  case 'f':
956
35
    if (LOCAL_LABELS_FB)
957
35
      {
958
35
        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
35
        if (!is_end_of_stmt (input_line_pointer[1])
964
35
      && strchr (FLT_CHARS, 'f') != NULL)
965
35
    {
966
35
      char *cp = input_line_pointer + 1;
967
968
35
      atof_generic (&cp, ".", EXP_CHARS,
969
35
        &generic_floating_point_number);
970
971
      /* Was nothing parsed, or does it look like an
972
         expression?  */
973
35
      is_label = (cp == input_line_pointer + 1
974
34
            || (cp == input_line_pointer + 2
975
8
          && (cp[-1] == '-' || cp[-1] == '+'))
976
34
            || *cp == 'f'
977
34
            || *cp == 'b');
978
35
    }
979
35
        if (is_label)
980
1
    {
981
1
      input_line_pointer--;
982
1
      integer_constant (10, expressionP);
983
1
      break;
984
1
    }
985
35
      }
986
    /* Fall through.  */
987
988
34
  case 'd':
989
35
  case 'D':
990
35
    if (flag_m68k_mri || NUMBERS_WITH_SUFFIX)
991
0
      {
992
0
        integer_constant (0, expressionP);
993
0
        break;
994
0
      }
995
    /* Fall through.  */
996
44
  case 'F':
997
112
  case 'r':
998
112
  case 'e':
999
112
  case 'E':
1000
120
  case 'g':
1001
120
  case 'G':
1002
120
    input_line_pointer++;
1003
120
    floating_constant (expressionP);
1004
120
    expressionP->X_add_number = - TOLOWER (c);
1005
120
    break;
1006
1007
3
  case '$':
1008
3
    if (LOCAL_LABELS_DOLLAR)
1009
0
      {
1010
0
        integer_constant (10, expressionP);
1011
0
        break;
1012
0
      }
1013
3
    else
1014
3
      goto default_case;
1015
2.95k
  }
1016
1017
2.95k
      break;
1018
1019
2.95k
#ifndef NEED_INDEX_OPERATOR
1020
2.95k
    case '[':
1021
52
# ifdef md_need_index_operator
1022
52
      if (md_need_index_operator())
1023
31
  goto de_fault;
1024
21
# endif
1025
21
#endif
1026
      /* Fall through.  */
1027
731
    case '(':
1028
      /* Didn't begin with digit & not a name.  */
1029
731
      segment = expr (0, expressionP, mode);
1030
      /* expression () will pass trailing whitespace.  */
1031
731
      if ((c == '(' && *input_line_pointer != ')')
1032
21
    || (c == '[' && *input_line_pointer != ']'))
1033
731
  {
1034
731
    if (* input_line_pointer)
1035
677
      as_bad (_("found '%c', expected: '%c'"),
1036
677
        * input_line_pointer, c == '(' ? ')' : ']');
1037
54
    else
1038
54
      as_bad (_("missing '%c'"), c == '(' ? ')' : ']');
1039
731
  }      
1040
0
      else
1041
0
  input_line_pointer++;
1042
731
      SKIP_ALL_WHITESPACE ();
1043
      /* Here with input_line_pointer -> char after "(...)".  */
1044
731
      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
277
    case '\'':
1059
277
      if (! flag_m68k_mri)
1060
277
  {
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
277
    expressionP->X_op = O_constant;
1066
277
    expressionP->X_add_number = *input_line_pointer;
1067
277
    if (!is_end_of_stmt (*input_line_pointer))
1068
277
      input_line_pointer++;
1069
277
    break;
1070
277
  }
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
915
    case '~':
1083
      /* '~' is permitted to start a label on the Delta.  */
1084
915
      if (is_name_beginner (c))
1085
0
  goto isname;
1086
915
      op = O_bit_not;
1087
915
      goto unary;
1088
1089
365
    case '!':
1090
365
      op = O_logical_not;
1091
365
      goto unary;
1092
1093
18.0k
    case '-':
1094
18.0k
      op = O_uminus;
1095
      /* Fall through.  */
1096
19.6k
    case '+':
1097
19.6k
      {
1098
20.9k
      unary:
1099
20.9k
  operand (expressionP, mode);
1100
1101
20.9k
#ifdef md_optimize_expr
1102
20.9k
  if (md_optimize_expr (NULL, op, expressionP))
1103
0
  {
1104
    /* Skip.  */
1105
0
    ;
1106
0
  }
1107
20.9k
  else
1108
20.9k
#endif
1109
20.9k
  if (expressionP->X_op == O_constant)
1110
3.39k
    {
1111
      /* input_line_pointer -> char after operand.  */
1112
3.39k
      if (op == O_uminus)
1113
2.40k
        {
1114
2.40k
    expressionP->X_add_number
1115
2.40k
      = - (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
2.40k
    expressionP->X_unsigned = 0;
1120
2.40k
    if (expressionP->X_add_number)
1121
2.21k
      expressionP->X_extrabit ^= 1;
1122
2.40k
        }
1123
992
      else if (op == O_bit_not)
1124
413
        {
1125
413
    expressionP->X_add_number = ~ expressionP->X_add_number;
1126
413
    expressionP->X_extrabit ^= 1;
1127
413
    expressionP->X_unsigned = 0;
1128
413
        }
1129
579
      else if (op == O_logical_not)
1130
290
        {
1131
290
    expressionP->X_add_number = ! expressionP->X_add_number;
1132
290
    expressionP->X_unsigned = 1;
1133
290
    expressionP->X_extrabit = 0;
1134
290
        }
1135
3.39k
    }
1136
17.5k
  else if (expressionP->X_op == O_big
1137
140
     && expressionP->X_add_number <= 0
1138
133
     && op == O_uminus
1139
131
     && (generic_floating_point_number.sign == '+'
1140
65
         || generic_floating_point_number.sign == 'P'))
1141
66
    {
1142
      /* Negative flonum (eg, -1.000e0).  */
1143
66
      if (generic_floating_point_number.sign == '+')
1144
66
        generic_floating_point_number.sign = '-';
1145
0
      else
1146
0
        generic_floating_point_number.sign = 'N';
1147
66
    }
1148
17.4k
  else if (expressionP->X_op == O_big
1149
74
     && expressionP->X_add_number > 0)
1150
7
    {
1151
7
      int i;
1152
1153
7
      if (op == O_uminus || op == O_bit_not)
1154
6
        {
1155
45
    for (i = 0; i < expressionP->X_add_number; ++i)
1156
39
      generic_bignum[i] = ~generic_bignum[i];
1157
1158
    /* Extend the bignum to at least the size of .octa.  */
1159
6
    if (expressionP->X_add_number < SIZE_OF_LARGE_NUMBER)
1160
6
      {
1161
6
        expressionP->X_add_number = SIZE_OF_LARGE_NUMBER;
1162
87
        for (; i < expressionP->X_add_number; ++i)
1163
81
          generic_bignum[i] = ~(LITTLENUM_TYPE) 0;
1164
6
      }
1165
1166
6
    if (op == O_uminus)
1167
6
      for (i = 0; i < expressionP->X_add_number; ++i)
1168
6
        {
1169
6
          generic_bignum[i] += 1;
1170
6
          if (generic_bignum[i])
1171
6
      break;
1172
6
        }
1173
1174
6
    expressionP->X_unsigned = 0;
1175
6
        }
1176
1
      else if (op == O_logical_not)
1177
0
        {
1178
0
    for (i = 0; i < expressionP->X_add_number; ++i)
1179
0
      if (generic_bignum[i] != 0)
1180
0
        break;
1181
0
    expressionP->X_add_number = i >= expressionP->X_add_number;
1182
0
    expressionP->X_op = O_constant;
1183
0
    expressionP->X_unsigned = 1;
1184
0
    expressionP->X_extrabit = 0;
1185
0
        }
1186
7
    }
1187
17.4k
  else if (expressionP->X_op != O_illegal
1188
17.4k
     && expressionP->X_op != O_absent)
1189
17.1k
    {
1190
17.1k
      if (op != O_absent)
1191
15.8k
        {
1192
15.8k
    expressionP->X_add_symbol = make_expr_symbol (expressionP);
1193
15.8k
    expressionP->X_op = op;
1194
15.8k
    expressionP->X_add_number = 0;
1195
15.8k
        }
1196
1.30k
      else if (!md_register_arithmetic && expressionP->X_op == O_register)
1197
11
        {
1198
    /* Convert to binary '+'.  */
1199
11
    expressionP->X_op_symbol = make_expr_symbol (expressionP);
1200
11
    expressionP->X_add_symbol = make_expr_symbol (&zero);
1201
11
    expressionP->X_add_number = 0;
1202
11
    expressionP->X_op = O_add;
1203
11
        }
1204
17.1k
    }
1205
336
  else
1206
336
    as_warn (_("Unary operator %c ignored because bad operand follows"),
1207
336
       c);
1208
20.9k
      }
1209
20.9k
      break;
1210
1211
0
#if !defined (DOLLAR_DOT) && !defined (TC_M68K)
1212
8.01k
    case '$':
1213
8.01k
      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
8.01k
      else
1221
8.01k
  {
1222
8.01k
    goto isname;
1223
8.01k
  }
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
8.99k
    case '.':
1249
8.99k
      if (!is_part_of_name (*input_line_pointer))
1250
1.80k
  {
1251
1.80k
    current_location (expressionP, mode);
1252
1.80k
    break;
1253
1.80k
  }
1254
7.19k
      else if ((strncasecmp (input_line_pointer, "startof.", 8) == 0
1255
6
    && ! is_part_of_name (input_line_pointer[8]))
1256
7.18k
         || (strncasecmp (input_line_pointer, "sizeof.", 7) == 0
1257
18
       && ! is_part_of_name (input_line_pointer[7])))
1258
15
  {
1259
15
    int start;
1260
1261
15
    start = (input_line_pointer[1] == 't'
1262
9
       || input_line_pointer[1] == 'T');
1263
15
    input_line_pointer += start ? 8 : 7;
1264
15
    SKIP_WHITESPACE ();
1265
1266
    /* Cover for the as_bad () invocations below.  */
1267
15
    expressionP->X_op = O_absent;
1268
1269
15
    if (*input_line_pointer != '(')
1270
1
      as_bad (_("syntax error in .startof. or .sizeof."));
1271
14
    else
1272
14
      {
1273
14
        ++input_line_pointer;
1274
14
        SKIP_WHITESPACE ();
1275
14
        c = get_symbol_name (& name);
1276
14
        if (! *name)
1277
1
    {
1278
1
      as_bad (_("expected symbol name"));
1279
1
      (void) restore_line_pointer (c);
1280
1
      if (c == ')')
1281
0
        ++input_line_pointer;
1282
1
      break;
1283
1
    }
1284
1285
13
        expressionP->X_op = O_symbol;
1286
13
        expressionP->X_add_symbol = symbol_lookup_or_make (name, start);
1287
13
        expressionP->X_add_number = 0;
1288
1289
13
        restore_line_pointer (c);
1290
13
        SKIP_WHITESPACE ();
1291
13
        if (*input_line_pointer != ')')
1292
10
    as_bad (_("syntax error in .startof. or .sizeof."));
1293
3
        else
1294
3
    ++input_line_pointer;
1295
13
      }
1296
14
    break;
1297
15
  }
1298
7.17k
      else
1299
7.17k
  {
1300
7.17k
    goto isname;
1301
7.17k
  }
1302
1303
1.33k
    case ',':
1304
6.64k
    eol:
1305
      /* Can't imagine any other kind of operand.  */
1306
6.64k
      expressionP->X_op = O_absent;
1307
6.64k
      input_line_pointer--;
1308
6.64k
      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
74.2k
    default:
1342
74.2k
#if defined(md_need_index_operator) || defined(TC_M68K)
1343
74.2k
    de_fault:
1344
74.2k
#endif
1345
74.2k
      if (is_name_beginner (c) || c == '"')  /* Here if did not begin with a digit.  */
1346
49.1k
  {
1347
    /* Identifier begins here.
1348
       This is kludged for speed, so code is repeated.  */
1349
64.2k
  isname:
1350
64.2k
    -- input_line_pointer;
1351
64.2k
    c = get_symbol_name (&name);
1352
1353
64.2k
#ifdef md_operator
1354
64.2k
    {
1355
64.2k
      op = md_operator (name, 1, &c);
1356
64.2k
      switch (op)
1357
64.2k
        {
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
4
        case O_illegal:
1371
4
    as_bad (_("invalid use of operator \"%s\""), name);
1372
4
    break;
1373
64.2k
        default:
1374
64.2k
    break;
1375
64.2k
        }
1376
1377
64.2k
      if (op != O_absent && op != O_illegal)
1378
14
        {
1379
14
    restore_line_pointer (c);
1380
14
    expr (9, expressionP, mode);
1381
14
    expressionP->X_add_symbol = make_expr_symbol (expressionP);
1382
14
    expressionP->X_op_symbol = NULL;
1383
14
    expressionP->X_add_number = 0;
1384
14
    expressionP->X_op = op;
1385
14
    break;
1386
14
        }
1387
64.2k
    }
1388
64.2k
#endif
1389
1390
64.2k
#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
64.2k
    if (md_parse_name (name, expressionP, mode, &c))
1396
3.74k
      {
1397
3.74k
        restore_line_pointer (c);
1398
3.74k
        break;
1399
3.74k
      }
1400
60.5k
#endif
1401
1402
60.5k
    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
60.5k
    segment = S_GET_SEGMENT (symbolP);
1407
60.5k
    if (!expr_defer_p (mode)
1408
60.5k
        && segment == absolute_section
1409
179
        && !S_FORCE_RELOC (symbolP, 0))
1410
179
      {
1411
179
        expressionP->X_op = O_constant;
1412
179
        expressionP->X_add_number = S_GET_VALUE (symbolP);
1413
179
      }
1414
60.3k
    else if (!expr_defer_p (mode) && segment == reg_section)
1415
2.35k
      {
1416
2.35k
        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
2.35k
        else
1422
2.35k
    {
1423
2.35k
      expr_copy (expressionP,
1424
2.35k
           symbol_get_value_expression (symbolP));
1425
2.35k
      resolve_register (expressionP);
1426
2.35k
    }
1427
2.35k
      }
1428
57.9k
    else
1429
57.9k
      {
1430
57.9k
        expressionP->X_op = O_symbol;
1431
57.9k
        expressionP->X_add_symbol = symbolP;
1432
57.9k
        expressionP->X_add_number = 0;
1433
57.9k
      }
1434
1435
60.5k
    restore_line_pointer (c);
1436
60.5k
  }
1437
25.1k
      else
1438
25.1k
  {
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
25.1k
    expressionP->X_op = O_absent;
1444
25.1k
    --input_line_pointer;
1445
25.1k
    md_operand (expressionP);
1446
25.1k
    if (expressionP->X_op == O_absent)
1447
20.1k
      {
1448
20.1k
        ++input_line_pointer;
1449
20.1k
        as_bad (_("bad expression"));
1450
20.1k
        expressionP->X_op = O_constant;
1451
20.1k
        expressionP->X_add_number = 0;
1452
20.1k
      }
1453
25.1k
  }
1454
85.6k
      break;
1455
164k
    }
1456
1457
169k
  SKIP_ALL_WHITESPACE ();    /* -> 1st char after operand.  */
1458
169k
  know (!is_whitespace (*input_line_pointer));
1459
1460
  /* The PA port needs this information.  */
1461
169k
  if (expressionP->X_add_symbol)
1462
82.5k
    symbol_mark_used (expressionP->X_add_symbol);
1463
1464
169k
  if (!expr_defer_p (mode))
1465
169k
    {
1466
169k
      expressionP->X_add_symbol
1467
169k
  = symbol_clone_if_forward_ref (expressionP->X_add_symbol);
1468
169k
      expressionP->X_op_symbol
1469
169k
  = symbol_clone_if_forward_ref (expressionP->X_op_symbol);
1470
169k
    }
1471
1472
169k
  switch (expressionP->X_op)
1473
169k
    {
1474
100k
    default:
1475
100k
      return absolute_section;
1476
64.2k
    case O_symbol:
1477
64.2k
      return S_GET_SEGMENT (expressionP->X_add_symbol);
1478
5.10k
    case O_register:
1479
5.10k
      return reg_section;
1480
169k
    }
1481
169k
}
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
900
#define STANDARD_MUL_PRECEDENCE 8
1596
0
#define MRI_MUL_PRECEDENCE 6
1597
1598
void
1599
expr_set_precedence (void)
1600
300
{
1601
300
  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
300
  else
1608
300
    {
1609
300
      op_rank[O_multiply] = STANDARD_MUL_PRECEDENCE;
1610
300
      op_rank[O_divide] = STANDARD_MUL_PRECEDENCE;
1611
300
      op_rank[O_modulus] = STANDARD_MUL_PRECEDENCE;
1612
300
    }
1613
300
}
1614
1615
void
1616
expr_set_rank (operatorT op, operator_rankT rank)
1617
41
{
1618
41
  gas_assert (op >= O_md1 && op < ARRAY_SIZE (op_rank));
1619
41
  op_rank[op] = rank;
1620
41
}
1621
1622
/* Initialize the expression parser.  */
1623
1624
void
1625
expr_begin (void)
1626
281
{
1627
281
  expr_set_precedence ();
1628
1629
  /* Verify that X_op field is wide enough.  */
1630
281
  {
1631
281
    expressionS e;
1632
281
    e.X_op = O_max;
1633
281
    gas_assert (e.X_op == O_max);
1634
281
  }
1635
1636
281
  memset (seen, 0, sizeof seen);
1637
281
  memset (nr_seen, 0, sizeof nr_seen);
1638
281
  expr_symbol_lines = NULL;
1639
281
}
1640
1641
void
1642
expr_end (void)
1643
281
{
1644
281
  if (ENABLE_LEAK_CHECK)
1645
843
    for (size_t i = 0; i < ARRAY_SIZE (seen); i++)
1646
562
      free (seen[i]);
1647
281
}
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
150k
{
1656
150k
  int c;
1657
150k
  operatorT ret;
1658
1659
150k
  c = *input_line_pointer & 0xff;
1660
150k
  *num_chars = 1;
1661
1662
150k
  if (is_end_of_stmt (c))
1663
30.4k
    return O_illegal;
1664
1665
119k
#ifdef md_operator
1666
119k
  if (is_name_beginner (c))
1667
33.6k
    {
1668
33.6k
      char *name;
1669
33.6k
      char ec = get_symbol_name (& name);
1670
1671
33.6k
      ret = md_operator (name, 2, &ec);
1672
33.6k
      switch (ret)
1673
33.6k
  {
1674
33.6k
  case O_absent:
1675
33.6k
    *input_line_pointer = ec;
1676
33.6k
    input_line_pointer = name;
1677
33.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
1
  default:
1685
1
    *input_line_pointer = ec;
1686
1
    *num_chars = input_line_pointer - name;
1687
1
    input_line_pointer = name;
1688
1
    return ret;
1689
33.6k
  }
1690
33.6k
    }
1691
119k
#endif
1692
1693
119k
  switch (c)
1694
119k
    {
1695
94.4k
    default:
1696
94.4k
      ret = op_encoding[c];
1697
94.4k
#ifdef md_operator
1698
94.4k
      if (ret == O_illegal)
1699
66.4k
  {
1700
66.4k
    char *start = input_line_pointer;
1701
1702
66.4k
    ret = md_operator (NULL, 2, NULL);
1703
66.4k
    if (ret != O_illegal)
1704
8.91k
      *num_chars = input_line_pointer - start;
1705
66.4k
    input_line_pointer = start;
1706
66.4k
  }
1707
94.4k
#endif
1708
94.4k
      return ret;
1709
1710
6.57k
    case '+':
1711
15.9k
    case '-':
1712
15.9k
      return op_encoding[c];
1713
1714
208
    case '<':
1715
208
      switch (input_line_pointer[1])
1716
208
  {
1717
27
  default:
1718
27
    return op_encoding[c];
1719
13
  case '<':
1720
13
    ret = O_left_shift;
1721
13
    break;
1722
6
  case '>':
1723
6
    ret = O_ne;
1724
6
    break;
1725
162
  case '=':
1726
162
    ret = O_le;
1727
162
    break;
1728
208
  }
1729
181
      *num_chars = 2;
1730
181
      return ret;
1731
1732
3.10k
    case '=':
1733
3.10k
      if (input_line_pointer[1] != '=')
1734
1.34k
  return op_encoding[c];
1735
1736
1.76k
      *num_chars = 2;
1737
1.76k
      return O_eq;
1738
1739
470
    case '>':
1740
470
      switch (input_line_pointer[1])
1741
470
  {
1742
272
  default:
1743
272
    return op_encoding[c];
1744
198
  case '>':
1745
198
    ret = O_right_shift;
1746
198
    break;
1747
0
  case '=':
1748
0
    ret = O_ge;
1749
0
    break;
1750
470
  }
1751
198
      *num_chars = 2;
1752
198
      return ret;
1753
1754
651
    case '!':
1755
651
      switch (input_line_pointer[1])
1756
651
  {
1757
565
  case '!':
1758
    /* We accept !! as equivalent to ^ for MRI compatibility. */
1759
565
    *num_chars = 2;
1760
565
    return O_bit_exclusive_or;
1761
0
  case '=':
1762
    /* We accept != as equivalent to <>.  */
1763
0
    *num_chars = 2;
1764
0
    return O_ne;
1765
86
  default:
1766
86
    if (flag_m68k_mri)
1767
0
      return O_bit_inclusive_or;
1768
86
    return op_encoding[c];
1769
651
  }
1770
1771
2.38k
    case '|':
1772
2.38k
      if (input_line_pointer[1] != '|')
1773
618
  return op_encoding[c];
1774
1775
1.76k
      *num_chars = 2;
1776
1.76k
      return O_logical_or;
1777
1778
2.66k
    case '&':
1779
2.66k
      if (input_line_pointer[1] != '&')
1780
2.65k
  return op_encoding[c];
1781
1782
5
      *num_chars = 2;
1783
5
      return O_logical_and;
1784
119k
    }
1785
1786
  /* NOTREACHED  */
1787
119k
}
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
5.21k
{
1798
5.21k
  valueT ures = resultP->X_add_number;
1799
5.21k
  valueT uamount = amount;
1800
1801
5.21k
  resultP->X_add_number += uamount;
1802
1803
5.21k
  resultP->X_extrabit ^= rhs_highbit;
1804
1805
5.21k
  if (ures + uamount < ures)
1806
12
    resultP->X_extrabit ^= 1;
1807
5.21k
}
1808
1809
/* Similarly, for subtraction.  */
1810
1811
void
1812
subtract_from_result (expressionS *resultP, offsetT amount, int rhs_highbit)
1813
7.28k
{
1814
7.28k
  valueT ures = resultP->X_add_number;
1815
7.28k
  valueT uamount = amount;
1816
1817
7.28k
  resultP->X_add_number -= uamount;
1818
1819
7.28k
  resultP->X_extrabit ^= rhs_highbit;
1820
1821
7.28k
  if (ures < uamount)
1822
3.48k
    resultP->X_extrabit ^= 1;
1823
7.28k
}
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
112k
{
1832
112k
  operator_rankT rank = (operator_rankT) rankarg;
1833
112k
  segT retval;
1834
112k
  expressionS right;
1835
112k
  operatorT op_left;
1836
112k
  operatorT op_right;
1837
112k
  int op_chars;
1838
1839
112k
  know (rankarg >= 0);
1840
1841
  /* Save the value of dot for the fixup code.  */
1842
112k
  if (rank == 0)
1843
75.4k
    symbol_set_value_now (&dot_symbol);
1844
1845
112k
  retval = operand (resultP, mode);
1846
1847
  /* operand () gobbles spaces.  */
1848
112k
  know (!is_whitespace (*input_line_pointer));
1849
1850
112k
  op_left = operatorf (&op_chars);
1851
150k
  while (op_left != O_illegal && op_rank[op_left] > rank)
1852
37.4k
    {
1853
37.4k
      segT rightseg;
1854
37.4k
      bool is_unsigned;
1855
37.4k
      offsetT frag_off;
1856
1857
37.4k
      input_line_pointer += op_chars; /* -> after operator.  */
1858
1859
#ifdef md_expr_init_rest
1860
      md_expr_init_rest (&right);
1861
#endif
1862
37.4k
      rightseg = expr (op_rank[op_left], &right, mode);
1863
37.4k
      if (right.X_op == O_absent)
1864
4.58k
  {
1865
4.58k
    as_warn (_("missing operand; zero assumed"));
1866
4.58k
    right.X_op = O_constant;
1867
4.58k
    right.X_add_number = 0;
1868
4.58k
    right.X_add_symbol = NULL;
1869
4.58k
    right.X_op_symbol = NULL;
1870
4.58k
  }
1871
1872
37.4k
      know (!is_whitespace (*input_line_pointer));
1873
1874
37.4k
      if (op_left == O_index)
1875
217
  {
1876
217
    if (*input_line_pointer != ']')
1877
216
      as_bad ("missing right bracket");
1878
1
    else
1879
1
      {
1880
1
        ++input_line_pointer;
1881
1
        SKIP_WHITESPACE ();
1882
1
      }
1883
217
  }
1884
1885
37.4k
      op_right = operatorf (&op_chars);
1886
1887
37.4k
      know (op_right == O_illegal || op_left == O_index
1888
37.4k
      || op_rank[op_right] <= op_rank[op_left]);
1889
37.4k
      know (op_left >= O_multiply);
1890
#ifndef md_operator
1891
      know (op_left <= O_index);
1892
#else
1893
37.4k
      know (op_left < O_max);
1894
37.4k
#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
37.4k
      if (resultP->X_op == O_big)
1902
2
  {
1903
2
    if (resultP->X_add_number > 0)
1904
2
      as_warn (_("left operand is a bignum; integer 0 assumed"));
1905
0
    else
1906
0
      as_warn (_("left operand is a float; integer 0 assumed"));
1907
2
    resultP->X_op = O_constant;
1908
2
    resultP->X_add_number = 0;
1909
2
    resultP->X_add_symbol = NULL;
1910
2
    resultP->X_op_symbol = NULL;
1911
2
  }
1912
37.4k
      if (right.X_op == O_big)
1913
15
  {
1914
15
    if (right.X_add_number > 0)
1915
2
      as_warn (_("right operand is a bignum; integer 0 assumed"));
1916
13
    else
1917
13
      as_warn (_("right operand is a float; integer 0 assumed"));
1918
15
    right.X_op = O_constant;
1919
15
    right.X_add_number = 0;
1920
15
    right.X_add_symbol = NULL;
1921
15
    right.X_op_symbol = NULL;
1922
15
  }
1923
1924
37.4k
      is_unsigned = resultP->X_unsigned && right.X_unsigned;
1925
1926
37.4k
      if (expr_defer_p (mode)
1927
10
    && ((resultP->X_add_symbol != NULL
1928
5
         && S_IS_FORWARD_REF (resultP->X_add_symbol))
1929
10
        || (right.X_add_symbol != NULL
1930
6
      && S_IS_FORWARD_REF (right.X_add_symbol))))
1931
0
  goto general;
1932
1933
      /* Optimize common cases.  */
1934
37.4k
#ifdef md_optimize_expr
1935
37.4k
      if (md_optimize_expr (resultP, op_left, &right))
1936
0
  {
1937
    /* Skip.  */
1938
0
    is_unsigned = resultP->X_unsigned;
1939
0
  }
1940
37.4k
      else
1941
37.4k
#endif
1942
37.4k
      if (op_left == O_add && right.X_op == O_constant
1943
2.47k
    && (md_register_arithmetic || resultP->X_op != O_register))
1944
2.46k
  {
1945
    /* X + constant.  */
1946
2.46k
    add_to_result (resultP, right.X_add_number, right.X_extrabit);
1947
2.46k
  }
1948
      /* This case comes up in PIC code.  */
1949
34.9k
      else if (op_left == O_subtract
1950
7.50k
         && right.X_op == O_symbol
1951
2.96k
         && resultP->X_op == O_symbol
1952
2.74k
         && retval == rightseg
1953
#ifdef md_allow_local_subtract
1954
         && md_allow_local_subtract (resultP, & right, rightseg)
1955
#endif
1956
1.40k
         && ((SEG_NORMAL (rightseg)
1957
6
        && !S_FORCE_RELOC (resultP->X_add_symbol, 0)
1958
6
        && !S_FORCE_RELOC (right.X_add_symbol, 0))
1959
1.39k
       || right.X_add_symbol == resultP->X_add_symbol)
1960
122
         && frag_offset_fixed_p (symbol_get_frag (resultP->X_add_symbol),
1961
122
               symbol_get_frag (right.X_add_symbol),
1962
122
               &frag_off))
1963
116
  {
1964
116
    offsetT symval_diff = (S_GET_VALUE (resultP->X_add_symbol)
1965
116
         - S_GET_VALUE (right.X_add_symbol));
1966
116
    subtract_from_result (resultP, right.X_add_number, right.X_extrabit);
1967
116
    subtract_from_result (resultP, frag_off / OCTETS_PER_BYTE, 0);
1968
116
    add_to_result (resultP, symval_diff, symval_diff < 0);
1969
116
    resultP->X_op = O_constant;
1970
116
    resultP->X_add_symbol = 0;
1971
116
    is_unsigned = false;
1972
116
  }
1973
34.8k
      else if (op_left == O_subtract && right.X_op == O_constant
1974
4.43k
         && (md_register_arithmetic || resultP->X_op != O_register))
1975
4.43k
  {
1976
    /* X - constant.  */
1977
4.43k
    subtract_from_result (resultP, right.X_add_number, right.X_extrabit);
1978
4.43k
    is_unsigned = false;
1979
4.43k
  }
1980
30.4k
      else if (op_left == O_add && resultP->X_op == O_constant
1981
6
         && (md_register_arithmetic || right.X_op != O_register))
1982
6
  {
1983
    /* Constant + X.  */
1984
6
    resultP->X_op = right.X_op;
1985
6
    resultP->X_add_symbol = right.X_add_symbol;
1986
6
    resultP->X_op_symbol = right.X_op_symbol;
1987
6
    add_to_result (resultP, right.X_add_number, right.X_extrabit);
1988
6
    retval = rightseg;
1989
6
  }
1990
30.4k
      else if (resultP->X_op == O_constant && right.X_op == O_constant)
1991
5.48k
  {
1992
    /* Constant OP constant.  */
1993
5.48k
    offsetT v = right.X_add_number;
1994
5.48k
    if (v == 0 && (op_left == O_divide || op_left == O_modulus))
1995
4.87k
      {
1996
4.87k
        as_warn (_("division by zero"));
1997
4.87k
        v = 1;
1998
4.87k
      }
1999
5.48k
    switch (op_left)
2000
5.48k
      {
2001
4
      default:      goto general;
2002
171
      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
171
        resultP->X_add_number *= (valueT) v;
2007
171
        break;
2008
2009
50
      case O_divide:
2010
50
        if (v == 1)
2011
35
    break;
2012
15
        if (v == -1)
2013
1
    {
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
1
      resultP->X_add_number = - (valueT) resultP->X_add_number;
2019
1
    }
2020
14
        else
2021
14
    resultP->X_add_number /= v;
2022
15
        break;
2023
2024
4.84k
      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
4.84k
        if (v == 1 || v == -1)
2029
4.83k
    resultP->X_add_number = 0;
2030
6
        else
2031
6
    resultP->X_add_number %= v;
2032
4.84k
        break;
2033
2034
0
      case O_left_shift:
2035
24
      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
24
        if ((valueT) v >= sizeof (valueT) * CHAR_BIT)
2045
0
    {
2046
0
      as_warn_value_out_of_range (_("shift count"), v, 0,
2047
0
                sizeof (valueT) * CHAR_BIT - 1,
2048
0
                NULL, 0);
2049
0
      resultP->X_add_number = 0;
2050
0
    }
2051
24
        else if (op_left == O_left_shift)
2052
0
    resultP->X_add_number
2053
0
      = (valueT) resultP->X_add_number << (valueT) v;
2054
24
        else
2055
24
    resultP->X_add_number
2056
24
      = (valueT) resultP->X_add_number >> (valueT) v;
2057
24
        is_unsigned = resultP->X_unsigned;
2058
24
        break;
2059
7
      case O_bit_inclusive_or:  resultP->X_add_number |= v; break;
2060
22
      case O_bit_or_not:    resultP->X_add_number |= ~v; break;
2061
0
      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
94
      case O_eq:
2071
94
        resultP->X_add_number =
2072
94
    resultP->X_add_number == v ? ~ (offsetT) 0 : 0;
2073
94
        is_unsigned = false;
2074
94
        break;
2075
0
      case O_ne:
2076
0
        resultP->X_add_number =
2077
0
    resultP->X_add_number != v ? ~ (offsetT) 0 : 0;
2078
0
        is_unsigned = false;
2079
0
        break;
2080
9
      case O_lt:
2081
9
        resultP->X_add_number =
2082
9
    resultP->X_add_number <  v ? ~ (offsetT) 0 : 0;
2083
9
        is_unsigned = false;
2084
9
        break;
2085
3
      case O_le:
2086
3
        resultP->X_add_number =
2087
3
    resultP->X_add_number <= v ? ~ (offsetT) 0 : 0;
2088
3
        is_unsigned = false;
2089
3
        break;
2090
0
      case O_ge:
2091
0
        resultP->X_add_number =
2092
0
    resultP->X_add_number >= v ? ~ (offsetT) 0 : 0;
2093
0
        is_unsigned = false;
2094
0
        break;
2095
13
      case O_gt:
2096
13
        resultP->X_add_number =
2097
13
    resultP->X_add_number >  v ? ~ (offsetT) 0 : 0;
2098
13
        is_unsigned = false;
2099
13
        break;
2100
0
      case O_logical_and:
2101
0
        resultP->X_add_number = resultP->X_add_number && v;
2102
0
        is_unsigned = true;
2103
0
        break;
2104
224
      case O_logical_or:
2105
224
        resultP->X_add_number = resultP->X_add_number || v;
2106
224
        is_unsigned = true;
2107
224
        break;
2108
5.48k
      }
2109
5.48k
  }
2110
24.9k
      else if (resultP->X_op == O_symbol
2111
12.4k
         && right.X_op == O_symbol
2112
9.73k
         && (op_left == O_add
2113
7.11k
       || op_left == O_subtract
2114
4.49k
       || (resultP->X_add_number == 0
2115
4.48k
           && right.X_add_number == 0)))
2116
9.73k
  {
2117
    /* Symbol OP symbol.  */
2118
9.73k
    resultP->X_op = op_left;
2119
9.73k
    resultP->X_op_symbol = right.X_add_symbol;
2120
9.73k
    if (op_left == O_add)
2121
2.62k
      add_to_result (resultP, right.X_add_number, right.X_extrabit);
2122
7.11k
    else if (op_left == O_subtract)
2123
2.62k
      {
2124
2.62k
        subtract_from_result (resultP, right.X_add_number,
2125
2.62k
            right.X_extrabit);
2126
2.62k
        if (retval == rightseg
2127
1.28k
      && SEG_NORMAL (retval)
2128
6
      && !S_FORCE_RELOC (resultP->X_add_symbol, 0)
2129
6
      && !S_FORCE_RELOC (right.X_add_symbol, 0))
2130
6
    {
2131
6
      retval = absolute_section;
2132
6
      rightseg = absolute_section;
2133
6
    }
2134
2.62k
      }
2135
9.73k
  }
2136
15.2k
      else
2137
15.2k
  {
2138
15.2k
        general:
2139
    /* The general case.  */
2140
15.2k
    resultP->X_add_symbol = make_expr_symbol (resultP);
2141
15.2k
    resultP->X_op_symbol = make_expr_symbol (&right);
2142
15.2k
    resultP->X_op = op_left;
2143
15.2k
    resultP->X_add_number = 0;
2144
15.2k
    resultP->X_extrabit = 0;
2145
15.2k
  }
2146
2147
37.4k
      resultP->X_unsigned = is_unsigned;
2148
2149
37.4k
      if (retval != rightseg)
2150
17.0k
  {
2151
17.0k
    if (retval == undefined_section)
2152
8.69k
      ;
2153
8.35k
    else if (rightseg == undefined_section)
2154
3.49k
      retval = rightseg;
2155
4.85k
    else if (retval == expr_section)
2156
9
      ;
2157
4.84k
    else if (rightseg == expr_section)
2158
0
      retval = rightseg;
2159
4.84k
    else if (retval == reg_section)
2160
1.14k
      ;
2161
3.69k
    else if (rightseg == reg_section)
2162
1
      retval = rightseg;
2163
3.69k
    else if (rightseg == absolute_section)
2164
2.85k
      ;
2165
838
    else if (retval == absolute_section)
2166
16
      retval = rightseg;
2167
822
#ifdef DIFF_EXPR_OK
2168
822
    else if (op_left == O_subtract)
2169
822
      ;
2170
0
#endif
2171
0
    else
2172
0
      as_bad (_("operation combines symbols in different segments"));
2173
17.0k
  }
2174
2175
37.4k
      op_left = op_right;
2176
37.4k
    }        /* While next operator is >= this rank.  */
2177
2178
  /* The PA port needs this information.  */
2179
112k
  if (resultP->X_add_symbol)
2180
70.0k
    symbol_mark_used (resultP->X_add_symbol);
2181
2182
112k
  if (rank == 0 && mode == expr_evaluate)
2183
44.1k
    resolve_expression (resultP);
2184
2185
112k
  return resultP->X_op == O_constant ? absolute_section : retval;
2186
112k
}
2187
2188
/* Resolve an expression without changing any symbols/sub-expressions
2189
   used.  */
2190
2191
int
2192
resolve_expression (expressionS *expressionP)
2193
104k
{
2194
  /* Help out with CSE.  */
2195
104k
  valueT final_val = expressionP->X_add_number;
2196
104k
  symbolS *add_symbol = expressionP->X_add_symbol;
2197
104k
  symbolS *orig_add_symbol = add_symbol;
2198
104k
  symbolS *op_symbol = expressionP->X_op_symbol;
2199
104k
  operatorT op = expressionP->X_op;
2200
104k
  valueT left, right;
2201
104k
  segT seg_left, seg_right;
2202
104k
  fragS *frag_left, *frag_right;
2203
104k
  offsetT frag_off;
2204
2205
104k
  switch (op)
2206
104k
    {
2207
1.65k
    default:
2208
1.65k
      return 0;
2209
2210
60.8k
    case O_constant:
2211
61.0k
    case O_register:
2212
61.0k
      left = 0;
2213
61.0k
      break;
2214
2215
11.9k
    case O_symbol:
2216
11.9k
    case O_symbol_rva:
2217
11.9k
      if (!snapshot_symbol (&add_symbol, &left, &seg_left, &frag_left))
2218
0
  return 0;
2219
2220
11.9k
      break;
2221
2222
14.6k
    case O_uminus:
2223
14.6k
    case O_bit_not:
2224
14.6k
    case O_logical_not:
2225
14.6k
      if (!snapshot_symbol (&add_symbol, &left, &seg_left, &frag_left))
2226
15
  return 0;
2227
2228
14.6k
      if (seg_left != absolute_section)
2229
14.5k
  return 0;
2230
2231
66
      if (op == O_logical_not)
2232
1
  left = !left;
2233
65
      else if (op == O_uminus)
2234
65
  left = -left;
2235
0
      else
2236
0
  left = ~left;
2237
66
      op = O_constant;
2238
66
      break;
2239
2240
536
    case O_multiply:
2241
4.65k
    case O_divide:
2242
7.27k
    case O_modulus:
2243
7.28k
    case O_left_shift:
2244
7.36k
    case O_right_shift:
2245
7.93k
    case O_bit_inclusive_or:
2246
7.98k
    case O_bit_or_not:
2247
9.37k
    case O_bit_exclusive_or:
2248
10.5k
    case O_bit_and:
2249
13.3k
    case O_add:
2250
13.6k
    case O_subtract:
2251
13.6k
    case O_eq:
2252
13.6k
    case O_ne:
2253
13.6k
    case O_lt:
2254
13.6k
    case O_le:
2255
13.6k
    case O_ge:
2256
13.8k
    case O_gt:
2257
13.8k
    case O_logical_and:
2258
15.0k
    case O_logical_or:
2259
15.0k
      if (!snapshot_symbol (&add_symbol, &left, &seg_left, &frag_left)
2260
11.2k
    || !snapshot_symbol (&op_symbol, &right, &seg_right, &frag_right))
2261
6.06k
  return 0;
2262
2263
      /* Simplify addition or subtraction of a constant by folding the
2264
   constant into X_add_number.  */
2265
8.95k
      if (op == O_add)
2266
2.69k
  {
2267
2.69k
    if (seg_right == absolute_section)
2268
74
      {
2269
74
        final_val += right;
2270
74
        op = O_symbol;
2271
74
        break;
2272
74
      }
2273
2.62k
    else if (seg_left == absolute_section)
2274
22
      {
2275
22
        final_val += left;
2276
22
        left = right;
2277
22
        seg_left = seg_right;
2278
22
        add_symbol = op_symbol;
2279
22
        orig_add_symbol = expressionP->X_op_symbol;
2280
22
        op = O_symbol;
2281
22
        break;
2282
22
      }
2283
2.69k
  }
2284
6.25k
      else if (op == O_subtract)
2285
303
  {
2286
303
    if (seg_right == absolute_section)
2287
65
      {
2288
65
        final_val -= right;
2289
65
        op = O_symbol;
2290
65
        break;
2291
65
      }
2292
303
  }
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
8.79k
      frag_off = 0;
2308
8.79k
      if (!(seg_left == absolute_section
2309
284
         && seg_right == absolute_section)
2310
8.78k
    && !(op == O_eq || op == O_ne)
2311
8.78k
    && !((op == O_subtract
2312
8.54k
    || op == O_lt || op == O_le || op == O_ge || op == O_gt)
2313
434
         && seg_left == seg_right
2314
199
         && (finalize_syms
2315
199
       || frag_offset_fixed_p (frag_left, frag_right, &frag_off)
2316
0
       || (op == O_gt
2317
0
           && frag_gtoffset_p (left, frag_left,
2318
0
             right, frag_right, &frag_off)))
2319
199
         && (seg_left != reg_section || left == right)
2320
199
         && (seg_left != undefined_section || add_symbol == op_symbol)))
2321
8.60k
  {
2322
8.60k
    if ((seg_left == absolute_section && left == 0)
2323
8.49k
        || (seg_right == absolute_section && right == 0))
2324
785
      {
2325
785
        if (op == O_bit_exclusive_or || op == O_bit_inclusive_or)
2326
569
    {
2327
569
      if (!(seg_right == absolute_section && right == 0))
2328
13
        {
2329
13
          seg_left = seg_right;
2330
13
          left = right;
2331
13
          add_symbol = op_symbol;
2332
13
          orig_add_symbol = expressionP->X_op_symbol;
2333
13
        }
2334
569
      op = O_symbol;
2335
569
      break;
2336
569
    }
2337
216
        else if (op == O_left_shift || op == O_right_shift)
2338
83
    {
2339
83
      if (!(seg_left == absolute_section && left == 0))
2340
73
        {
2341
73
          op = O_symbol;
2342
73
          break;
2343
73
        }
2344
83
    }
2345
133
        else if (op != O_multiply
2346
81
           && op != O_bit_or_not && op != O_bit_and)
2347
51
          return 0;
2348
785
      }
2349
7.81k
    else if (op == O_multiply
2350
289
       && 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
7.81k
    else if ((op == O_multiply || op == O_divide)
2360
3.64k
       && seg_right == absolute_section && right == 1)
2361
0
      {
2362
0
        op = O_symbol;
2363
0
        break;
2364
0
      }
2365
7.81k
    else if (!(left == right
2366
7.50k
         && ((seg_left == reg_section && seg_right == reg_section)
2367
7.50k
       || (seg_left == undefined_section
2368
7.49k
           && seg_right == undefined_section
2369
7.48k
           && add_symbol == op_symbol))))
2370
7.81k
      return 0;
2371
3
    else if (op == O_bit_and || op == O_bit_inclusive_or)
2372
1
      {
2373
1
        op = O_symbol;
2374
1
        break;
2375
1
      }
2376
2
    else if (op != O_bit_exclusive_or && op != O_bit_or_not)
2377
2
      return 0;
2378
8.60k
  }
2379
2380
287
      right += frag_off / OCTETS_PER_BYTE;
2381
287
      switch (op)
2382
287
  {
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
0
  case O_divide:
2387
0
    if (right == 0)
2388
0
      return 0;
2389
    /* See expr() for reasons of the special casing.  */
2390
0
    if (right == 1)
2391
0
      break;
2392
0
    if ((offsetT) right == -1)
2393
0
      left = -left;
2394
0
    else
2395
0
      left = (offsetT) left / (offsetT) right;
2396
0
    break;
2397
0
  case O_modulus:
2398
0
    if (right == 0)
2399
0
      return 0;
2400
    /* Again, see expr() for reasons of the special casing.  */
2401
0
    if (right == 1 || (offsetT) right == -1)
2402
0
      left = 0;
2403
0
    else
2404
0
      left = (offsetT) left % (offsetT) right;
2405
0
    break;
2406
4
  case O_left_shift:
2407
4
    if (right >= sizeof (left) * CHAR_BIT)
2408
2
      left = 0;
2409
2
    else
2410
2
      left <<= right;
2411
4
    break;
2412
8
  case O_right_shift:
2413
8
    if (right >= sizeof (left) * CHAR_BIT)
2414
0
      left = 0;
2415
8
    else
2416
8
      left >>= right;
2417
8
    break;
2418
0
  case O_bit_inclusive_or:  left |= right; break;
2419
7
  case O_bit_or_not:    left |= ~right; break;
2420
0
  case O_bit_exclusive_or:  left ^= right; break;
2421
29
  case O_bit_and:     left &= right; break;
2422
0
  case O_eq:
2423
0
  case O_ne:
2424
0
    left = (left == right
2425
0
      && seg_left == seg_right
2426
0
      && (finalize_syms || frag_left == frag_right)
2427
0
      && (seg_left != undefined_section
2428
0
          || add_symbol == op_symbol)
2429
0
      ? ~ (valueT) 0 : 0);
2430
0
    if (op == O_ne)
2431
0
      left = ~left;
2432
0
    break;
2433
3
  case O_lt:
2434
3
    left = (offsetT) left <  (offsetT) right ? ~ (valueT) 0 : 0;
2435
3
    break;
2436
0
  case O_le:
2437
0
    left = (offsetT) left <= (offsetT) right ? ~ (valueT) 0 : 0;
2438
0
    break;
2439
0
  case O_ge:
2440
0
    left = (offsetT) left >= (offsetT) right ? ~ (valueT) 0 : 0;
2441
0
    break;
2442
182
  case O_gt:
2443
182
    left = (offsetT) left >  (offsetT) right ? ~ (valueT) 0 : 0;
2444
182
    break;
2445
2
  case O_logical_and: left = left && right; break;
2446
0
  case O_logical_or:  left = left || right; break;
2447
0
  default:    abort ();
2448
287
  }
2449
2450
287
      op = O_constant;
2451
287
      break;
2452
104k
    }
2453
2454
74.1k
  if (op == O_symbol)
2455
12.7k
    {
2456
12.7k
      if (seg_left == absolute_section)
2457
0
  op = O_constant;
2458
12.7k
      else if (seg_left == reg_section && final_val == 0)
2459
6
  op = O_register;
2460
12.7k
      else if (!symbol_same_p (add_symbol, orig_add_symbol))
2461
69
  final_val += left;
2462
12.7k
      expressionP->X_add_symbol = add_symbol;
2463
12.7k
    }
2464
74.1k
  expressionP->X_op = op;
2465
2466
74.1k
  if (op == O_constant || op == O_register)
2467
61.4k
    final_val += left;
2468
74.1k
  expressionP->X_add_number = final_val;
2469
2470
74.1k
  return 1;
2471
104k
}
2472
2473
/* "Look through" register equates.  */
2474
void resolve_register (expressionS *expP)
2475
2.35k
{
2476
2.35k
  symbolS *sym;
2477
2.35k
  offsetT acc;
2478
2.35k
  const expressionS *e;
2479
2480
2.35k
  if (expP->X_op != O_symbol)
2481
2.23k
    return;
2482
2483
116
  sym = symbol_equated_to (expP->X_add_symbol, &acc);
2484
116
  acc += expP->X_add_number;
2485
116
  if (sym == NULL
2486
116
      || (!md_register_arithmetic && acc != 0))
2487
0
    return;
2488
2489
116
  e = symbol_get_value_expression (sym);
2490
116
  if (e->X_op == O_register)
2491
116
    {
2492
116
      expr_copy (expP, e);
2493
116
      expP->X_add_number += acc;
2494
116
    }
2495
116
}
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
312k
{
2519
312k
  char c;
2520
2521
312k
  * 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
312k
  if (is_name_beginner (c = *input_line_pointer++)
2525
9.14k
      || (input_from_string && c == FAKE_LABEL_CHAR))
2526
303k
    {
2527
1.94M
      while (is_part_of_name (c = *input_line_pointer++)
2528
303k
       || (input_from_string && c == FAKE_LABEL_CHAR))
2529
1.64M
  ;
2530
303k
      if (is_name_ender (c))
2531
0
  c = *input_line_pointer++;
2532
303k
    }
2533
9.14k
  else if (c == '"')
2534
4.75k
    {
2535
4.75k
      char *dst = input_line_pointer;
2536
2537
4.75k
      * ilp_return = input_line_pointer;
2538
4.75k
      for (;;)
2539
134k
  {
2540
134k
    c = *input_line_pointer++;
2541
2542
134k
    if (c == 0)
2543
290
      {
2544
290
        as_warn (_("missing closing '\"'"));
2545
290
        break;
2546
290
      }
2547
2548
134k
    if (c == '"')
2549
4.48k
      {
2550
4.48k
        char *ilp_save = input_line_pointer;
2551
2552
4.48k
        SKIP_WHITESPACE ();
2553
4.48k
        if (*input_line_pointer == '"')
2554
15
    {
2555
15
      ++input_line_pointer;
2556
15
      continue;
2557
15
    }
2558
4.46k
        input_line_pointer = ilp_save;
2559
4.46k
        break;
2560
4.48k
      }
2561
2562
129k
    if (c == '\\')
2563
0
      switch (*input_line_pointer)
2564
0
        {
2565
0
        case '"':
2566
0
        case '\\':
2567
0
    c = *input_line_pointer++;
2568
0
    break;
2569
2570
0
        default:
2571
0
    if (c != 0)
2572
0
      as_warn (_("'\\%c' in quoted symbol name; "
2573
0
           "behavior may change in the future"),
2574
0
         *input_line_pointer);
2575
0
    break;
2576
0
        }
2577
2578
129k
    *dst++ = c;
2579
129k
  }
2580
4.75k
      *dst = 0;
2581
4.75k
    }
2582
312k
  *--input_line_pointer = 0;
2583
312k
  return c;
2584
312k
}
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
264k
{
2593
264k
  * input_line_pointer = c;
2594
264k
  if (c == '"')
2595
24.4k
    c = * ++ input_line_pointer;
2596
264k
  return c;
2597
264k
}
2598
2599
offsetT
2600
get_single_number (void)
2601
37.6k
{
2602
37.6k
  expressionS exp;
2603
2604
37.6k
  SKIP_WHITESPACE ();
2605
2606
37.6k
  switch (*input_line_pointer)
2607
37.6k
    {
2608
1
    case '0':
2609
14.0k
    case '1':
2610
21.2k
    case '2':
2611
21.4k
    case '3':
2612
22.7k
    case '4':
2613
33.5k
    case '5':
2614
33.5k
    case '6':
2615
33.5k
    case '7':
2616
36.2k
    case '8':
2617
36.2k
    case '9':
2618
36.2k
      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
1.34k
    default:
2646
1.34k
      goto bad;
2647
37.6k
    }
2648
2649
36.2k
  operand (&exp, expr_normal);
2650
2651
36.2k
  if (exp.X_op != O_constant)
2652
0
    {
2653
1.34k
  bad:
2654
1.34k
      as_bad (_("bad number"));
2655
1.34k
      exp.X_add_number = 0;
2656
1.34k
    }
2657
2658
37.6k
  return exp.X_add_number;
2659
36.2k
}