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