1 /* This is the Assembler Pre-Processor
2 Copyright (C) 1987-2018 Free Software Foundation, Inc.
4 This file is part of GAS, the GNU Assembler.
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)
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.
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
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. */
31 #define const /* empty */
36 int enable_h_tick_hex = 0;
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;
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";
49 #define scrub_m68k_mri 0
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;
59 static char last_char;
63 static const char symbol_chars[] =
64 "$._ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
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
77 #define LEX_IS_DOUBLEDASH_1ST 12
80 #define DOUBLEBAR_PARALLEL
82 #ifdef DOUBLEBAR_PARALLEL
83 #define LEX_IS_DOUBLEBAR_1ST 13
85 #define LEX_IS_PARALLEL_SEPARATOR 14
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)
97 static int process_escape (int);
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. */
104 do_scrub_begin (int m68k_mri ATTRIBUTE_UNUSED)
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;
116 scrub_m68k_mri = m68k_mri;
121 lex['"'] = LEX_IS_STRINGQUOTE;
123 #if ! defined (TC_HPPA) && ! defined (TC_I370)
124 /* I370 uses single-quotes to delimit integer, float constants. */
125 lex['\''] = LEX_IS_ONECHAR_QUOTE;
128 #ifdef SINGLE_QUOTE_STRINGS
129 lex['\''] = LEX_IS_STRINGQUOTE;
133 /* Note: if any other character can be LEX_IS_STRINGQUOTE, the loop
134 in state 5 of do_scrub_chars must be changed. */
136 /* Note that these override the previous defaults, e.g. if ';' is a
137 comment char, then it isn't a line separator. */
138 for (p = symbol_chars; *p; ++p)
139 lex[(unsigned char) *p] = LEX_IS_SYMBOL_COMPONENT;
141 for (c = 128; c < 256; ++c)
142 lex[c] = LEX_IS_SYMBOL_COMPONENT;
144 #ifdef tc_symbol_chars
145 /* This macro permits the processor to specify all characters which
146 may appears in an operand. This will prevent the scrubber from
147 discarding meaningful whitespace in certain cases. The i386
148 backend uses this to support prefixes, which can confuse the
149 scrubber as to whether it is parsing operands or opcodes. */
150 for (p = tc_symbol_chars; *p; ++p)
151 lex[(unsigned char) *p] = LEX_IS_SYMBOL_COMPONENT;
154 /* The m68k backend wants to be able to change comment_chars. */
155 #ifndef tc_comment_chars
156 #define tc_comment_chars comment_chars
158 for (p = tc_comment_chars; *p; p++)
159 lex[(unsigned char) *p] = LEX_IS_COMMENT_START;
161 for (p = line_comment_chars; *p; p++)
162 lex[(unsigned char) *p] = LEX_IS_LINE_COMMENT_START;
164 #ifndef tc_line_separator_chars
165 #define tc_line_separator_chars line_separator_chars
167 for (p = tc_line_separator_chars; *p; p++)
168 lex[(unsigned char) *p] = LEX_IS_LINE_SEPARATOR;
170 #ifdef tc_parallel_separator_chars
171 /* This macro permits the processor to specify all characters which
172 separate parallel insns on the same line. */
173 for (p = tc_parallel_separator_chars; *p; p++)
174 lex[(unsigned char) *p] = LEX_IS_PARALLEL_SEPARATOR;
177 /* Only allow slash-star comments if slash is not in use.
178 FIXME: This isn't right. We should always permit them. */
180 lex['/'] = LEX_IS_TWOCHAR_COMMENT_1ST;
185 lex['\''] = LEX_IS_STRINGQUOTE;
186 lex[';'] = LEX_IS_COMMENT_START;
187 lex['*'] = LEX_IS_LINE_COMMENT_START;
188 /* The MRI documentation says '!' is LEX_IS_COMMENT_START, but
189 then it can't be used in an expression. */
190 lex['!'] = LEX_IS_LINE_COMMENT_START;
195 lex['-'] = LEX_IS_DOUBLEDASH_1ST;
197 #ifdef DOUBLEBAR_PARALLEL
198 lex['|'] = LEX_IS_DOUBLEBAR_1ST;
201 /* Must do this is we want VLIW instruction with "->" or "<-". */
202 lex['-'] = LEX_IS_SYMBOL_COMPONENT;
206 if (enable_h_tick_hex)
214 /* Saved state of the scrubber. */
216 static int old_state;
217 static const char *out_string;
218 static char out_buf[20];
219 static int add_newlines;
220 static char *saved_input;
221 static size_t saved_input_len;
222 static char input_buffer[32 * 1024];
223 static const char *mri_state;
224 static char mri_last_ch;
226 /* Data structure for saving the state of app across #include's. Note that
227 app is called asynchronously to the parsing of the .include's, so our
228 state at the time .include is interpreted is completely unrelated.
229 That's why we have to save it all. */
235 const char * out_string;
236 char out_buf[sizeof (out_buf)];
239 size_t saved_input_len;
243 const char * mri_state;
245 #if defined TC_ARM && defined OBJ_ELF
246 const char * symver_state;
256 struct app_save *saved;
258 saved = XNEW (struct app_save);
259 saved->state = state;
260 saved->old_state = old_state;
261 saved->out_string = out_string;
262 memcpy (saved->out_buf, out_buf, sizeof (out_buf));
263 saved->add_newlines = add_newlines;
264 if (saved_input == NULL)
265 saved->saved_input = NULL;
268 saved->saved_input = XNEWVEC (char, saved_input_len);
269 memcpy (saved->saved_input, saved_input, saved_input_len);
270 saved->saved_input_len = saved_input_len;
273 saved->scrub_m68k_mri = scrub_m68k_mri;
275 saved->mri_state = mri_state;
276 saved->mri_last_ch = mri_last_ch;
277 #if defined TC_ARM && defined OBJ_ELF
278 saved->symver_state = symver_state;
281 saved->last_char = last_char;
284 /* do_scrub_begin() is not useful, just wastes time. */
290 return (char *) saved;
296 struct app_save *saved = (struct app_save *) arg;
298 /* There is no do_scrub_end (). */
299 state = saved->state;
300 old_state = saved->old_state;
301 out_string = saved->out_string;
302 memcpy (out_buf, saved->out_buf, sizeof (out_buf));
303 add_newlines = saved->add_newlines;
304 if (saved->saved_input == NULL)
308 gas_assert (saved->saved_input_len <= sizeof (input_buffer));
309 memcpy (input_buffer, saved->saved_input, saved->saved_input_len);
310 saved_input = input_buffer;
311 saved_input_len = saved->saved_input_len;
312 free (saved->saved_input);
315 scrub_m68k_mri = saved->scrub_m68k_mri;
317 mri_state = saved->mri_state;
318 mri_last_ch = saved->mri_last_ch;
319 #if defined TC_ARM && defined OBJ_ELF
320 symver_state = saved->symver_state;
323 last_char = saved->last_char;
329 /* @@ This assumes that \n &c are the same on host and target. This is not
333 process_escape (int ch)
356 /* This function is called to process input characters. The GET
357 parameter is used to retrieve more input characters. GET should
358 set its parameter to point to a buffer, and return the length of
359 the buffer; it should return 0 at end of file. The scrubbed output
360 characters are put into the buffer starting at TOSTART; the TOSTART
361 buffer is TOLEN bytes in length. The function returns the number
362 of scrubbed characters put into TOSTART. This will be TOLEN unless
363 end of file was seen. This function is arranged as a state
364 machine, and saves its state so that it may return at any point.
365 This is the way the old code used to work. */
368 do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen)
371 char *toend = tostart + tolen;
376 /* Character that started the string we're working on. */
377 static char quotechar;
379 /*State 0: beginning of normal line
380 1: After first whitespace on line (flush more white)
381 2: After first non-white (opcode) on line (keep 1white)
382 3: after second white on line (into operands) (flush white)
383 4: after putting out a .linefile, put out digits
384 5: parsing a string, then go to old-state
385 6: putting out \ escape in a "d string.
388 9: After seeing symbol char in state 3 (keep 1white after symchar)
389 10: After seeing whitespace in state 9 (keep white before symchar)
390 11: After seeing a symbol character in state 0 (eg a label definition)
391 -1: output string in out_string and go to the state in old_state
392 -2: flush text until a '*' '/' is seen, then go to state old_state
394 12: After seeing a dash, looking for a second dash as a start
397 #ifdef DOUBLEBAR_PARALLEL
398 13: After seeing a vertical bar, looking for a second
399 vertical bar as a parallel expression separator.
401 #ifdef TC_PREDICATE_START_CHAR
402 14: After seeing a predicate start character at state 0, looking
403 for a predicate end character as predicate.
404 15: After seeing a predicate start character at state 1, looking
405 for a predicate end character as predicate.
408 16: After seeing an 'a' or an 'A' at the start of a symbol
409 17: After seeing an 'f' or an 'F' in state 16
413 /* I added states 9 and 10 because the MIPS ECOFF assembler uses
414 constructs like ``.loc 1 20''. This was turning into ``.loc
415 120''. States 9 and 10 ensure that a space is never dropped in
416 between characters which could appear in an identifier. Ian
417 Taylor, ian@cygnus.com.
419 I added state 11 so that something like "Lfoo add %r25,%r26,%r27" works
420 correctly on the PA (and any other target where colons are optional).
421 Jeff Law, law@cs.utah.edu.
423 I added state 13 so that something like "cmp r1, r2 || trap #1" does not
424 get squashed into "cmp r1,r2||trap#1", with the all important space
425 between the 'trap' and the '#1' being eliminated. nickc@cygnus.com */
427 /* This macro gets the next input character. */
431 ? * (unsigned char *) (from++) \
432 : (saved_input = NULL, \
433 fromlen = (*get) (input_buffer, sizeof input_buffer), \
434 from = input_buffer, \
435 fromend = from + fromlen, \
438 : * (unsigned char *) (from++))))
440 /* This macro pushes a character back on the input stream. */
442 #define UNGET(uch) (*--from = (uch))
444 /* This macro puts a character into the output buffer. If this
445 character fills the output buffer, this macro jumps to the label
446 TOFULL. We use this rather ugly approach because we need to
447 handle two different termination conditions: EOF on the input
448 stream, and a full output buffer. It would be simpler if we
449 always read in the entire input stream before processing it, but
450 I don't want to make such a significant change to the assembler's
462 if (saved_input != NULL)
465 fromend = from + saved_input_len;
469 fromlen = (*get) (input_buffer, sizeof input_buffer);
473 fromend = from + fromlen;
478 /* The cases in this switch end with continue, in order to
479 branch back to the top of this while loop and generate the
480 next output character in the appropriate state. */
485 if (*out_string == '\0')
502 as_warn (_("end of file in comment"));
511 while ((ch = GET ()) == '*')
516 as_warn (_("end of file in comment"));
534 else if (ch >= '0' && ch <= '9')
538 while (ch != EOF && IS_WHITESPACE (ch))
549 while (ch != EOF && ch != '\n')
558 /* We are going to copy everything up to a quote character,
559 with special handling for a backslash. We try to
560 optimize the copying in the simple case without using the
561 GET and PUT macros. */
566 for (s = from; s < fromend; s++)
575 if (len > toend - to)
579 memcpy (to, from, len);
590 /* This buffer is here specifically so
591 that the UNGET below will work. */
592 static char one_char_buf[1];
594 as_warn (_("end of file in string; '%c' inserted"), quotechar);
596 from = fromend = one_char_buf + 1;
601 else if (ch == quotechar)
606 #ifndef NO_STRING_ESCAPES
613 else if (scrub_m68k_mri && ch == '\n')
615 /* Just quietly terminate the string. This permits lines like
616 bne label loop if we haven't reach end yet. */
632 /* Handle strings broken across lines, by turning '\n' into
641 as_warn (_("end of file in string; '%c' inserted"), quotechar);
666 #ifdef ONLY_STANDARD_ESCAPES
667 as_warn (_("unknown escape '\\%c' in string; ignored"), ch);
674 #ifdef DOUBLEBAR_PARALLEL
680 /* Reset back to state 1 and pretend that we are parsing a
681 line from just after the first white space. */
685 /* "||^" is used for SPMASKed instructions. */
698 /* We have seen an 'a' at the start of a symbol, look for an 'f'. */
700 if (ch == 'f' || ch == 'F')
712 /* We have seen "af" at the start of a symbol,
713 a ' here is a part of that symbol. */
717 /* Change to avoid warning about unclosed string. */
725 /* OK, we are somewhere in states 0 through 4 or 9 through 11. */
730 #ifdef TC_PREDICATE_START_CHAR
731 if (ch == TC_PREDICATE_START_CHAR && (state == 0 || state == 1))
737 else if (state == 14 || state == 15)
739 if (ch == TC_PREDICATE_END_CHAR)
755 #if defined TC_ARM && defined OBJ_ELF
756 /* We need to watch out for .symver directives. See the comment later
758 if (symver_state == NULL)
760 if ((state == 0 || state == 1) && ch == symver_pseudo[0])
761 symver_state = symver_pseudo + 1;
765 /* We advance to the next state if we find the right
767 if (ch != '\0' && (*symver_state == ch))
769 else if (*symver_state != '\0')
770 /* We did not get the expected character, or we didn't
771 get a valid terminating character after seeing the
772 entire pseudo-op, so we must go back to the beginning. */
776 /* We've read the entire pseudo-op. If this is the end
777 of the line, go back to the beginning. */
782 #endif /* TC_ARM && OBJ_ELF */
785 /* We want to have pseudo-ops which control whether we are in
786 MRI mode or not. Unfortunately, since m68k MRI mode affects
787 the scrubber, that means that we need a special purpose
789 if (mri_state == NULL)
791 if ((state == 0 || state == 1)
792 && ch == mri_pseudo[0])
793 mri_state = mri_pseudo + 1;
797 /* We advance to the next state if we find the right
798 character, or if we need a space character and we get any
799 whitespace character, or if we need a '0' and we get a
800 '1' (this is so that we only need one state to handle
801 ``.mri 0'' and ``.mri 1''). */
804 || (*mri_state == ' '
805 && lex[ch] == LEX_IS_WHITESPACE)
806 || (*mri_state == '0'
812 else if (*mri_state != '\0'
813 || (lex[ch] != LEX_IS_WHITESPACE
814 && lex[ch] != LEX_IS_NEWLINE))
816 /* We did not get the expected character, or we didn't
817 get a valid terminating character after seeing the
818 entire pseudo-op, so we must go back to the
824 /* We've read the entire pseudo-op. mips_last_ch is
825 either '0' or '1' indicating whether to enter or
827 do_scrub_begin (mri_last_ch == '1');
830 /* We continue handling the character as usual. The
831 main gas reader must also handle the .mri pseudo-op
832 to control expression parsing and the like. */
841 as_warn (_("end of file not at end of a line; newline inserted"));
850 case LEX_IS_WHITESPACE:
855 while (ch != EOF && IS_WHITESPACE (ch));
861 /* Preserve a single whitespace character at the
862 beginning of a line. */
869 #ifdef KEEP_WHITE_AROUND_COLON
870 if (lex[ch] == LEX_IS_COLON)
872 /* Only keep this white if there's no white *after* the
877 if (!IS_WHITESPACE (ch2))
888 || IS_LINE_SEPARATOR (ch)
889 || IS_PARALLEL_SEPARATOR (ch))
893 /* In MRI mode, we keep these spaces. */
901 /* If we're in state 2 or 11, we've seen a non-white
902 character followed by whitespace. If the next character
903 is ':', this is whitespace after a label name which we
904 normally must ignore. In MRI mode, though, spaces are
905 not permitted between the label and the colon. */
906 if ((state == 2 || state == 11)
907 && lex[ch] == LEX_IS_COLON
918 /* We can arrive here if we leave a leading whitespace
919 character at the beginning of a line. */
925 /* Optimize common case by skipping UNGET/GET. */
926 PUT (' '); /* Sp after opco */
933 #ifndef TC_KEEP_OPERAND_SPACES
934 /* For TI C6X, we keep these spaces as they may separate
935 functional unit specifiers from operands. */
939 /* In MRI mode, we keep these spaces. */
944 goto recycle; /* Sp in operands */
947 #ifndef TC_KEEP_OPERAND_SPACES
951 /* In MRI mode, we keep these spaces. */
957 state = 10; /* Sp after symbol char */
960 if (LABELS_WITHOUT_COLONS || flag_m68k_mri)
964 /* We know that ch is not ':', since we tested that
965 case above. Therefore this is not a label, so it
966 must be the opcode, and we've just seen the
967 whitespace after it. */
971 PUT (' '); /* Sp after label definition. */
978 case LEX_IS_TWOCHAR_COMMENT_1ST:
987 if (ch2 != EOF && IS_NEWLINE (ch2))
990 while (ch2 != EOF && ch2 != '*');
995 if (ch2 == EOF || ch2 == '/')
998 /* This UNGET will ensure that we count newlines
1004 as_warn (_("end of file in multiline comment"));
1009 #ifdef DOUBLESLASH_LINE_COMMENTS
1010 else if (ch2 == '/')
1016 while (ch != EOF && !IS_NEWLINE (ch));
1018 as_warn ("end of file in comment; newline inserted");
1028 if (state == 9 || state == 10)
1034 case LEX_IS_STRINGQUOTE:
1038 /* Preserve the whitespace in foo "bar". */
1043 /* PUT didn't jump out. We could just break, but we
1044 know what will happen, so optimize a bit. */
1048 else if (state == 9)
1056 case LEX_IS_ONECHAR_QUOTE:
1058 if (state == 9 && enable_h_tick_hex)
1063 as_warn ("'%c found after symbol", c);
1069 /* Preserve the whitespace in foo 'b'. */
1078 as_warn (_("end of file after a one-character quote; \\0 inserted"));
1086 as_warn (_("end of file in escape character"));
1090 ch = process_escape (ch);
1092 sprintf (out_buf, "%d", (int) (unsigned char) ch);
1094 /* None of these 'x constants for us. We want 'x'. */
1095 if ((ch = GET ()) != '\'')
1097 #ifdef REQUIRE_CHAR_CLOSE_QUOTE
1098 as_warn (_("missing close quote; (assumed)"));
1104 if (strlen (out_buf) == 1)
1114 out_string = out_buf;
1115 PUT (*out_string++);
1119 #ifdef KEEP_WHITE_AROUND_COLON
1122 if (state == 9 || state == 10)
1124 else if (state != 3)
1130 case LEX_IS_NEWLINE:
1131 /* Roll out a bunch of newlines from inside comments, etc. */
1139 case LEX_IS_LINE_SEPARATOR:
1144 case LEX_IS_PARALLEL_SEPARATOR:
1150 case LEX_IS_DOUBLEDASH_1ST:
1158 /* Read and skip to end of line. */
1163 while (ch != EOF && ch != '\n');
1166 as_warn (_("end of file in comment; newline inserted"));
1172 #ifdef DOUBLEBAR_PARALLEL
1173 case LEX_IS_DOUBLEBAR_1ST:
1180 /* Handle '||' in two states as invoking PUT twice might
1181 result in the first one jumping out of this loop. We'd
1182 then lose track of the state and one '|' char. */
1187 case LEX_IS_LINE_COMMENT_START:
1188 /* FIXME-someday: The two character comment stuff was badly
1189 thought out. On i386, we want '/' as line comment start
1190 AND we want C style comments. hence this hack. The
1191 whole lexical process should be reworked. xoxorich. */
1201 else if (ch2 != EOF)
1207 if (state == 0 || state == 1) /* Only comment at start of line. */
1217 while (ch != EOF && IS_WHITESPACE (ch));
1221 as_warn (_("end of file in comment; newline inserted"));
1226 if (ch < '0' || ch > '9' || state != 0 || startch != '#')
1228 /* Not a cpp line. */
1229 while (ch != EOF && !IS_NEWLINE (ch))
1233 as_warn (_("end of file in comment; newline inserted"));
1236 else /* IS_NEWLINE (ch) */
1238 /* To process non-zero add_newlines. */
1244 /* Looks like `# 123 "filename"' from cpp. */
1249 out_string = "\tlinefile ";
1251 out_string = "\t.linefile ";
1252 PUT (*out_string++);
1257 /* All insns end in a char for which LEX_IS_SYMBOL_COMPONENT is true.
1258 Trap is the only short insn that has a first operand that is
1259 neither register nor label.
1260 We must prevent exef0f ||trap #1 to degenerate to exef0f ||trap#1 .
1261 We can't make '#' LEX_IS_SYMBOL_COMPONENT because it is
1262 already LEX_IS_LINE_COMMENT_START. However, it is the
1263 only character in line_comment_chars for d10v, hence we
1264 can recognize it as such. */
1265 /* An alternative approach would be to reset the state to 1 when
1266 we see '||', '<'- or '->', but that seems to be overkill. */
1270 /* We have a line comment character which is not at the
1271 start of a line. If this is also a normal comment
1272 character, fall through. Otherwise treat it as a default
1274 if (strchr (tc_comment_chars, ch) == NULL
1275 && (! scrub_m68k_mri
1276 || (ch != '!' && ch != '*')))
1279 && (ch == '!' || ch == '*' || ch == '#')
1284 case LEX_IS_COMMENT_START:
1285 #if defined TC_ARM && defined OBJ_ELF
1286 /* On the ARM, `@' is the comment character.
1287 Unfortunately this is also a special character in ELF .symver
1288 directives (and .type, though we deal with those another way).
1289 So we check if this line is such a directive, and treat
1290 the character as default if so. This is a hack. */
1291 if ((symver_state != NULL) && (*symver_state == 0))
1296 /* For the ARM, care is needed not to damage occurrences of \@
1297 by stripping the @ onwards. Yuck. */
1298 if ((to > tostart ? to[-1] : last_char) == '\\')
1299 /* Do not treat the @ as a start-of-comment. */
1303 #ifdef WARN_COMMENTS
1305 found_comment_file = as_where (&found_comment);
1311 while (ch != EOF && !IS_NEWLINE (ch));
1313 as_warn (_("end of file in comment; newline inserted"));
1320 /* Look for strings like H'[0-9A-Fa-f] and if found, replace
1321 the H' with 0x to make them gas-style hex characters. */
1322 if (enable_h_tick_hex)
1338 case LEX_IS_SYMBOL_COMPONENT:
1341 /* This is a symbol character following another symbol
1342 character, with whitespace in between. We skipped
1343 the whitespace earlier, so output it now. */
1351 /* "af'" is a symbol containing '\''. */
1352 if (state == 3 && (ch == 'a' || ch == 'A'))
1357 if (ch == 'f' || ch == 'F')
1366 if (ch == EOF || !IS_SYMBOL_COMPONENT (ch))
1378 /* This is a common case. Quickly copy CH and all the
1379 following symbol component or normal characters. */
1381 && mri_state == NULL
1382 #if defined TC_ARM && defined OBJ_ELF
1383 && symver_state == NULL
1390 for (s = from; s < fromend; s++)
1394 ch2 = *(unsigned char *) s;
1397 && type != LEX_IS_SYMBOL_COMPONENT)
1402 /* Handle the last character normally, for
1408 if (len > (toend - to) - 1)
1409 len = (toend - to) - 1;
1414 memcpy (to, from, len);
1426 /* Some relatively `normal' character. */
1429 state = 11; /* Now seeing label definition. */
1431 else if (state == 1)
1433 state = 2; /* Ditto. */
1435 else if (state == 9)
1437 if (!IS_SYMBOL_COMPONENT (ch))
1440 else if (state == 10)
1444 /* Special handling for backslash: a backslash may
1445 be the beginning of a formal parameter (of a
1446 macro) following another symbol character, with
1447 whitespace in between. If that is the case, we
1448 output a space before the parameter. Strictly
1449 speaking, correct handling depends upon what the
1450 macro parameter expands into; if the parameter
1451 expands into something which does not start with
1452 an operand character, then we don't want to keep
1453 the space. We don't have enough information to
1454 make the right choice, so here we are making the
1455 choice which is more likely to be correct. */
1456 if (to + 1 >= toend)
1458 /* If we're near the end of the buffer, save the
1459 character for the next time round. Otherwise
1460 we'll lose our state. */
1477 /* We have reached the end of the input. */
1482 return to - tostart;
1485 /* The output buffer is full. Save any input we have not yet
1490 saved_input_len = fromend - from;
1499 return to - tostart;