]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gas/app.c
Fix AMD64 return value ABI in expression evaluation
[thirdparty/binutils-gdb.git] / gas / app.c
1 /* This is the Assembler Pre-Processor
2 Copyright (C) 1987-2019 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, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 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 /* Modified by Allen Wirfs-Brock, Instantiations Inc 2/90. */
22 /* App, the assembler pre-processor. This pre-processor strips out
23 excess spaces, turns single-quoted characters into a decimal
24 constant, and turns the # in # <number> <filename> <garbage> into a
25 .linefile. This needs better error-handling. */
26
27 #include "as.h"
28
29 #if (__STDC__ != 1)
30 #ifndef const
31 #define const /* empty */
32 #endif
33 #endif
34
35 #ifdef H_TICK_HEX
36 int enable_h_tick_hex = 0;
37 #endif
38
39 #ifdef TC_M68K
40 /* Whether we are scrubbing in m68k MRI mode. This is different from
41 flag_m68k_mri, because the two flags will be affected by the .mri
42 pseudo-op at different times. */
43 static int scrub_m68k_mri;
44
45 /* The pseudo-op which switches in and out of MRI mode. See the
46 comment in do_scrub_chars. */
47 static const char mri_pseudo[] = ".mri 0";
48 #else
49 #define scrub_m68k_mri 0
50 #endif
51
52 #if defined TC_ARM && defined OBJ_ELF
53 /* The pseudo-op for which we need to special-case `@' characters.
54 See the comment in do_scrub_chars. */
55 static const char symver_pseudo[] = ".symver";
56 static const char * symver_state;
57 #endif
58 #ifdef TC_ARM
59 static char last_char;
60 #endif
61
62 static char lex[256];
63 static const char symbol_chars[] =
64 "$._ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
65
66 #define LEX_IS_SYMBOL_COMPONENT 1
67 #define LEX_IS_WHITESPACE 2
68 #define LEX_IS_LINE_SEPARATOR 3
69 #define LEX_IS_COMMENT_START 4
70 #define LEX_IS_LINE_COMMENT_START 5
71 #define LEX_IS_TWOCHAR_COMMENT_1ST 6
72 #define LEX_IS_STRINGQUOTE 8
73 #define LEX_IS_COLON 9
74 #define LEX_IS_NEWLINE 10
75 #define LEX_IS_ONECHAR_QUOTE 11
76 #ifdef TC_V850
77 #define LEX_IS_DOUBLEDASH_1ST 12
78 #endif
79 #ifdef TC_M32R
80 #define DOUBLEBAR_PARALLEL
81 #endif
82 #ifdef DOUBLEBAR_PARALLEL
83 #define LEX_IS_DOUBLEBAR_1ST 13
84 #endif
85 #define LEX_IS_PARALLEL_SEPARATOR 14
86 #ifdef H_TICK_HEX
87 #define LEX_IS_H 15
88 #endif
89 #define IS_SYMBOL_COMPONENT(c) (lex[c] == LEX_IS_SYMBOL_COMPONENT)
90 #define IS_WHITESPACE(c) (lex[c] == LEX_IS_WHITESPACE)
91 #define IS_LINE_SEPARATOR(c) (lex[c] == LEX_IS_LINE_SEPARATOR)
92 #define IS_PARALLEL_SEPARATOR(c) (lex[c] == LEX_IS_PARALLEL_SEPARATOR)
93 #define IS_COMMENT(c) (lex[c] == LEX_IS_COMMENT_START)
94 #define IS_LINE_COMMENT(c) (lex[c] == LEX_IS_LINE_COMMENT_START)
95 #define IS_NEWLINE(c) (lex[c] == LEX_IS_NEWLINE)
96
97 static int process_escape (int);
98
99 /* FIXME-soon: The entire lexer/parser thingy should be
100 built statically at compile time rather than dynamically
101 each and every time the assembler is run. xoxorich. */
102
103 void
104 do_scrub_begin (int m68k_mri ATTRIBUTE_UNUSED)
105 {
106 const char *p;
107 int c;
108
109 lex[' '] = LEX_IS_WHITESPACE;
110 lex['\t'] = LEX_IS_WHITESPACE;
111 lex['\r'] = LEX_IS_WHITESPACE;
112 lex['\n'] = LEX_IS_NEWLINE;
113 lex[':'] = LEX_IS_COLON;
114
115 #ifdef TC_M68K
116 scrub_m68k_mri = m68k_mri;
117
118 if (! m68k_mri)
119 #endif
120 {
121 lex['"'] = LEX_IS_STRINGQUOTE;
122
123 #if ! defined (TC_HPPA)
124 lex['\''] = LEX_IS_ONECHAR_QUOTE;
125 #endif
126
127 #ifdef SINGLE_QUOTE_STRINGS
128 lex['\''] = LEX_IS_STRINGQUOTE;
129 #endif
130 }
131
132 /* Note: if any other character can be LEX_IS_STRINGQUOTE, the loop
133 in state 5 of do_scrub_chars must be changed. */
134
135 /* Note that these override the previous defaults, e.g. if ';' is a
136 comment char, then it isn't a line separator. */
137 for (p = symbol_chars; *p; ++p)
138 lex[(unsigned char) *p] = LEX_IS_SYMBOL_COMPONENT;
139
140 for (c = 128; c < 256; ++c)
141 lex[c] = LEX_IS_SYMBOL_COMPONENT;
142
143 #ifdef tc_symbol_chars
144 /* This macro permits the processor to specify all characters which
145 may appears in an operand. This will prevent the scrubber from
146 discarding meaningful whitespace in certain cases. The i386
147 backend uses this to support prefixes, which can confuse the
148 scrubber as to whether it is parsing operands or opcodes. */
149 for (p = tc_symbol_chars; *p; ++p)
150 lex[(unsigned char) *p] = LEX_IS_SYMBOL_COMPONENT;
151 #endif
152
153 /* The m68k backend wants to be able to change comment_chars. */
154 #ifndef tc_comment_chars
155 #define tc_comment_chars comment_chars
156 #endif
157 for (p = tc_comment_chars; *p; p++)
158 lex[(unsigned char) *p] = LEX_IS_COMMENT_START;
159
160 for (p = line_comment_chars; *p; p++)
161 lex[(unsigned char) *p] = LEX_IS_LINE_COMMENT_START;
162
163 #ifndef tc_line_separator_chars
164 #define tc_line_separator_chars line_separator_chars
165 #endif
166 for (p = tc_line_separator_chars; *p; p++)
167 lex[(unsigned char) *p] = LEX_IS_LINE_SEPARATOR;
168
169 #ifdef tc_parallel_separator_chars
170 /* This macro permits the processor to specify all characters which
171 separate parallel insns on the same line. */
172 for (p = tc_parallel_separator_chars; *p; p++)
173 lex[(unsigned char) *p] = LEX_IS_PARALLEL_SEPARATOR;
174 #endif
175
176 /* Only allow slash-star comments if slash is not in use.
177 FIXME: This isn't right. We should always permit them. */
178 if (lex['/'] == 0)
179 lex['/'] = LEX_IS_TWOCHAR_COMMENT_1ST;
180
181 #ifdef TC_M68K
182 if (m68k_mri)
183 {
184 lex['\''] = LEX_IS_STRINGQUOTE;
185 lex[';'] = LEX_IS_COMMENT_START;
186 lex['*'] = LEX_IS_LINE_COMMENT_START;
187 /* The MRI documentation says '!' is LEX_IS_COMMENT_START, but
188 then it can't be used in an expression. */
189 lex['!'] = LEX_IS_LINE_COMMENT_START;
190 }
191 #endif
192
193 #ifdef TC_V850
194 lex['-'] = LEX_IS_DOUBLEDASH_1ST;
195 #endif
196 #ifdef DOUBLEBAR_PARALLEL
197 lex['|'] = LEX_IS_DOUBLEBAR_1ST;
198 #endif
199 #ifdef TC_D30V
200 /* Must do this is we want VLIW instruction with "->" or "<-". */
201 lex['-'] = LEX_IS_SYMBOL_COMPONENT;
202 #endif
203
204 #ifdef H_TICK_HEX
205 if (enable_h_tick_hex)
206 {
207 lex['h'] = LEX_IS_H;
208 lex['H'] = LEX_IS_H;
209 }
210 #endif
211 }
212
213 /* Saved state of the scrubber. */
214 static int state;
215 static int old_state;
216 static const char *out_string;
217 static char out_buf[20];
218 static int add_newlines;
219 static char *saved_input;
220 static size_t saved_input_len;
221 static char input_buffer[32 * 1024];
222 static const char *mri_state;
223 static char mri_last_ch;
224
225 /* Data structure for saving the state of app across #include's. Note that
226 app is called asynchronously to the parsing of the .include's, so our
227 state at the time .include is interpreted is completely unrelated.
228 That's why we have to save it all. */
229
230 struct app_save
231 {
232 int state;
233 int old_state;
234 const char * out_string;
235 char out_buf[sizeof (out_buf)];
236 int add_newlines;
237 char * saved_input;
238 size_t saved_input_len;
239 #ifdef TC_M68K
240 int scrub_m68k_mri;
241 #endif
242 const char * mri_state;
243 char mri_last_ch;
244 #if defined TC_ARM && defined OBJ_ELF
245 const char * symver_state;
246 #endif
247 #ifdef TC_ARM
248 char last_char;
249 #endif
250 };
251
252 char *
253 app_push (void)
254 {
255 struct app_save *saved;
256
257 saved = XNEW (struct app_save);
258 saved->state = state;
259 saved->old_state = old_state;
260 saved->out_string = out_string;
261 memcpy (saved->out_buf, out_buf, sizeof (out_buf));
262 saved->add_newlines = add_newlines;
263 if (saved_input == NULL)
264 saved->saved_input = NULL;
265 else
266 {
267 saved->saved_input = XNEWVEC (char, saved_input_len);
268 memcpy (saved->saved_input, saved_input, saved_input_len);
269 saved->saved_input_len = saved_input_len;
270 }
271 #ifdef TC_M68K
272 saved->scrub_m68k_mri = scrub_m68k_mri;
273 #endif
274 saved->mri_state = mri_state;
275 saved->mri_last_ch = mri_last_ch;
276 #if defined TC_ARM && defined OBJ_ELF
277 saved->symver_state = symver_state;
278 #endif
279 #ifdef TC_ARM
280 saved->last_char = last_char;
281 #endif
282
283 /* do_scrub_begin() is not useful, just wastes time. */
284
285 state = 0;
286 saved_input = NULL;
287 add_newlines = 0;
288
289 return (char *) saved;
290 }
291
292 void
293 app_pop (char *arg)
294 {
295 struct app_save *saved = (struct app_save *) arg;
296
297 /* There is no do_scrub_end (). */
298 state = saved->state;
299 old_state = saved->old_state;
300 out_string = saved->out_string;
301 memcpy (out_buf, saved->out_buf, sizeof (out_buf));
302 add_newlines = saved->add_newlines;
303 if (saved->saved_input == NULL)
304 saved_input = NULL;
305 else
306 {
307 gas_assert (saved->saved_input_len <= sizeof (input_buffer));
308 memcpy (input_buffer, saved->saved_input, saved->saved_input_len);
309 saved_input = input_buffer;
310 saved_input_len = saved->saved_input_len;
311 free (saved->saved_input);
312 }
313 #ifdef TC_M68K
314 scrub_m68k_mri = saved->scrub_m68k_mri;
315 #endif
316 mri_state = saved->mri_state;
317 mri_last_ch = saved->mri_last_ch;
318 #if defined TC_ARM && defined OBJ_ELF
319 symver_state = saved->symver_state;
320 #endif
321 #ifdef TC_ARM
322 last_char = saved->last_char;
323 #endif
324
325 free (arg);
326 }
327
328 /* @@ This assumes that \n &c are the same on host and target. This is not
329 necessarily true. */
330
331 static int
332 process_escape (int ch)
333 {
334 switch (ch)
335 {
336 case 'b':
337 return '\b';
338 case 'f':
339 return '\f';
340 case 'n':
341 return '\n';
342 case 'r':
343 return '\r';
344 case 't':
345 return '\t';
346 case '\'':
347 return '\'';
348 case '"':
349 return '\"';
350 default:
351 return ch;
352 }
353 }
354
355 /* This function is called to process input characters. The GET
356 parameter is used to retrieve more input characters. GET should
357 set its parameter to point to a buffer, and return the length of
358 the buffer; it should return 0 at end of file. The scrubbed output
359 characters are put into the buffer starting at TOSTART; the TOSTART
360 buffer is TOLEN bytes in length. The function returns the number
361 of scrubbed characters put into TOSTART. This will be TOLEN unless
362 end of file was seen. This function is arranged as a state
363 machine, and saves its state so that it may return at any point.
364 This is the way the old code used to work. */
365
366 size_t
367 do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen)
368 {
369 char *to = tostart;
370 char *toend = tostart + tolen;
371 char *from;
372 char *fromend;
373 size_t fromlen;
374 int ch, ch2 = 0;
375 /* Character that started the string we're working on. */
376 static char quotechar;
377
378 /*State 0: beginning of normal line
379 1: After first whitespace on line (flush more white)
380 2: After first non-white (opcode) on line (keep 1white)
381 3: after second white on line (into operands) (flush white)
382 4: after putting out a .linefile, put out digits
383 5: parsing a string, then go to old-state
384 6: putting out \ escape in a "d string.
385 7: no longer used
386 8: no longer used
387 9: After seeing symbol char in state 3 (keep 1white after symchar)
388 10: After seeing whitespace in state 9 (keep white before symchar)
389 11: After seeing a symbol character in state 0 (eg a label definition)
390 -1: output string in out_string and go to the state in old_state
391 -2: flush text until a '*' '/' is seen, then go to state old_state
392 #ifdef TC_V850
393 12: After seeing a dash, looking for a second dash as a start
394 of comment.
395 #endif
396 #ifdef DOUBLEBAR_PARALLEL
397 13: After seeing a vertical bar, looking for a second
398 vertical bar as a parallel expression separator.
399 #endif
400 #ifdef TC_PREDICATE_START_CHAR
401 14: After seeing a predicate start character at state 0, looking
402 for a predicate end character as predicate.
403 15: After seeing a predicate start character at state 1, looking
404 for a predicate end character as predicate.
405 #endif
406 #ifdef TC_Z80
407 16: After seeing an 'a' or an 'A' at the start of a symbol
408 17: After seeing an 'f' or an 'F' in state 16
409 #endif
410 */
411
412 /* I added states 9 and 10 because the MIPS ECOFF assembler uses
413 constructs like ``.loc 1 20''. This was turning into ``.loc
414 120''. States 9 and 10 ensure that a space is never dropped in
415 between characters which could appear in an identifier. Ian
416 Taylor, ian@cygnus.com.
417
418 I added state 11 so that something like "Lfoo add %r25,%r26,%r27" works
419 correctly on the PA (and any other target where colons are optional).
420 Jeff Law, law@cs.utah.edu.
421
422 I added state 13 so that something like "cmp r1, r2 || trap #1" does not
423 get squashed into "cmp r1,r2||trap#1", with the all important space
424 between the 'trap' and the '#1' being eliminated. nickc@cygnus.com */
425
426 /* This macro gets the next input character. */
427
428 #define GET() \
429 (from < fromend \
430 ? * (unsigned char *) (from++) \
431 : (saved_input = NULL, \
432 fromlen = (*get) (input_buffer, sizeof input_buffer), \
433 from = input_buffer, \
434 fromend = from + fromlen, \
435 (fromlen == 0 \
436 ? EOF \
437 : * (unsigned char *) (from++))))
438
439 /* This macro pushes a character back on the input stream. */
440
441 #define UNGET(uch) (*--from = (uch))
442
443 /* This macro puts a character into the output buffer. If this
444 character fills the output buffer, this macro jumps to the label
445 TOFULL. We use this rather ugly approach because we need to
446 handle two different termination conditions: EOF on the input
447 stream, and a full output buffer. It would be simpler if we
448 always read in the entire input stream before processing it, but
449 I don't want to make such a significant change to the assembler's
450 memory usage. */
451
452 #define PUT(pch) \
453 do \
454 { \
455 *to++ = (pch); \
456 if (to >= toend) \
457 goto tofull; \
458 } \
459 while (0)
460
461 if (saved_input != NULL)
462 {
463 from = saved_input;
464 fromend = from + saved_input_len;
465 }
466 else
467 {
468 fromlen = (*get) (input_buffer, sizeof input_buffer);
469 if (fromlen == 0)
470 return 0;
471 from = input_buffer;
472 fromend = from + fromlen;
473 }
474
475 while (1)
476 {
477 /* The cases in this switch end with continue, in order to
478 branch back to the top of this while loop and generate the
479 next output character in the appropriate state. */
480 switch (state)
481 {
482 case -1:
483 ch = *out_string++;
484 if (*out_string == '\0')
485 {
486 state = old_state;
487 old_state = 3;
488 }
489 PUT (ch);
490 continue;
491
492 case -2:
493 for (;;)
494 {
495 do
496 {
497 ch = GET ();
498
499 if (ch == EOF)
500 {
501 as_warn (_("end of file in comment"));
502 goto fromeof;
503 }
504
505 if (ch == '\n')
506 PUT ('\n');
507 }
508 while (ch != '*');
509
510 while ((ch = GET ()) == '*')
511 ;
512
513 if (ch == EOF)
514 {
515 as_warn (_("end of file in comment"));
516 goto fromeof;
517 }
518
519 if (ch == '/')
520 break;
521
522 UNGET (ch);
523 }
524
525 state = old_state;
526 UNGET (' ');
527 continue;
528
529 case 4:
530 ch = GET ();
531 if (ch == EOF)
532 goto fromeof;
533 else if (ch >= '0' && ch <= '9')
534 PUT (ch);
535 else
536 {
537 while (ch != EOF && IS_WHITESPACE (ch))
538 ch = GET ();
539 if (ch == '"')
540 {
541 quotechar = ch;
542 state = 5;
543 old_state = 3;
544 PUT (ch);
545 }
546 else
547 {
548 while (ch != EOF && ch != '\n')
549 ch = GET ();
550 state = 0;
551 PUT (ch);
552 }
553 }
554 continue;
555
556 case 5:
557 /* We are going to copy everything up to a quote character,
558 with special handling for a backslash. We try to
559 optimize the copying in the simple case without using the
560 GET and PUT macros. */
561 {
562 char *s;
563 ptrdiff_t len;
564
565 for (s = from; s < fromend; s++)
566 {
567 ch = *s;
568 if (ch == '\\'
569 || ch == quotechar
570 || ch == '\n')
571 break;
572 }
573 len = s - from;
574 if (len > toend - to)
575 len = toend - to;
576 if (len > 0)
577 {
578 memcpy (to, from, len);
579 to += len;
580 from += len;
581 if (to >= toend)
582 goto tofull;
583 }
584 }
585
586 ch = GET ();
587 if (ch == EOF)
588 {
589 /* This buffer is here specifically so
590 that the UNGET below will work. */
591 static char one_char_buf[1];
592
593 as_warn (_("end of file in string; '%c' inserted"), quotechar);
594 state = old_state;
595 from = fromend = one_char_buf + 1;
596 fromlen = 1;
597 UNGET ('\n');
598 PUT (quotechar);
599 }
600 else if (ch == quotechar)
601 {
602 state = old_state;
603 PUT (ch);
604 }
605 #ifndef NO_STRING_ESCAPES
606 else if (ch == '\\')
607 {
608 state = 6;
609 PUT (ch);
610 }
611 #endif
612 else if (scrub_m68k_mri && ch == '\n')
613 {
614 /* Just quietly terminate the string. This permits lines like
615 bne label loop if we haven't reach end yet. */
616 state = old_state;
617 UNGET (ch);
618 PUT ('\'');
619 }
620 else
621 {
622 PUT (ch);
623 }
624 continue;
625
626 case 6:
627 state = 5;
628 ch = GET ();
629 switch (ch)
630 {
631 /* Handle strings broken across lines, by turning '\n' into
632 '\\' and 'n'. */
633 case '\n':
634 UNGET ('n');
635 add_newlines++;
636 PUT ('\\');
637 continue;
638
639 case EOF:
640 as_warn (_("end of file in string; '%c' inserted"), quotechar);
641 PUT (quotechar);
642 continue;
643
644 case '"':
645 case '\\':
646 case 'b':
647 case 'f':
648 case 'n':
649 case 'r':
650 case 't':
651 case 'v':
652 case 'x':
653 case 'X':
654 case '0':
655 case '1':
656 case '2':
657 case '3':
658 case '4':
659 case '5':
660 case '6':
661 case '7':
662 break;
663
664 default:
665 #ifdef ONLY_STANDARD_ESCAPES
666 as_warn (_("unknown escape '\\%c' in string; ignored"), ch);
667 #endif
668 break;
669 }
670 PUT (ch);
671 continue;
672
673 #ifdef DOUBLEBAR_PARALLEL
674 case 13:
675 ch = GET ();
676 if (ch != '|')
677 abort ();
678
679 /* Reset back to state 1 and pretend that we are parsing a
680 line from just after the first white space. */
681 state = 1;
682 PUT ('|');
683 #ifdef TC_TIC6X
684 /* "||^" is used for SPMASKed instructions. */
685 ch = GET ();
686 if (ch == EOF)
687 goto fromeof;
688 else if (ch == '^')
689 PUT ('^');
690 else
691 UNGET (ch);
692 #endif
693 continue;
694 #endif
695 #ifdef TC_Z80
696 case 16:
697 /* We have seen an 'a' at the start of a symbol, look for an 'f'. */
698 ch = GET ();
699 if (ch == 'f' || ch == 'F')
700 {
701 state = 17;
702 PUT (ch);
703 }
704 else
705 {
706 state = 9;
707 break;
708 }
709 /* Fall through. */
710 case 17:
711 /* We have seen "af" at the start of a symbol,
712 a ' here is a part of that symbol. */
713 ch = GET ();
714 state = 9;
715 if (ch == '\'')
716 /* Change to avoid warning about unclosed string. */
717 PUT ('`');
718 else if (ch != EOF)
719 UNGET (ch);
720 break;
721 #endif
722 }
723
724 /* OK, we are somewhere in states 0 through 4 or 9 through 11. */
725
726 /* flushchar: */
727 ch = GET ();
728
729 #ifdef TC_PREDICATE_START_CHAR
730 if (ch == TC_PREDICATE_START_CHAR && (state == 0 || state == 1))
731 {
732 state += 14;
733 PUT (ch);
734 continue;
735 }
736 else if (state == 14 || state == 15)
737 {
738 if (ch == TC_PREDICATE_END_CHAR)
739 {
740 state -= 14;
741 PUT (ch);
742 ch = GET ();
743 }
744 else
745 {
746 PUT (ch);
747 continue;
748 }
749 }
750 #endif
751
752 recycle:
753
754 #if defined TC_ARM && defined OBJ_ELF
755 /* We need to watch out for .symver directives. See the comment later
756 in this function. */
757 if (symver_state == NULL)
758 {
759 if ((state == 0 || state == 1) && ch == symver_pseudo[0])
760 symver_state = symver_pseudo + 1;
761 }
762 else
763 {
764 /* We advance to the next state if we find the right
765 character. */
766 if (ch != '\0' && (*symver_state == ch))
767 ++symver_state;
768 else if (*symver_state != '\0')
769 /* We did not get the expected character, or we didn't
770 get a valid terminating character after seeing the
771 entire pseudo-op, so we must go back to the beginning. */
772 symver_state = NULL;
773 else
774 {
775 /* We've read the entire pseudo-op. If this is the end
776 of the line, go back to the beginning. */
777 if (IS_NEWLINE (ch))
778 symver_state = NULL;
779 }
780 }
781 #endif /* TC_ARM && OBJ_ELF */
782
783 #ifdef TC_M68K
784 /* We want to have pseudo-ops which control whether we are in
785 MRI mode or not. Unfortunately, since m68k MRI mode affects
786 the scrubber, that means that we need a special purpose
787 recognizer here. */
788 if (mri_state == NULL)
789 {
790 if ((state == 0 || state == 1)
791 && ch == mri_pseudo[0])
792 mri_state = mri_pseudo + 1;
793 }
794 else
795 {
796 /* We advance to the next state if we find the right
797 character, or if we need a space character and we get any
798 whitespace character, or if we need a '0' and we get a
799 '1' (this is so that we only need one state to handle
800 ``.mri 0'' and ``.mri 1''). */
801 if (ch != '\0'
802 && (*mri_state == ch
803 || (*mri_state == ' '
804 && lex[ch] == LEX_IS_WHITESPACE)
805 || (*mri_state == '0'
806 && ch == '1')))
807 {
808 mri_last_ch = ch;
809 ++mri_state;
810 }
811 else if (*mri_state != '\0'
812 || (lex[ch] != LEX_IS_WHITESPACE
813 && lex[ch] != LEX_IS_NEWLINE))
814 {
815 /* We did not get the expected character, or we didn't
816 get a valid terminating character after seeing the
817 entire pseudo-op, so we must go back to the
818 beginning. */
819 mri_state = NULL;
820 }
821 else
822 {
823 /* We've read the entire pseudo-op. mips_last_ch is
824 either '0' or '1' indicating whether to enter or
825 leave MRI mode. */
826 do_scrub_begin (mri_last_ch == '1');
827 mri_state = NULL;
828
829 /* We continue handling the character as usual. The
830 main gas reader must also handle the .mri pseudo-op
831 to control expression parsing and the like. */
832 }
833 }
834 #endif
835
836 if (ch == EOF)
837 {
838 if (state != 0)
839 {
840 as_warn (_("end of file not at end of a line; newline inserted"));
841 state = 0;
842 PUT ('\n');
843 }
844 goto fromeof;
845 }
846
847 switch (lex[ch])
848 {
849 case LEX_IS_WHITESPACE:
850 do
851 {
852 ch = GET ();
853 }
854 while (ch != EOF && IS_WHITESPACE (ch));
855 if (ch == EOF)
856 goto fromeof;
857
858 if (state == 0)
859 {
860 /* Preserve a single whitespace character at the
861 beginning of a line. */
862 state = 1;
863 UNGET (ch);
864 PUT (' ');
865 break;
866 }
867
868 #ifdef KEEP_WHITE_AROUND_COLON
869 if (lex[ch] == LEX_IS_COLON)
870 {
871 /* Only keep this white if there's no white *after* the
872 colon. */
873 ch2 = GET ();
874 if (ch2 != EOF)
875 UNGET (ch2);
876 if (!IS_WHITESPACE (ch2))
877 {
878 state = 9;
879 UNGET (ch);
880 PUT (' ');
881 break;
882 }
883 }
884 #endif
885 if (IS_COMMENT (ch)
886 || ch == '/'
887 || IS_LINE_SEPARATOR (ch)
888 || IS_PARALLEL_SEPARATOR (ch))
889 {
890 if (scrub_m68k_mri)
891 {
892 /* In MRI mode, we keep these spaces. */
893 UNGET (ch);
894 PUT (' ');
895 break;
896 }
897 goto recycle;
898 }
899
900 /* If we're in state 2 or 11, we've seen a non-white
901 character followed by whitespace. If the next character
902 is ':', this is whitespace after a label name which we
903 normally must ignore. In MRI mode, though, spaces are
904 not permitted between the label and the colon. */
905 if ((state == 2 || state == 11)
906 && lex[ch] == LEX_IS_COLON
907 && ! scrub_m68k_mri)
908 {
909 state = 1;
910 PUT (ch);
911 break;
912 }
913
914 switch (state)
915 {
916 case 1:
917 /* We can arrive here if we leave a leading whitespace
918 character at the beginning of a line. */
919 goto recycle;
920 case 2:
921 state = 3;
922 if (to + 1 < toend)
923 {
924 /* Optimize common case by skipping UNGET/GET. */
925 PUT (' '); /* Sp after opco */
926 goto recycle;
927 }
928 UNGET (ch);
929 PUT (' ');
930 break;
931 case 3:
932 #ifndef TC_KEEP_OPERAND_SPACES
933 /* For TI C6X, we keep these spaces as they may separate
934 functional unit specifiers from operands. */
935 if (scrub_m68k_mri)
936 #endif
937 {
938 /* In MRI mode, we keep these spaces. */
939 UNGET (ch);
940 PUT (' ');
941 break;
942 }
943 goto recycle; /* Sp in operands */
944 case 9:
945 case 10:
946 #ifndef TC_KEEP_OPERAND_SPACES
947 if (scrub_m68k_mri)
948 #endif
949 {
950 /* In MRI mode, we keep these spaces. */
951 state = 3;
952 UNGET (ch);
953 PUT (' ');
954 break;
955 }
956 state = 10; /* Sp after symbol char */
957 goto recycle;
958 case 11:
959 if (LABELS_WITHOUT_COLONS || flag_m68k_mri)
960 state = 1;
961 else
962 {
963 /* We know that ch is not ':', since we tested that
964 case above. Therefore this is not a label, so it
965 must be the opcode, and we've just seen the
966 whitespace after it. */
967 state = 3;
968 }
969 UNGET (ch);
970 PUT (' '); /* Sp after label definition. */
971 break;
972 default:
973 BAD_CASE (state);
974 }
975 break;
976
977 case LEX_IS_TWOCHAR_COMMENT_1ST:
978 ch2 = GET ();
979 if (ch2 == '*')
980 {
981 for (;;)
982 {
983 do
984 {
985 ch2 = GET ();
986 if (ch2 != EOF && IS_NEWLINE (ch2))
987 add_newlines++;
988 }
989 while (ch2 != EOF && ch2 != '*');
990
991 while (ch2 == '*')
992 ch2 = GET ();
993
994 if (ch2 == EOF || ch2 == '/')
995 break;
996
997 /* This UNGET will ensure that we count newlines
998 correctly. */
999 UNGET (ch2);
1000 }
1001
1002 if (ch2 == EOF)
1003 as_warn (_("end of file in multiline comment"));
1004
1005 ch = ' ';
1006 goto recycle;
1007 }
1008 #ifdef DOUBLESLASH_LINE_COMMENTS
1009 else if (ch2 == '/')
1010 {
1011 do
1012 {
1013 ch = GET ();
1014 }
1015 while (ch != EOF && !IS_NEWLINE (ch));
1016 if (ch == EOF)
1017 as_warn ("end of file in comment; newline inserted");
1018 state = 0;
1019 PUT ('\n');
1020 break;
1021 }
1022 #endif
1023 else
1024 {
1025 if (ch2 != EOF)
1026 UNGET (ch2);
1027 if (state == 9 || state == 10)
1028 state = 3;
1029 PUT (ch);
1030 }
1031 break;
1032
1033 case LEX_IS_STRINGQUOTE:
1034 quotechar = ch;
1035 if (state == 10)
1036 {
1037 /* Preserve the whitespace in foo "bar". */
1038 UNGET (ch);
1039 state = 3;
1040 PUT (' ');
1041
1042 /* PUT didn't jump out. We could just break, but we
1043 know what will happen, so optimize a bit. */
1044 ch = GET ();
1045 old_state = 3;
1046 }
1047 else if (state == 9)
1048 old_state = 3;
1049 else
1050 old_state = state;
1051 state = 5;
1052 PUT (ch);
1053 break;
1054
1055 case LEX_IS_ONECHAR_QUOTE:
1056 #ifdef H_TICK_HEX
1057 if (state == 9 && enable_h_tick_hex)
1058 {
1059 char c;
1060
1061 c = GET ();
1062 as_warn ("'%c found after symbol", c);
1063 UNGET (c);
1064 }
1065 #endif
1066 if (state == 10)
1067 {
1068 /* Preserve the whitespace in foo 'b'. */
1069 UNGET (ch);
1070 state = 3;
1071 PUT (' ');
1072 break;
1073 }
1074 ch = GET ();
1075 if (ch == EOF)
1076 {
1077 as_warn (_("end of file after a one-character quote; \\0 inserted"));
1078 ch = 0;
1079 }
1080 if (ch == '\\')
1081 {
1082 ch = GET ();
1083 if (ch == EOF)
1084 {
1085 as_warn (_("end of file in escape character"));
1086 ch = '\\';
1087 }
1088 else
1089 ch = process_escape (ch);
1090 }
1091 sprintf (out_buf, "%d", (int) (unsigned char) ch);
1092
1093 /* None of these 'x constants for us. We want 'x'. */
1094 if ((ch = GET ()) != '\'')
1095 {
1096 #ifdef REQUIRE_CHAR_CLOSE_QUOTE
1097 as_warn (_("missing close quote; (assumed)"));
1098 #else
1099 if (ch != EOF)
1100 UNGET (ch);
1101 #endif
1102 }
1103 if (strlen (out_buf) == 1)
1104 {
1105 PUT (out_buf[0]);
1106 break;
1107 }
1108 if (state == 9)
1109 old_state = 3;
1110 else
1111 old_state = state;
1112 state = -1;
1113 out_string = out_buf;
1114 PUT (*out_string++);
1115 break;
1116
1117 case LEX_IS_COLON:
1118 #ifdef KEEP_WHITE_AROUND_COLON
1119 state = 9;
1120 #else
1121 if (state == 9 || state == 10)
1122 state = 3;
1123 else if (state != 3)
1124 state = 1;
1125 #endif
1126 PUT (ch);
1127 break;
1128
1129 case LEX_IS_NEWLINE:
1130 /* Roll out a bunch of newlines from inside comments, etc. */
1131 if (add_newlines)
1132 {
1133 --add_newlines;
1134 UNGET (ch);
1135 }
1136 /* Fall through. */
1137
1138 case LEX_IS_LINE_SEPARATOR:
1139 state = 0;
1140 PUT (ch);
1141 break;
1142
1143 case LEX_IS_PARALLEL_SEPARATOR:
1144 state = 1;
1145 PUT (ch);
1146 break;
1147
1148 #ifdef TC_V850
1149 case LEX_IS_DOUBLEDASH_1ST:
1150 ch2 = GET ();
1151 if (ch2 != '-')
1152 {
1153 if (ch2 != EOF)
1154 UNGET (ch2);
1155 goto de_fault;
1156 }
1157 /* Read and skip to end of line. */
1158 do
1159 {
1160 ch = GET ();
1161 }
1162 while (ch != EOF && ch != '\n');
1163
1164 if (ch == EOF)
1165 as_warn (_("end of file in comment; newline inserted"));
1166
1167 state = 0;
1168 PUT ('\n');
1169 break;
1170 #endif
1171 #ifdef DOUBLEBAR_PARALLEL
1172 case LEX_IS_DOUBLEBAR_1ST:
1173 ch2 = GET ();
1174 if (ch2 != EOF)
1175 UNGET (ch2);
1176 if (ch2 != '|')
1177 goto de_fault;
1178
1179 /* Handle '||' in two states as invoking PUT twice might
1180 result in the first one jumping out of this loop. We'd
1181 then lose track of the state and one '|' char. */
1182 state = 13;
1183 PUT ('|');
1184 break;
1185 #endif
1186 case LEX_IS_LINE_COMMENT_START:
1187 /* FIXME-someday: The two character comment stuff was badly
1188 thought out. On i386, we want '/' as line comment start
1189 AND we want C style comments. hence this hack. The
1190 whole lexical process should be reworked. xoxorich. */
1191 if (ch == '/')
1192 {
1193 ch2 = GET ();
1194 if (ch2 == '*')
1195 {
1196 old_state = 3;
1197 state = -2;
1198 break;
1199 }
1200 else if (ch2 != EOF)
1201 {
1202 UNGET (ch2);
1203 }
1204 }
1205
1206 if (state == 0 || state == 1) /* Only comment at start of line. */
1207 {
1208 int startch;
1209
1210 startch = ch;
1211
1212 do
1213 {
1214 ch = GET ();
1215 }
1216 while (ch != EOF && IS_WHITESPACE (ch));
1217
1218 if (ch == EOF)
1219 {
1220 as_warn (_("end of file in comment; newline inserted"));
1221 PUT ('\n');
1222 break;
1223 }
1224
1225 if (ch < '0' || ch > '9' || state != 0 || startch != '#')
1226 {
1227 /* Not a cpp line. */
1228 while (ch != EOF && !IS_NEWLINE (ch))
1229 ch = GET ();
1230 if (ch == EOF)
1231 {
1232 as_warn (_("end of file in comment; newline inserted"));
1233 PUT ('\n');
1234 }
1235 else /* IS_NEWLINE (ch) */
1236 {
1237 /* To process non-zero add_newlines. */
1238 UNGET (ch);
1239 }
1240 state = 0;
1241 break;
1242 }
1243 /* Looks like `# 123 "filename"' from cpp. */
1244 UNGET (ch);
1245 old_state = 4;
1246 state = -1;
1247 if (scrub_m68k_mri)
1248 out_string = "\tlinefile ";
1249 else
1250 out_string = "\t.linefile ";
1251 PUT (*out_string++);
1252 break;
1253 }
1254
1255 #ifdef TC_D10V
1256 /* All insns end in a char for which LEX_IS_SYMBOL_COMPONENT is true.
1257 Trap is the only short insn that has a first operand that is
1258 neither register nor label.
1259 We must prevent exef0f ||trap #1 to degenerate to exef0f ||trap#1 .
1260 We can't make '#' LEX_IS_SYMBOL_COMPONENT because it is
1261 already LEX_IS_LINE_COMMENT_START. However, it is the
1262 only character in line_comment_chars for d10v, hence we
1263 can recognize it as such. */
1264 /* An alternative approach would be to reset the state to 1 when
1265 we see '||', '<'- or '->', but that seems to be overkill. */
1266 if (state == 10)
1267 PUT (' ');
1268 #endif
1269 /* We have a line comment character which is not at the
1270 start of a line. If this is also a normal comment
1271 character, fall through. Otherwise treat it as a default
1272 character. */
1273 if (strchr (tc_comment_chars, ch) == NULL
1274 && (! scrub_m68k_mri
1275 || (ch != '!' && ch != '*')))
1276 goto de_fault;
1277 if (scrub_m68k_mri
1278 && (ch == '!' || ch == '*' || ch == '#')
1279 && state != 1
1280 && state != 10)
1281 goto de_fault;
1282 /* Fall through. */
1283 case LEX_IS_COMMENT_START:
1284 #if defined TC_ARM && defined OBJ_ELF
1285 /* On the ARM, `@' is the comment character.
1286 Unfortunately this is also a special character in ELF .symver
1287 directives (and .type, though we deal with those another way).
1288 So we check if this line is such a directive, and treat
1289 the character as default if so. This is a hack. */
1290 if ((symver_state != NULL) && (*symver_state == 0))
1291 goto de_fault;
1292 #endif
1293
1294 #ifdef TC_ARM
1295 /* For the ARM, care is needed not to damage occurrences of \@
1296 by stripping the @ onwards. Yuck. */
1297 if ((to > tostart ? to[-1] : last_char) == '\\')
1298 /* Do not treat the @ as a start-of-comment. */
1299 goto de_fault;
1300 #endif
1301
1302 #ifdef WARN_COMMENTS
1303 if (!found_comment)
1304 found_comment_file = as_where (&found_comment);
1305 #endif
1306 do
1307 {
1308 ch = GET ();
1309 }
1310 while (ch != EOF && !IS_NEWLINE (ch));
1311 if (ch == EOF)
1312 as_warn (_("end of file in comment; newline inserted"));
1313 state = 0;
1314 PUT ('\n');
1315 break;
1316
1317 #ifdef H_TICK_HEX
1318 case LEX_IS_H:
1319 /* Look for strings like H'[0-9A-Fa-f] and if found, replace
1320 the H' with 0x to make them gas-style hex characters. */
1321 if (enable_h_tick_hex)
1322 {
1323 char quot;
1324
1325 quot = GET ();
1326 if (quot == '\'')
1327 {
1328 UNGET ('x');
1329 ch = '0';
1330 }
1331 else
1332 UNGET (quot);
1333 }
1334 #endif
1335 /* Fall through. */
1336
1337 case LEX_IS_SYMBOL_COMPONENT:
1338 if (state == 10)
1339 {
1340 /* This is a symbol character following another symbol
1341 character, with whitespace in between. We skipped
1342 the whitespace earlier, so output it now. */
1343 UNGET (ch);
1344 state = 3;
1345 PUT (' ');
1346 break;
1347 }
1348
1349 #ifdef TC_Z80
1350 /* "af'" is a symbol containing '\''. */
1351 if (state == 3 && (ch == 'a' || ch == 'A'))
1352 {
1353 state = 16;
1354 PUT (ch);
1355 ch = GET ();
1356 if (ch == 'f' || ch == 'F')
1357 {
1358 state = 17;
1359 PUT (ch);
1360 break;
1361 }
1362 else
1363 {
1364 state = 9;
1365 if (ch == EOF || !IS_SYMBOL_COMPONENT (ch))
1366 {
1367 if (ch != EOF)
1368 UNGET (ch);
1369 break;
1370 }
1371 }
1372 }
1373 #endif
1374 if (state == 3)
1375 state = 9;
1376
1377 /* This is a common case. Quickly copy CH and all the
1378 following symbol component or normal characters. */
1379 if (to + 1 < toend
1380 && mri_state == NULL
1381 #if defined TC_ARM && defined OBJ_ELF
1382 && symver_state == NULL
1383 #endif
1384 )
1385 {
1386 char *s;
1387 ptrdiff_t len;
1388
1389 for (s = from; s < fromend; s++)
1390 {
1391 int type;
1392
1393 ch2 = *(unsigned char *) s;
1394 type = lex[ch2];
1395 if (type != 0
1396 && type != LEX_IS_SYMBOL_COMPONENT)
1397 break;
1398 }
1399
1400 if (s > from)
1401 /* Handle the last character normally, for
1402 simplicity. */
1403 --s;
1404
1405 len = s - from;
1406
1407 if (len > (toend - to) - 1)
1408 len = (toend - to) - 1;
1409
1410 if (len > 0)
1411 {
1412 PUT (ch);
1413 memcpy (to, from, len);
1414 to += len;
1415 from += len;
1416 if (to >= toend)
1417 goto tofull;
1418 ch = GET ();
1419 }
1420 }
1421
1422 /* Fall through. */
1423 default:
1424 de_fault:
1425 /* Some relatively `normal' character. */
1426 if (state == 0)
1427 {
1428 state = 11; /* Now seeing label definition. */
1429 }
1430 else if (state == 1)
1431 {
1432 state = 2; /* Ditto. */
1433 }
1434 else if (state == 9)
1435 {
1436 if (!IS_SYMBOL_COMPONENT (ch))
1437 state = 3;
1438 }
1439 else if (state == 10)
1440 {
1441 if (ch == '\\')
1442 {
1443 /* Special handling for backslash: a backslash may
1444 be the beginning of a formal parameter (of a
1445 macro) following another symbol character, with
1446 whitespace in between. If that is the case, we
1447 output a space before the parameter. Strictly
1448 speaking, correct handling depends upon what the
1449 macro parameter expands into; if the parameter
1450 expands into something which does not start with
1451 an operand character, then we don't want to keep
1452 the space. We don't have enough information to
1453 make the right choice, so here we are making the
1454 choice which is more likely to be correct. */
1455 if (to + 1 >= toend)
1456 {
1457 /* If we're near the end of the buffer, save the
1458 character for the next time round. Otherwise
1459 we'll lose our state. */
1460 UNGET (ch);
1461 goto tofull;
1462 }
1463 *to++ = ' ';
1464 }
1465
1466 state = 3;
1467 }
1468 PUT (ch);
1469 break;
1470 }
1471 }
1472
1473 /*NOTREACHED*/
1474
1475 fromeof:
1476 /* We have reached the end of the input. */
1477 #ifdef TC_ARM
1478 if (to > tostart)
1479 last_char = to[-1];
1480 #endif
1481 return to - tostart;
1482
1483 tofull:
1484 /* The output buffer is full. Save any input we have not yet
1485 processed. */
1486 if (fromend > from)
1487 {
1488 saved_input = from;
1489 saved_input_len = fromend - from;
1490 }
1491 else
1492 saved_input = NULL;
1493
1494 #ifdef TC_ARM
1495 if (to > tostart)
1496 last_char = to[-1];
1497 #endif
1498 return to - tostart;
1499 }