* write.c (subsegs_finish): New function, broken out of
[deliverable/binutils-gdb.git] / gas / expr.c
1 /* expr.c -operands, expressions-
2 Copyright (C) 1987, 90, 91, 92, 93, 94, 95, 96, 1997
3 Free Software Foundation, Inc.
4
5 This file is part of GAS, the GNU Assembler.
6
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
21
22 /*
23 * This is really a branch office of as-read.c. I split it out to clearly
24 * distinguish the world of expressions from the world of statements.
25 * (It also gives smaller files to re-compile.)
26 * Here, "operand"s are of expressions, not instructions.
27 */
28
29 #include <ctype.h>
30 #include <string.h>
31
32 #include "as.h"
33 #include "obstack.h"
34
35 static void floating_constant PARAMS ((expressionS * expressionP));
36 static void integer_constant PARAMS ((int radix, expressionS * expressionP));
37 static void mri_char_constant PARAMS ((expressionS *));
38 static void current_location PARAMS ((expressionS *));
39 static void clean_up_expression PARAMS ((expressionS * expressionP));
40
41 extern const char EXP_CHARS[], FLT_CHARS[];
42
43 /* We keep a mapping of expression symbols to file positions, so that
44 we can provide better error messages. */
45
46 struct expr_symbol_line
47 {
48 struct expr_symbol_line *next;
49 symbolS *sym;
50 char *file;
51 unsigned int line;
52 };
53
54 static struct expr_symbol_line *expr_symbol_lines;
55 \f
56 /* Build a dummy symbol to hold a complex expression. This is how we
57 build expressions up out of other expressions. The symbol is put
58 into the fake section expr_section. */
59
60 symbolS *
61 make_expr_symbol (expressionP)
62 expressionS *expressionP;
63 {
64 const char *fake;
65 symbolS *symbolP;
66 struct expr_symbol_line *n;
67
68 if (expressionP->X_op == O_symbol
69 && expressionP->X_add_number == 0)
70 return expressionP->X_add_symbol;
71
72 /* FIXME: This should be something which decode_local_label_name
73 will handle. */
74 fake = FAKE_LABEL_NAME;
75
76 /* Putting constant symbols in absolute_section rather than
77 expr_section is convenient for the old a.out code, for which
78 S_GET_SEGMENT does not always retrieve the value put in by
79 S_SET_SEGMENT. */
80 symbolP = symbol_create (fake,
81 (expressionP->X_op == O_constant
82 ? absolute_section
83 : expr_section),
84 0, &zero_address_frag);
85 symbolP->sy_value = *expressionP;
86
87 if (expressionP->X_op == O_constant)
88 resolve_symbol_value (symbolP);
89
90 n = (struct expr_symbol_line *) xmalloc (sizeof *n);
91 n->sym = symbolP;
92 as_where (&n->file, &n->line);
93 n->next = expr_symbol_lines;
94 expr_symbol_lines = n;
95
96 return symbolP;
97 }
98
99 /* Return the file and line number for an expr symbol. Return
100 non-zero if something was found, 0 if no information is known for
101 the symbol. */
102
103 int
104 expr_symbol_where (sym, pfile, pline)
105 symbolS *sym;
106 char **pfile;
107 unsigned int *pline;
108 {
109 register struct expr_symbol_line *l;
110
111 for (l = expr_symbol_lines; l != NULL; l = l->next)
112 {
113 if (l->sym == sym)
114 {
115 *pfile = l->file;
116 *pline = l->line;
117 return 1;
118 }
119 }
120
121 return 0;
122 }
123 \f
124 /*
125 * Build any floating-point literal here.
126 * Also build any bignum literal here.
127 */
128
129 /* Seems atof_machine can backscan through generic_bignum and hit whatever
130 happens to be loaded before it in memory. And its way too complicated
131 for me to fix right. Thus a hack. JF: Just make generic_bignum bigger,
132 and never write into the early words, thus they'll always be zero.
133 I hate Dean's floating-point code. Bleh. */
134 LITTLENUM_TYPE generic_bignum[SIZE_OF_LARGE_NUMBER + 6];
135 FLONUM_TYPE generic_floating_point_number =
136 {
137 &generic_bignum[6], /* low (JF: Was 0) */
138 &generic_bignum[SIZE_OF_LARGE_NUMBER + 6 - 1], /* high JF: (added +6) */
139 0, /* leader */
140 0, /* exponent */
141 0 /* sign */
142 };
143 /* If nonzero, we've been asked to assemble nan, +inf or -inf */
144 int generic_floating_point_magic;
145 \f
146 static void
147 floating_constant (expressionP)
148 expressionS *expressionP;
149 {
150 /* input_line_pointer->*/
151 /* floating-point constant. */
152 int error_code;
153
154 error_code = atof_generic (&input_line_pointer, ".", EXP_CHARS,
155 &generic_floating_point_number);
156
157 if (error_code)
158 {
159 if (error_code == ERROR_EXPONENT_OVERFLOW)
160 {
161 as_bad ("bad floating-point constant: exponent overflow, probably assembling junk");
162 }
163 else
164 {
165 as_bad ("bad floating-point constant: unknown error code=%d.", error_code);
166 }
167 }
168 expressionP->X_op = O_big;
169 /* input_line_pointer->just after constant, */
170 /* which may point to whitespace. */
171 expressionP->X_add_number = -1;
172 }
173
174 static void
175 integer_constant (radix, expressionP)
176 int radix;
177 expressionS *expressionP;
178 {
179 char *start; /* start of number. */
180 char *suffix = NULL;
181 char c;
182 valueT number; /* offset or (absolute) value */
183 short int digit; /* value of next digit in current radix */
184 short int maxdig = 0;/* highest permitted digit value. */
185 int too_many_digits = 0; /* if we see >= this number of */
186 char *name; /* points to name of symbol */
187 symbolS *symbolP; /* points to symbol */
188
189 int small; /* true if fits in 32 bits. */
190
191 /* May be bignum, or may fit in 32 bits. */
192 /* Most numbers fit into 32 bits, and we want this case to be fast.
193 so we pretend it will fit into 32 bits. If, after making up a 32
194 bit number, we realise that we have scanned more digits than
195 comfortably fit into 32 bits, we re-scan the digits coding them
196 into a bignum. For decimal and octal numbers we are
197 conservative: Some numbers may be assumed bignums when in fact
198 they do fit into 32 bits. Numbers of any radix can have excess
199 leading zeros: We strive to recognise this and cast them back
200 into 32 bits. We must check that the bignum really is more than
201 32 bits, and change it back to a 32-bit number if it fits. The
202 number we are looking for is expected to be positive, but if it
203 fits into 32 bits as an unsigned number, we let it be a 32-bit
204 number. The cavalier approach is for speed in ordinary cases. */
205 /* This has been extended for 64 bits. We blindly assume that if
206 you're compiling in 64-bit mode, the target is a 64-bit machine.
207 This should be cleaned up. */
208
209 #ifdef BFD64
210 #define valuesize 64
211 #else /* includes non-bfd case, mostly */
212 #define valuesize 32
213 #endif
214
215 if (flag_m68k_mri && radix == 0)
216 {
217 int flt = 0;
218
219 /* In MRI mode, the number may have a suffix indicating the
220 radix. For that matter, it might actually be a floating
221 point constant. */
222 for (suffix = input_line_pointer; isalnum (*suffix); suffix++)
223 {
224 if (*suffix == 'e' || *suffix == 'E')
225 flt = 1;
226 }
227
228 if (suffix == input_line_pointer)
229 {
230 radix = 10;
231 suffix = NULL;
232 }
233 else
234 {
235 c = *--suffix;
236 if (islower (c))
237 c = toupper (c);
238 if (c == 'B')
239 radix = 2;
240 else if (c == 'D')
241 radix = 10;
242 else if (c == 'O' || c == 'Q')
243 radix = 8;
244 else if (c == 'H')
245 radix = 16;
246 else if (suffix[1] == '.' || c == 'E' || flt)
247 {
248 floating_constant (expressionP);
249 return;
250 }
251 else
252 {
253 radix = 10;
254 suffix = NULL;
255 }
256 }
257 }
258
259 switch (radix)
260 {
261 case 2:
262 maxdig = 2;
263 too_many_digits = valuesize + 1;
264 break;
265 case 8:
266 maxdig = radix = 8;
267 too_many_digits = (valuesize + 2) / 3 + 1;
268 break;
269 case 16:
270 maxdig = radix = 16;
271 too_many_digits = (valuesize + 3) / 4 + 1;
272 break;
273 case 10:
274 maxdig = radix = 10;
275 too_many_digits = (valuesize + 12) / 4; /* very rough */
276 }
277 #undef valuesize
278 start = input_line_pointer;
279 c = *input_line_pointer++;
280 for (number = 0;
281 (digit = hex_value (c)) < maxdig;
282 c = *input_line_pointer++)
283 {
284 number = number * radix + digit;
285 }
286 /* c contains character after number. */
287 /* input_line_pointer->char after c. */
288 small = (input_line_pointer - start - 1) < too_many_digits;
289 if (!small)
290 {
291 /*
292 * we saw a lot of digits. manufacture a bignum the hard way.
293 */
294 LITTLENUM_TYPE *leader; /*->high order littlenum of the bignum. */
295 LITTLENUM_TYPE *pointer; /*->littlenum we are frobbing now. */
296 long carry;
297
298 leader = generic_bignum;
299 generic_bignum[0] = 0;
300 generic_bignum[1] = 0;
301 input_line_pointer = start; /*->1st digit. */
302 c = *input_line_pointer++;
303 for (;
304 (carry = hex_value (c)) < maxdig;
305 c = *input_line_pointer++)
306 {
307 for (pointer = generic_bignum;
308 pointer <= leader;
309 pointer++)
310 {
311 long work;
312
313 work = carry + radix * *pointer;
314 *pointer = work & LITTLENUM_MASK;
315 carry = work >> LITTLENUM_NUMBER_OF_BITS;
316 }
317 if (carry)
318 {
319 if (leader < generic_bignum + SIZE_OF_LARGE_NUMBER - 1)
320 {
321 /* room to grow a longer bignum. */
322 *++leader = carry;
323 }
324 }
325 }
326 /* again, c is char after number, */
327 /* input_line_pointer->after c. */
328 know (LITTLENUM_NUMBER_OF_BITS == 16);
329 if (leader < generic_bignum + 2)
330 {
331 /* will fit into 32 bits. */
332 number =
333 ((generic_bignum[1] & LITTLENUM_MASK) << LITTLENUM_NUMBER_OF_BITS)
334 | (generic_bignum[0] & LITTLENUM_MASK);
335 small = 1;
336 }
337 else
338 {
339 number = leader - generic_bignum + 1; /* number of littlenums in the bignum. */
340 }
341 }
342
343 if (flag_m68k_mri && suffix != NULL && input_line_pointer - 1 == suffix)
344 c = *input_line_pointer++;
345
346 if (small)
347 {
348 /*
349 * here with number, in correct radix. c is the next char.
350 * note that unlike un*x, we allow "011f" "0x9f" to
351 * both mean the same as the (conventional) "9f". this is simply easier
352 * than checking for strict canonical form. syntax sux!
353 */
354
355 if (LOCAL_LABELS_FB && c == 'b')
356 {
357 /*
358 * backward ref to local label.
359 * because it is backward, expect it to be defined.
360 */
361 /* Construct a local label. */
362 name = fb_label_name ((int) number, 0);
363
364 /* seen before, or symbol is defined: ok */
365 symbolP = symbol_find (name);
366 if ((symbolP != NULL) && (S_IS_DEFINED (symbolP)))
367 {
368 /* local labels are never absolute. don't waste time
369 checking absoluteness. */
370 know (SEG_NORMAL (S_GET_SEGMENT (symbolP)));
371
372 expressionP->X_op = O_symbol;
373 expressionP->X_add_symbol = symbolP;
374 }
375 else
376 {
377 /* either not seen or not defined. */
378 /* @@ Should print out the original string instead of
379 the parsed number. */
380 as_bad ("backw. ref to unknown label \"%d:\", 0 assumed.",
381 (int) number);
382 expressionP->X_op = O_constant;
383 }
384
385 expressionP->X_add_number = 0;
386 } /* case 'b' */
387 else if (LOCAL_LABELS_FB && c == 'f')
388 {
389 /*
390 * forward reference. expect symbol to be undefined or
391 * unknown. undefined: seen it before. unknown: never seen
392 * it before.
393 * construct a local label name, then an undefined symbol.
394 * don't create a xseg frag for it: caller may do that.
395 * just return it as never seen before.
396 */
397 name = fb_label_name ((int) number, 1);
398 symbolP = symbol_find_or_make (name);
399 /* we have no need to check symbol properties. */
400 #ifndef many_segments
401 /* since "know" puts its arg into a "string", we
402 can't have newlines in the argument. */
403 know (S_GET_SEGMENT (symbolP) == undefined_section || S_GET_SEGMENT (symbolP) == text_section || S_GET_SEGMENT (symbolP) == data_section);
404 #endif
405 expressionP->X_op = O_symbol;
406 expressionP->X_add_symbol = symbolP;
407 expressionP->X_add_number = 0;
408 } /* case 'f' */
409 else if (LOCAL_LABELS_DOLLAR && c == '$')
410 {
411 /* If the dollar label is *currently* defined, then this is just
412 another reference to it. If it is not *currently* defined,
413 then this is a fresh instantiation of that number, so create
414 it. */
415
416 if (dollar_label_defined ((long) number))
417 {
418 name = dollar_label_name ((long) number, 0);
419 symbolP = symbol_find (name);
420 know (symbolP != NULL);
421 }
422 else
423 {
424 name = dollar_label_name ((long) number, 1);
425 symbolP = symbol_find_or_make (name);
426 }
427
428 expressionP->X_op = O_symbol;
429 expressionP->X_add_symbol = symbolP;
430 expressionP->X_add_number = 0;
431 } /* case '$' */
432 else
433 {
434 expressionP->X_op = O_constant;
435 #ifdef TARGET_WORD_SIZE
436 /* Sign extend NUMBER. */
437 number |= (-(number >> (TARGET_WORD_SIZE - 1))) << (TARGET_WORD_SIZE - 1);
438 #endif
439 expressionP->X_add_number = number;
440 input_line_pointer--; /* restore following character. */
441 } /* really just a number */
442 }
443 else
444 {
445 /* not a small number */
446 expressionP->X_op = O_big;
447 expressionP->X_add_number = number; /* number of littlenums */
448 input_line_pointer--; /*->char following number. */
449 }
450 }
451
452 /* Parse an MRI multi character constant. */
453
454 static void
455 mri_char_constant (expressionP)
456 expressionS *expressionP;
457 {
458 int i;
459
460 if (*input_line_pointer == '\''
461 && input_line_pointer[1] != '\'')
462 {
463 expressionP->X_op = O_constant;
464 expressionP->X_add_number = 0;
465 return;
466 }
467
468 /* In order to get the correct byte ordering, we must build the
469 number in reverse. */
470 for (i = SIZE_OF_LARGE_NUMBER - 1; i >= 0; i--)
471 {
472 int j;
473
474 generic_bignum[i] = 0;
475 for (j = 0; j < CHARS_PER_LITTLENUM; j++)
476 {
477 if (*input_line_pointer == '\'')
478 {
479 if (input_line_pointer[1] != '\'')
480 break;
481 ++input_line_pointer;
482 }
483 generic_bignum[i] <<= 8;
484 generic_bignum[i] += *input_line_pointer;
485 ++input_line_pointer;
486 }
487
488 if (i < SIZE_OF_LARGE_NUMBER - 1)
489 {
490 /* If there is more than one littlenum, left justify the
491 last one to make it match the earlier ones. If there is
492 only one, we can just use the value directly. */
493 for (; j < CHARS_PER_LITTLENUM; j++)
494 generic_bignum[i] <<= 8;
495 }
496
497 if (*input_line_pointer == '\''
498 && input_line_pointer[1] != '\'')
499 break;
500 }
501
502 if (i < 0)
503 {
504 as_bad ("Character constant too large");
505 i = 0;
506 }
507
508 if (i > 0)
509 {
510 int c;
511 int j;
512
513 c = SIZE_OF_LARGE_NUMBER - i;
514 for (j = 0; j < c; j++)
515 generic_bignum[j] = generic_bignum[i + j];
516 i = c;
517 }
518
519 know (LITTLENUM_NUMBER_OF_BITS == 16);
520 if (i > 2)
521 {
522 expressionP->X_op = O_big;
523 expressionP->X_add_number = i;
524 }
525 else
526 {
527 expressionP->X_op = O_constant;
528 if (i < 2)
529 expressionP->X_add_number = generic_bignum[0] & LITTLENUM_MASK;
530 else
531 expressionP->X_add_number =
532 (((generic_bignum[1] & LITTLENUM_MASK)
533 << LITTLENUM_NUMBER_OF_BITS)
534 | (generic_bignum[0] & LITTLENUM_MASK));
535 }
536
537 /* Skip the final closing quote. */
538 ++input_line_pointer;
539 }
540
541 /* Return an expression representing the current location. This
542 handles the magic symbol `.'. */
543
544 static void
545 current_location (expressionp)
546 expressionS *expressionp;
547 {
548 if (now_seg == absolute_section)
549 {
550 expressionp->X_op = O_constant;
551 expressionp->X_add_number = abs_section_offset;
552 }
553 else
554 {
555 symbolS *symbolp;
556
557 symbolp = symbol_new (FAKE_LABEL_NAME, now_seg,
558 (valueT) frag_now_fix (),
559 frag_now);
560 expressionp->X_op = O_symbol;
561 expressionp->X_add_symbol = symbolp;
562 expressionp->X_add_number = 0;
563 }
564 }
565
566 /*
567 * Summary of operand().
568 *
569 * in: Input_line_pointer points to 1st char of operand, which may
570 * be a space.
571 *
572 * out: A expressionS.
573 * The operand may have been empty: in this case X_op == O_absent.
574 * Input_line_pointer->(next non-blank) char after operand.
575 */
576
577 static segT
578 operand (expressionP)
579 expressionS *expressionP;
580 {
581 char c;
582 symbolS *symbolP; /* points to symbol */
583 char *name; /* points to name of symbol */
584 segT segment;
585
586 /* All integers are regarded as unsigned unless they are negated.
587 This is because the only thing which cares whether a number is
588 unsigned is the code in emit_expr which extends constants into
589 bignums. It should only sign extend negative numbers, so that
590 something like ``.quad 0x80000000'' is not sign extended even
591 though it appears negative if valueT is 32 bits. */
592 expressionP->X_unsigned = 1;
593
594 /* digits, assume it is a bignum. */
595
596 SKIP_WHITESPACE (); /* leading whitespace is part of operand. */
597 c = *input_line_pointer++; /* input_line_pointer->past char in c. */
598
599 switch (c)
600 {
601 case '1':
602 case '2':
603 case '3':
604 case '4':
605 case '5':
606 case '6':
607 case '7':
608 case '8':
609 case '9':
610 input_line_pointer--;
611
612 integer_constant (flag_m68k_mri ? 0 : 10, expressionP);
613 break;
614
615 case '0':
616 /* non-decimal radix */
617
618 if (flag_m68k_mri)
619 {
620 char *s;
621
622 /* Check for a hex constant. */
623 for (s = input_line_pointer; hex_p (*s); s++)
624 ;
625 if (*s == 'h' || *s == 'H')
626 {
627 --input_line_pointer;
628 integer_constant (0, expressionP);
629 break;
630 }
631 }
632
633 c = *input_line_pointer;
634 switch (c)
635 {
636 case 'o':
637 case 'O':
638 case 'q':
639 case 'Q':
640 case '8':
641 case '9':
642 if (flag_m68k_mri)
643 {
644 integer_constant (0, expressionP);
645 break;
646 }
647 /* Fall through. */
648 default:
649 default_case:
650 if (c && strchr (FLT_CHARS, c))
651 {
652 input_line_pointer++;
653 floating_constant (expressionP);
654 expressionP->X_add_number = -(isupper (c) ? tolower (c) : c);
655 }
656 else
657 {
658 /* The string was only zero */
659 expressionP->X_op = O_constant;
660 expressionP->X_add_number = 0;
661 }
662
663 break;
664
665 case 'x':
666 case 'X':
667 if (flag_m68k_mri)
668 goto default_case;
669 input_line_pointer++;
670 integer_constant (16, expressionP);
671 break;
672
673 case 'b':
674 if (LOCAL_LABELS_FB && ! flag_m68k_mri)
675 {
676 /* This code used to check for '+' and '-' here, and, in
677 some conditions, fall through to call
678 integer_constant. However, that didn't make sense,
679 as integer_constant only accepts digits. */
680 /* Some of our code elsewhere does permit digits greater
681 than the expected base; for consistency, do the same
682 here. */
683 if (input_line_pointer[1] < '0'
684 || input_line_pointer[1] > '9')
685 {
686 /* Parse this as a back reference to label 0. */
687 input_line_pointer--;
688 integer_constant (10, expressionP);
689 break;
690 }
691 /* Otherwise, parse this as a binary number. */
692 }
693 /* Fall through. */
694 case 'B':
695 input_line_pointer++;
696 if (flag_m68k_mri)
697 goto default_case;
698 integer_constant (2, expressionP);
699 break;
700
701 case '0':
702 case '1':
703 case '2':
704 case '3':
705 case '4':
706 case '5':
707 case '6':
708 case '7':
709 integer_constant (flag_m68k_mri ? 0 : 8, expressionP);
710 break;
711
712 case 'f':
713 if (LOCAL_LABELS_FB)
714 {
715 /* If it says "0f" and it could possibly be a floating point
716 number, make it one. Otherwise, make it a local label,
717 and try to deal with parsing the rest later. */
718 if (!input_line_pointer[1]
719 || (is_end_of_line[0xff & input_line_pointer[1]]))
720 goto is_0f_label;
721 {
722 char *cp = input_line_pointer + 1;
723 int r = atof_generic (&cp, ".", EXP_CHARS,
724 &generic_floating_point_number);
725 switch (r)
726 {
727 case 0:
728 case ERROR_EXPONENT_OVERFLOW:
729 if (*cp == 'f' || *cp == 'b')
730 /* looks like a difference expression */
731 goto is_0f_label;
732 else
733 goto is_0f_float;
734 default:
735 as_fatal ("expr.c(operand): bad atof_generic return val %d",
736 r);
737 }
738 }
739
740 /* Okay, now we've sorted it out. We resume at one of these
741 two labels, depending on what we've decided we're probably
742 looking at. */
743 is_0f_label:
744 input_line_pointer--;
745 integer_constant (10, expressionP);
746 break;
747
748 is_0f_float:
749 /* fall through */
750 ;
751 }
752
753 case 'd':
754 case 'D':
755 if (flag_m68k_mri)
756 {
757 integer_constant (0, expressionP);
758 break;
759 }
760 /* Fall through. */
761 case 'F':
762 case 'r':
763 case 'e':
764 case 'E':
765 case 'g':
766 case 'G':
767 input_line_pointer++;
768 floating_constant (expressionP);
769 expressionP->X_add_number = -(isupper (c) ? tolower (c) : c);
770 break;
771
772 case '$':
773 if (LOCAL_LABELS_DOLLAR)
774 {
775 integer_constant (10, expressionP);
776 break;
777 }
778 else
779 goto default_case;
780 }
781
782 break;
783
784 case '(':
785 case '[':
786 /* didn't begin with digit & not a name */
787 segment = expression (expressionP);
788 /* Expression() will pass trailing whitespace */
789 if ((c == '(' && *input_line_pointer++ != ')')
790 || (c == '[' && *input_line_pointer++ != ']'))
791 {
792 as_bad ("Missing ')' assumed");
793 input_line_pointer--;
794 }
795 SKIP_WHITESPACE ();
796 /* here with input_line_pointer->char after "(...)" */
797 return segment;
798
799 case 'E':
800 if (! flag_m68k_mri || *input_line_pointer != '\'')
801 goto de_fault;
802 as_bad ("EBCDIC constants are not supported");
803 /* Fall through. */
804 case 'A':
805 if (! flag_m68k_mri || *input_line_pointer != '\'')
806 goto de_fault;
807 ++input_line_pointer;
808 /* Fall through. */
809 case '\'':
810 if (! flag_m68k_mri)
811 {
812 /* Warning: to conform to other people's assemblers NO
813 ESCAPEMENT is permitted for a single quote. The next
814 character, parity errors and all, is taken as the value
815 of the operand. VERY KINKY. */
816 expressionP->X_op = O_constant;
817 expressionP->X_add_number = *input_line_pointer++;
818 break;
819 }
820
821 mri_char_constant (expressionP);
822 break;
823
824 case '+':
825 (void) operand (expressionP);
826 break;
827
828 case '"':
829 /* Double quote is the bitwise not operator in MRI mode. */
830 if (! flag_m68k_mri)
831 goto de_fault;
832 /* Fall through. */
833 case '~':
834 /* ~ is permitted to start a label on the Delta. */
835 if (is_name_beginner (c))
836 goto isname;
837 case '!':
838 case '-':
839 {
840 operand (expressionP);
841 if (expressionP->X_op == O_constant)
842 {
843 /* input_line_pointer -> char after operand */
844 if (c == '-')
845 {
846 expressionP->X_add_number = - expressionP->X_add_number;
847 /* Notice: '-' may overflow: no warning is given. This is
848 compatible with other people's assemblers. Sigh. */
849 expressionP->X_unsigned = 0;
850 }
851 else if (c == '~' || c == '"')
852 expressionP->X_add_number = ~ expressionP->X_add_number;
853 else
854 expressionP->X_add_number = ! expressionP->X_add_number;
855 }
856 else if (expressionP->X_op != O_illegal
857 && expressionP->X_op != O_absent)
858 {
859 expressionP->X_add_symbol = make_expr_symbol (expressionP);
860 if (c == '-')
861 expressionP->X_op = O_uminus;
862 else if (c == '~' || c == '"')
863 expressionP->X_op = O_bit_not;
864 else
865 expressionP->X_op = O_logical_not;
866 expressionP->X_add_number = 0;
867 }
868 else
869 as_warn ("Unary operator %c ignored because bad operand follows",
870 c);
871 }
872 break;
873
874 case '$':
875 /* $ is the program counter when in MRI mode, or when DOLLAR_DOT
876 is defined. */
877 #ifndef DOLLAR_DOT
878 if (! flag_m68k_mri)
879 goto de_fault;
880 #endif
881 if (flag_m68k_mri && hex_p (*input_line_pointer))
882 {
883 /* In MRI mode, $ is also used as the prefix for a
884 hexadecimal constant. */
885 integer_constant (16, expressionP);
886 break;
887 }
888
889 if (is_part_of_name (*input_line_pointer))
890 goto isname;
891
892 current_location (expressionP);
893 break;
894
895 case '.':
896 if (!is_part_of_name (*input_line_pointer))
897 {
898 current_location (expressionP);
899 break;
900 }
901 else if ((strncasecmp (input_line_pointer, "startof.", 8) == 0
902 && ! is_part_of_name (input_line_pointer[8]))
903 || (strncasecmp (input_line_pointer, "sizeof.", 7) == 0
904 && ! is_part_of_name (input_line_pointer[7])))
905 {
906 int start;
907
908 start = (input_line_pointer[1] == 't'
909 || input_line_pointer[1] == 'T');
910 input_line_pointer += start ? 8 : 7;
911 SKIP_WHITESPACE ();
912 if (*input_line_pointer != '(')
913 as_bad ("syntax error in .startof. or .sizeof.");
914 else
915 {
916 char *buf;
917
918 ++input_line_pointer;
919 SKIP_WHITESPACE ();
920 name = input_line_pointer;
921 c = get_symbol_end ();
922
923 buf = (char *) xmalloc (strlen (name) + 10);
924 if (start)
925 sprintf (buf, ".startof.%s", name);
926 else
927 sprintf (buf, ".sizeof.%s", name);
928 symbolP = symbol_make (buf);
929 free (buf);
930
931 expressionP->X_op = O_symbol;
932 expressionP->X_add_symbol = symbolP;
933 expressionP->X_add_number = 0;
934
935 *input_line_pointer = c;
936 SKIP_WHITESPACE ();
937 if (*input_line_pointer != ')')
938 as_bad ("syntax error in .startof. or .sizeof.");
939 else
940 ++input_line_pointer;
941 }
942 break;
943 }
944 else
945 {
946 goto isname;
947 }
948 case ',':
949 case '\n':
950 case '\0':
951 eol:
952 /* can't imagine any other kind of operand */
953 expressionP->X_op = O_absent;
954 input_line_pointer--;
955 break;
956
957 case '%':
958 if (! flag_m68k_mri)
959 goto de_fault;
960 integer_constant (2, expressionP);
961 break;
962
963 case '@':
964 if (! flag_m68k_mri)
965 goto de_fault;
966 integer_constant (8, expressionP);
967 break;
968
969 case ':':
970 if (! flag_m68k_mri)
971 goto de_fault;
972
973 /* In MRI mode, this is a floating point constant represented
974 using hexadecimal digits. */
975
976 ++input_line_pointer;
977 integer_constant (16, expressionP);
978 break;
979
980 case '*':
981 if (! flag_m68k_mri || is_part_of_name (*input_line_pointer))
982 goto de_fault;
983
984 current_location (expressionP);
985 break;
986
987 default:
988 de_fault:
989 if (is_end_of_line[(unsigned char) c])
990 goto eol;
991 if (is_name_beginner (c)) /* here if did not begin with a digit */
992 {
993 /*
994 * Identifier begins here.
995 * This is kludged for speed, so code is repeated.
996 */
997 isname:
998 name = --input_line_pointer;
999 c = get_symbol_end ();
1000
1001 #ifdef md_parse_name
1002 /* This is a hook for the backend to parse certain names
1003 specially in certain contexts. If a name always has a
1004 specific value, it can often be handled by simply
1005 entering it in the symbol table. */
1006 if (md_parse_name (name, expressionP))
1007 {
1008 *input_line_pointer = c;
1009 break;
1010 }
1011 #endif
1012
1013 #ifdef TC_I960
1014 /* The MRI i960 assembler permits
1015 lda sizeof code,g13
1016 FIXME: This should use md_parse_name. */
1017 if (flag_mri
1018 && (strcasecmp (name, "sizeof") == 0
1019 || strcasecmp (name, "startof") == 0))
1020 {
1021 int start;
1022 char *buf;
1023
1024 start = (name[1] == 't'
1025 || name[1] == 'T');
1026
1027 *input_line_pointer = c;
1028 SKIP_WHITESPACE ();
1029
1030 name = input_line_pointer;
1031 c = get_symbol_end ();
1032
1033 buf = (char *) xmalloc (strlen (name) + 10);
1034 if (start)
1035 sprintf (buf, ".startof.%s", name);
1036 else
1037 sprintf (buf, ".sizeof.%s", name);
1038 symbolP = symbol_make (buf);
1039 free (buf);
1040
1041 expressionP->X_op = O_symbol;
1042 expressionP->X_add_symbol = symbolP;
1043 expressionP->X_add_number = 0;
1044
1045 *input_line_pointer = c;
1046 SKIP_WHITESPACE ();
1047
1048 break;
1049 }
1050 #endif
1051
1052 symbolP = symbol_find_or_make (name);
1053
1054 /* If we have an absolute symbol or a reg, then we know its
1055 value now. */
1056 segment = S_GET_SEGMENT (symbolP);
1057 if (segment == absolute_section)
1058 {
1059 expressionP->X_op = O_constant;
1060 expressionP->X_add_number = S_GET_VALUE (symbolP);
1061 }
1062 else if (segment == reg_section)
1063 {
1064 expressionP->X_op = O_register;
1065 expressionP->X_add_number = S_GET_VALUE (symbolP);
1066 }
1067 else
1068 {
1069 expressionP->X_op = O_symbol;
1070 expressionP->X_add_symbol = symbolP;
1071 expressionP->X_add_number = 0;
1072 }
1073 *input_line_pointer = c;
1074 }
1075 else
1076 {
1077 /* Let the target try to parse it. Success is indicated by changing
1078 the X_op field to something other than O_absent and pointing
1079 input_line_pointer passed the expression. If it can't parse the
1080 expression, X_op and input_line_pointer should be unchanged. */
1081 expressionP->X_op = O_absent;
1082 --input_line_pointer;
1083 md_operand (expressionP);
1084 if (expressionP->X_op == O_absent)
1085 {
1086 ++input_line_pointer;
1087 as_bad ("Bad expression");
1088 expressionP->X_op = O_constant;
1089 expressionP->X_add_number = 0;
1090 }
1091 }
1092 break;
1093 }
1094
1095 /*
1096 * It is more 'efficient' to clean up the expressionS when they are created.
1097 * Doing it here saves lines of code.
1098 */
1099 clean_up_expression (expressionP);
1100 SKIP_WHITESPACE (); /*->1st char after operand. */
1101 know (*input_line_pointer != ' ');
1102
1103 /* The PA port needs this information. */
1104 if (expressionP->X_add_symbol)
1105 expressionP->X_add_symbol->sy_used = 1;
1106
1107 switch (expressionP->X_op)
1108 {
1109 default:
1110 return absolute_section;
1111 case O_symbol:
1112 return S_GET_SEGMENT (expressionP->X_add_symbol);
1113 case O_register:
1114 return reg_section;
1115 }
1116 } /* operand() */
1117 \f
1118 /* Internal. Simplify a struct expression for use by expr() */
1119
1120 /*
1121 * In: address of a expressionS.
1122 * The X_op field of the expressionS may only take certain values.
1123 * Elsewise we waste time special-case testing. Sigh. Ditto SEG_ABSENT.
1124 * Out: expressionS may have been modified:
1125 * 'foo-foo' symbol references cancelled to 0,
1126 * which changes X_op from O_subtract to O_constant.
1127 * Unused fields zeroed to help expr().
1128 */
1129
1130 static void
1131 clean_up_expression (expressionP)
1132 expressionS *expressionP;
1133 {
1134 switch (expressionP->X_op)
1135 {
1136 case O_illegal:
1137 case O_absent:
1138 expressionP->X_add_number = 0;
1139 /* Fall through. */
1140 case O_big:
1141 case O_constant:
1142 case O_register:
1143 expressionP->X_add_symbol = NULL;
1144 /* Fall through. */
1145 case O_symbol:
1146 case O_uminus:
1147 case O_bit_not:
1148 expressionP->X_op_symbol = NULL;
1149 break;
1150 case O_subtract:
1151 if (expressionP->X_op_symbol == expressionP->X_add_symbol
1152 || ((expressionP->X_op_symbol->sy_frag
1153 == expressionP->X_add_symbol->sy_frag)
1154 && SEG_NORMAL (S_GET_SEGMENT (expressionP->X_add_symbol))
1155 && (S_GET_VALUE (expressionP->X_op_symbol)
1156 == S_GET_VALUE (expressionP->X_add_symbol))))
1157 {
1158 addressT diff = (S_GET_VALUE (expressionP->X_add_symbol)
1159 - S_GET_VALUE (expressionP->X_op_symbol));
1160
1161 expressionP->X_op = O_constant;
1162 expressionP->X_add_symbol = NULL;
1163 expressionP->X_op_symbol = NULL;
1164 expressionP->X_add_number += diff;
1165 }
1166 break;
1167 default:
1168 break;
1169 }
1170 }
1171 \f
1172 /* Expression parser. */
1173
1174 /*
1175 * We allow an empty expression, and just assume (absolute,0) silently.
1176 * Unary operators and parenthetical expressions are treated as operands.
1177 * As usual, Q==quantity==operand, O==operator, X==expression mnemonics.
1178 *
1179 * We used to do a aho/ullman shift-reduce parser, but the logic got so
1180 * warped that I flushed it and wrote a recursive-descent parser instead.
1181 * Now things are stable, would anybody like to write a fast parser?
1182 * Most expressions are either register (which does not even reach here)
1183 * or 1 symbol. Then "symbol+constant" and "symbol-symbol" are common.
1184 * So I guess it doesn't really matter how inefficient more complex expressions
1185 * are parsed.
1186 *
1187 * After expr(RANK,resultP) input_line_pointer->operator of rank <= RANK.
1188 * Also, we have consumed any leading or trailing spaces (operand does that)
1189 * and done all intervening operators.
1190 *
1191 * This returns the segment of the result, which will be
1192 * absolute_section or the segment of a symbol.
1193 */
1194
1195 #undef __
1196 #define __ O_illegal
1197
1198 static operatorT op_encoding[256] =
1199 { /* maps ASCII->operators */
1200
1201 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1202 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1203
1204 __, O_bit_or_not, __, __, __, O_modulus, O_bit_and, __,
1205 __, __, O_multiply, O_add, __, O_subtract, __, O_divide,
1206 __, __, __, __, __, __, __, __,
1207 __, __, __, __, O_lt, __, O_gt, __,
1208 __, __, __, __, __, __, __, __,
1209 __, __, __, __, __, __, __, __,
1210 __, __, __, __, __, __, __, __,
1211 __, __, __, __, __, __, O_bit_exclusive_or, __,
1212 __, __, __, __, __, __, __, __,
1213 __, __, __, __, __, __, __, __,
1214 __, __, __, __, __, __, __, __,
1215 __, __, __, __, O_bit_inclusive_or, __, __, __,
1216
1217 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1218 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1219 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1220 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1221 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1222 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1223 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1224 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
1225 };
1226
1227
1228 /*
1229 * Rank Examples
1230 * 0 operand, (expression)
1231 * 1 ||
1232 * 2 &&
1233 * 3 = <> < <= >= >
1234 * 4 + -
1235 * 5 used for * / % in MRI mode
1236 * 6 & ^ ! |
1237 * 7 * / % << >>
1238 * 8 unary - unary ~
1239 */
1240 static operator_rankT op_rank[] =
1241 {
1242 0, /* O_illegal */
1243 0, /* O_absent */
1244 0, /* O_constant */
1245 0, /* O_symbol */
1246 0, /* O_symbol_rva */
1247 0, /* O_register */
1248 0, /* O_bit */
1249 8, /* O_uminus */
1250 8, /* O_bit_not */
1251 8, /* O_logical_not */
1252 7, /* O_multiply */
1253 7, /* O_divide */
1254 7, /* O_modulus */
1255 7, /* O_left_shift */
1256 7, /* O_right_shift */
1257 6, /* O_bit_inclusive_or */
1258 6, /* O_bit_or_not */
1259 6, /* O_bit_exclusive_or */
1260 6, /* O_bit_and */
1261 4, /* O_add */
1262 4, /* O_subtract */
1263 3, /* O_eq */
1264 3, /* O_ne */
1265 3, /* O_lt */
1266 3, /* O_le */
1267 3, /* O_ge */
1268 3, /* O_gt */
1269 2, /* O_logical_and */
1270 1 /* O_logical_or */
1271 };
1272
1273 /* Initialize the expression parser. */
1274
1275 void
1276 expr_begin ()
1277 {
1278 /* In MRI mode for the m68k, multiplication and division have lower
1279 precedence than the bit wise operators. */
1280 if (flag_m68k_mri)
1281 {
1282 op_rank[O_multiply] = 5;
1283 op_rank[O_divide] = 5;
1284 op_rank[O_modulus] = 5;
1285 op_encoding['"'] = O_bit_not;
1286 }
1287
1288 /* Verify that X_op field is wide enough. */
1289 {
1290 expressionS e;
1291 e.X_op = O_max;
1292 assert (e.X_op == O_max);
1293 }
1294 }
1295 \f
1296 /* Return the encoding for the operator at INPUT_LINE_POINTER.
1297 Advance INPUT_LINE_POINTER to the last character in the operator
1298 (i.e., don't change it for a single character operator). */
1299
1300 static inline operatorT
1301 operator ()
1302 {
1303 int c;
1304 operatorT ret;
1305
1306 c = *input_line_pointer;
1307
1308 switch (c)
1309 {
1310 default:
1311 return op_encoding[c];
1312
1313 case '<':
1314 switch (input_line_pointer[1])
1315 {
1316 default:
1317 return op_encoding[c];
1318 case '<':
1319 ret = O_left_shift;
1320 break;
1321 case '>':
1322 ret = O_ne;
1323 break;
1324 case '=':
1325 ret = O_le;
1326 break;
1327 }
1328 ++input_line_pointer;
1329 return ret;
1330
1331 case '>':
1332 switch (input_line_pointer[1])
1333 {
1334 default:
1335 return op_encoding[c];
1336 case '>':
1337 ret = O_right_shift;
1338 break;
1339 case '=':
1340 ret = O_ge;
1341 break;
1342 }
1343 ++input_line_pointer;
1344 return ret;
1345
1346 case '!':
1347 /* We accept !! as equivalent to ^ for MRI compatibility. */
1348 if (input_line_pointer[1] != '!')
1349 {
1350 if (flag_m68k_mri)
1351 return O_bit_inclusive_or;
1352 return op_encoding[c];
1353 }
1354 ++input_line_pointer;
1355 return O_bit_exclusive_or;
1356
1357 case '|':
1358 if (input_line_pointer[1] != '|')
1359 return op_encoding[c];
1360
1361 ++input_line_pointer;
1362 return O_logical_or;
1363
1364 case '&':
1365 if (input_line_pointer[1] != '&')
1366 return op_encoding[c];
1367
1368 ++input_line_pointer;
1369 return O_logical_and;
1370 }
1371
1372 /*NOTREACHED*/
1373 }
1374
1375 /* Parse an expression. */
1376
1377 segT
1378 expr (rank, resultP)
1379 operator_rankT rank; /* Larger # is higher rank. */
1380 expressionS *resultP; /* Deliver result here. */
1381 {
1382 segT retval;
1383 expressionS right;
1384 operatorT op_left;
1385 operatorT op_right;
1386
1387 know (rank >= 0);
1388
1389 retval = operand (resultP);
1390
1391 know (*input_line_pointer != ' '); /* Operand() gobbles spaces. */
1392
1393 op_left = operator ();
1394 while (op_left != O_illegal && op_rank[(int) op_left] > rank)
1395 {
1396 segT rightseg;
1397
1398 input_line_pointer++; /*->after 1st character of operator. */
1399
1400 rightseg = expr (op_rank[(int) op_left], &right);
1401 if (right.X_op == O_absent)
1402 {
1403 as_warn ("missing operand; zero assumed");
1404 right.X_op = O_constant;
1405 right.X_add_number = 0;
1406 right.X_add_symbol = NULL;
1407 right.X_op_symbol = NULL;
1408 }
1409
1410 know (*input_line_pointer != ' ');
1411
1412 if (retval == undefined_section)
1413 {
1414 if (SEG_NORMAL (rightseg))
1415 retval = rightseg;
1416 }
1417 else if (! SEG_NORMAL (retval))
1418 retval = rightseg;
1419 else if (SEG_NORMAL (rightseg)
1420 && retval != rightseg
1421 #ifdef DIFF_EXPR_OK
1422 && op_left != O_subtract
1423 #endif
1424 )
1425 as_bad ("operation combines symbols in different segments");
1426
1427 op_right = operator ();
1428
1429 know (op_right == O_illegal || op_rank[(int) op_right] <= op_rank[(int) op_left]);
1430 know ((int) op_left >= (int) O_multiply
1431 && (int) op_left <= (int) O_logical_or);
1432
1433 /* input_line_pointer->after right-hand quantity. */
1434 /* left-hand quantity in resultP */
1435 /* right-hand quantity in right. */
1436 /* operator in op_left. */
1437
1438 if (resultP->X_op == O_big)
1439 {
1440 as_warn ("left operand is a %s; integer 0 assumed",
1441 resultP->X_add_number > 0 ? "bignum" : "float");
1442 resultP->X_op = O_constant;
1443 resultP->X_add_number = 0;
1444 resultP->X_add_symbol = NULL;
1445 resultP->X_op_symbol = NULL;
1446 }
1447 if (right.X_op == O_big)
1448 {
1449 as_warn ("right operand is a %s; integer 0 assumed",
1450 right.X_add_number > 0 ? "bignum" : "float");
1451 right.X_op = O_constant;
1452 right.X_add_number = 0;
1453 right.X_add_symbol = NULL;
1454 right.X_op_symbol = NULL;
1455 }
1456
1457 /* Optimize common cases. */
1458 if (op_left == O_add && right.X_op == O_constant)
1459 {
1460 /* X + constant. */
1461 resultP->X_add_number += right.X_add_number;
1462 }
1463 /* This case comes up in PIC code. */
1464 else if (op_left == O_subtract
1465 && right.X_op == O_symbol
1466 && resultP->X_op == O_symbol
1467 && (right.X_add_symbol->sy_frag
1468 == resultP->X_add_symbol->sy_frag)
1469 && SEG_NORMAL (S_GET_SEGMENT (right.X_add_symbol)))
1470
1471 {
1472 resultP->X_add_number += right.X_add_number;
1473 resultP->X_add_number += (S_GET_VALUE (resultP->X_add_symbol)
1474 - S_GET_VALUE (right.X_add_symbol));
1475 resultP->X_op = O_constant;
1476 resultP->X_add_symbol = 0;
1477 }
1478 else if (op_left == O_subtract && right.X_op == O_constant)
1479 {
1480 /* X - constant. */
1481 resultP->X_add_number -= right.X_add_number;
1482 }
1483 else if (op_left == O_add && resultP->X_op == O_constant)
1484 {
1485 /* Constant + X. */
1486 resultP->X_op = right.X_op;
1487 resultP->X_add_symbol = right.X_add_symbol;
1488 resultP->X_op_symbol = right.X_op_symbol;
1489 resultP->X_add_number += right.X_add_number;
1490 retval = rightseg;
1491 }
1492 else if (resultP->X_op == O_constant && right.X_op == O_constant)
1493 {
1494 /* Constant OP constant. */
1495 offsetT v = right.X_add_number;
1496 if (v == 0 && (op_left == O_divide || op_left == O_modulus))
1497 {
1498 as_warn ("division by zero");
1499 v = 1;
1500 }
1501 switch (op_left)
1502 {
1503 default: abort ();
1504 case O_multiply: resultP->X_add_number *= v; break;
1505 case O_divide: resultP->X_add_number /= v; break;
1506 case O_modulus: resultP->X_add_number %= v; break;
1507 case O_left_shift: resultP->X_add_number <<= v; break;
1508 case O_right_shift:
1509 /* We always use unsigned shifts, to avoid relying on
1510 characteristics of the compiler used to compile gas. */
1511 resultP->X_add_number =
1512 (offsetT) ((valueT) resultP->X_add_number >> (valueT) v);
1513 break;
1514 case O_bit_inclusive_or: resultP->X_add_number |= v; break;
1515 case O_bit_or_not: resultP->X_add_number |= ~v; break;
1516 case O_bit_exclusive_or: resultP->X_add_number ^= v; break;
1517 case O_bit_and: resultP->X_add_number &= v; break;
1518 case O_add: resultP->X_add_number += v; break;
1519 case O_subtract: resultP->X_add_number -= v; break;
1520 case O_eq:
1521 resultP->X_add_number =
1522 resultP->X_add_number == v ? ~ (offsetT) 0 : 0;
1523 break;
1524 case O_ne:
1525 resultP->X_add_number =
1526 resultP->X_add_number != v ? ~ (offsetT) 0 : 0;
1527 break;
1528 case O_lt:
1529 resultP->X_add_number =
1530 resultP->X_add_number < v ? ~ (offsetT) 0 : 0;
1531 break;
1532 case O_le:
1533 resultP->X_add_number =
1534 resultP->X_add_number <= v ? ~ (offsetT) 0 : 0;
1535 break;
1536 case O_ge:
1537 resultP->X_add_number =
1538 resultP->X_add_number >= v ? ~ (offsetT) 0 : 0;
1539 break;
1540 case O_gt:
1541 resultP->X_add_number =
1542 resultP->X_add_number > v ? ~ (offsetT) 0 : 0;
1543 break;
1544 case O_logical_and:
1545 resultP->X_add_number = resultP->X_add_number && v;
1546 break;
1547 case O_logical_or:
1548 resultP->X_add_number = resultP->X_add_number || v;
1549 break;
1550 }
1551 }
1552 else if (resultP->X_op == O_symbol
1553 && right.X_op == O_symbol
1554 && (op_left == O_add
1555 || op_left == O_subtract
1556 || (resultP->X_add_number == 0
1557 && right.X_add_number == 0)))
1558 {
1559 /* Symbol OP symbol. */
1560 resultP->X_op = op_left;
1561 resultP->X_op_symbol = right.X_add_symbol;
1562 if (op_left == O_add)
1563 resultP->X_add_number += right.X_add_number;
1564 else if (op_left == O_subtract)
1565 resultP->X_add_number -= right.X_add_number;
1566 }
1567 else
1568 {
1569 /* The general case. */
1570 resultP->X_add_symbol = make_expr_symbol (resultP);
1571 resultP->X_op_symbol = make_expr_symbol (&right);
1572 resultP->X_op = op_left;
1573 resultP->X_add_number = 0;
1574 resultP->X_unsigned = 1;
1575 }
1576
1577 op_left = op_right;
1578 } /* While next operator is >= this rank. */
1579
1580 /* The PA port needs this information. */
1581 if (resultP->X_add_symbol)
1582 resultP->X_add_symbol->sy_used = 1;
1583
1584 return resultP->X_op == O_constant ? absolute_section : retval;
1585 }
1586 \f
1587 /*
1588 * get_symbol_end()
1589 *
1590 * This lives here because it belongs equally in expr.c & read.c.
1591 * Expr.c is just a branch office read.c anyway, and putting it
1592 * here lessens the crowd at read.c.
1593 *
1594 * Assume input_line_pointer is at start of symbol name.
1595 * Advance input_line_pointer past symbol name.
1596 * Turn that character into a '\0', returning its former value.
1597 * This allows a string compare (RMS wants symbol names to be strings)
1598 * of the symbol name.
1599 * There will always be a char following symbol name, because all good
1600 * lines end in end-of-line.
1601 */
1602 char
1603 get_symbol_end ()
1604 {
1605 char c;
1606
1607 /* We accept \001 in a name in case this is being called with a
1608 constructed string. */
1609 if (is_name_beginner (c = *input_line_pointer++) || c == '\001')
1610 while (is_part_of_name (c = *input_line_pointer++)
1611 || c == '\001')
1612 ;
1613 *--input_line_pointer = 0;
1614 return (c);
1615 }
1616
1617
1618 unsigned int
1619 get_single_number ()
1620 {
1621 expressionS exp;
1622 operand (&exp);
1623 return exp.X_add_number;
1624
1625 }
1626
1627 /* end of expr.c */
This page took 0.061657 seconds and 4 git commands to generate.