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