Coverage Report

Created: 2026-07-25 10:20

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