Coverage Report

Created: 2026-09-14 08:07

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