Coverage Report

Created: 2026-05-11 07:54

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