]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - ld/ldlex.l
xfail undefweak-1 test for alpha
[thirdparty/binutils-gdb.git] / ld / ldlex.l
CommitLineData
b0556316 1%option nounput noyywrap
cfdf38f2 2
252b5132
RH
3%{
4
fd67aa11 5/* Copyright (C) 1991-2024 Free Software Foundation, Inc.
f96b4a7b 6 Written by Steve Chamberlain of Cygnus Support.
252b5132 7
f96b4a7b 8 This file is part of the GNU Binutils.
252b5132 9
f96b4a7b 10 This program is free software; you can redistribute it and/or modify
3ec57632 11 it under the terms of the GNU General Public License as published by
f96b4a7b
NC
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
252b5132 14
f96b4a7b 15 This program is distributed in the hope that it will be useful,
3ec57632
NC
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
252b5132 19
3ec57632 20 You should have received a copy of the GNU General Public License
f96b4a7b
NC
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
23 MA 02110-1301, USA. */
252b5132 24
3db64b00 25#include "bfd.h"
3882b010 26#include "safe-ctype.h"
e3e942e9 27#include "bfdlink.h"
1ff6de03 28#include "ctf-api.h"
252b5132 29#include "ld.h"
252b5132
RH
30#include "ldmisc.h"
31#include "ldexp.h"
32#include "ldlang.h"
df2a7313 33#include <ldgram.h>
252b5132
RH
34#include "ldfile.h"
35#include "ldlex.h"
36#include "ldmain.h"
d1b2b2dc 37#include "libiberty.h"
252b5132
RH
38
39/* The type of top-level parser input.
40 yylex and yyparse (indirectly) both check this. */
41input_type parser_input;
42
1753ed68
JB
43/* Line number in the current input file. */
44unsigned int lineno;
252b5132
RH
45
46/* The string we are currently lexing, or NULL if we are reading a
47 file. */
48const char *lex_string = NULL;
49
50/* Support for flex reading from more than one input file (stream).
51 `include_stack' is flex's input state for each open file;
52 `file_name_stack' is the file names. `lineno_stack' is the current
53 line numbers.
54
55 If `include_stack_ptr' is 0, we haven't started reading anything yet.
56 Otherwise, stack elements 0 through `include_stack_ptr - 1' are valid. */
57
58#undef YY_INPUT
d05c651b 59#define YY_INPUT(buf,result,max_size) result = yy_input (buf, max_size)
252b5132 60
5b806d27 61#ifndef YY_NO_UNPUT
297ba367 62#define YY_NO_UNPUT
5b806d27 63#endif
297ba367 64
252b5132
RH
65#define MAX_INCLUDE_DEPTH 10
66static YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
67static const char *file_name_stack[MAX_INCLUDE_DEPTH];
68static unsigned int lineno_stack[MAX_INCLUDE_DEPTH];
f4a23d42 69static unsigned int sysrooted_stack[MAX_INCLUDE_DEPTH];
252b5132
RH
70static unsigned int include_stack_ptr = 0;
71static int vers_node_nesting = 0;
72
d05c651b 73static int yy_input (char *, int);
1579bae1
AM
74static void comment (void);
75static void lex_warn_invalid (char *where, char *what);
252b5132 76
1579bae1 77/* STATES
af29a8ab
AM
78 EXPRESSION in an expression
79 SCRIPT in a script
80 INPUTLIST in a script, a filename-list
6c19b93b 81 MRI in an MRI script
af29a8ab
AM
82 WILD inside the braces of an output section or overlay,
83 for input section wildcards
252b5132
RH
84 VERS_START starting a Sun style mapfile
85 VERS_SCRIPT a Sun style mapfile
86 VERS_NODE a node within a Sun style mapfile
87*/
88#define RTOKEN(x) { yylval.token = x; return x; }
89
252b5132
RH
90%}
91
92%a 4000
93%o 5000
94
092da96a
AM
95WILDCHAR [_a-zA-Z0-9\/\.\\\$\~\-\+\:\[\]\,\=\?\*\^\!]
96FILENAMECHAR [_a-zA-Z0-9\/\.\\\$\~\-\+\:\[\]\,\=]
97NOCFILENAMECHAR [_a-zA-Z0-9\/\.\\\$\~\-\+\:\[\]]
98SYMBOLNAMECHAR [_a-zA-Z0-9\/\.\\\$\~]
99FILENAMECHAR1 [_a-zA-Z\/\.\\\$\~]
1c6aafe8 100SYMBOLNAMECHAR1 [_a-zA-Z\.\\\$]
1579bae1 101WHITE [ \t\n\r]+
252b5132 102
252b5132 103V_TAG [.$_a-zA-Z][._a-zA-Z0-9]*
5e35cbc2 104V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
252b5132
RH
105
106%s SCRIPT
eeed9cc7 107%s INPUTLIST
252b5132 108%s EXPRESSION
252b5132 109%s MRI
af29a8ab 110%s WILD
252b5132
RH
111%s VERS_START
112%s VERS_SCRIPT
113%s VERS_NODE
114%%
115
116 if (parser_input != input_selected)
117 {
118 /* The first token of the input determines the initial parser state. */
119 input_type t = parser_input;
120 parser_input = input_selected;
121 switch (t)
122 {
123 case input_script: return INPUT_SCRIPT; break;
124 case input_mri_script: return INPUT_MRI_SCRIPT; break;
125 case input_version_script: return INPUT_VERSION_SCRIPT; break;
55255dae 126 case input_dynamic_list: return INPUT_DYNAMIC_LIST; break;
252b5132
RH
127 case input_defsym: return INPUT_DEFSYM; break;
128 default: abort ();
129 }
130 }
131
af29a8ab
AM
132<SCRIPT,EXPRESSION,VERS_START,VERS_NODE,VERS_SCRIPT,INPUTLIST>"/*" {
133 comment (); }
252b5132 134
252b5132 135<MRI,EXPRESSION>"$"([0-9A-Fa-f])+ {
c217aed5 136 yylval.integer = strtoull (yytext + 1, 0, 16);
1579bae1 137 yylval.bigint.str = NULL;
252b5132
RH
138 return INT;
139 }
140
141<MRI,EXPRESSION>([0-9A-Fa-f])+(H|h|X|x|B|b|O|o|D|d) {
142 int ibase ;
1579bae1
AM
143 switch (yytext[yyleng - 1]) {
144 case 'X':
252b5132
RH
145 case 'x':
146 case 'H':
147 case 'h':
148 ibase = 16;
149 break;
150 case 'O':
151 case 'o':
152 ibase = 8;
153 break;
154 case 'B':
155 case 'b':
156 ibase = 2;
157 break;
158 default:
159 ibase = 10;
160 }
c217aed5 161 yylval.integer = strtoull (yytext, 0, ibase);
1579bae1 162 yylval.bigint.str = NULL;
252b5132
RH
163 return INT;
164 }
af29a8ab 165<SCRIPT,MRI,EXPRESSION>((("$"|0[xX])([0-9A-Fa-f])+)|(([0-9])+))(M|K|m|k)? {
252b5132 166 char *s = yytext;
2c382fb6 167 int ibase = 0;
252b5132
RH
168
169 if (*s == '$')
2c382fb6
AM
170 {
171 ++s;
172 ibase = 16;
173 }
c217aed5 174 yylval.integer = strtoull (s, 0, ibase);
1579bae1
AM
175 yylval.bigint.str = NULL;
176 if (yytext[yyleng - 1] == 'M'
177 || yytext[yyleng - 1] == 'm')
2c382fb6
AM
178 {
179 yylval.integer *= 1024 * 1024;
180 }
1579bae1
AM
181 else if (yytext[yyleng - 1] == 'K'
182 || yytext[yyleng - 1]=='k')
2c382fb6
AM
183 {
184 yylval.integer *= 1024;
185 }
186 else if (yytext[0] == '0'
187 && (yytext[1] == 'x'
188 || yytext[1] == 'X'))
189 {
190 yylval.bigint.str = xstrdup (yytext + 2);
191 }
252b5132
RH
192 return INT;
193 }
f400c8d2
AM
194
195 /* Some tokens that only appear in expressions must be enabled for
196 states other than EXPRESSION, since parser lookahead means they
197 must be recognised before the parser switches the lexer out of
198 SCRIPT or WILD state into EXPRESSION state.
199
200 This sort of thing happens for example with NAME in ldgram.y
201 "section" rule, which is immediately followed by ldlex_expression.
202 However, if you follow the grammar from "sec_or_group_p1" you see
203 "assignment" appearing in "statement_anywhere". Now,
204 "assignment" also has NAME as its first token, just like
205 "section". So the parser can't know whether it is in the
206 "section" or the "assignment" rule until it has scanned the next
207 token to find an assignment operator. Thus the next token after
208 NAME in the "section" rule may be lexed before the lexer is
209 switched to EXPRESSION state, and there are quite a number of
210 optional components. The first token in all those components
211 must be able to be lexed in SCRIPT state, as well as the
212 assignment operators. In fact, due to "opt_exp_with_type",
213 anything that can appear on the left hand side of "exp" might
214 need to be lexed in SCRIPT state.
215
216 MRI mode tends to cover everything in MRI scripts.
217 */
218<MRI,WILD>"]" { RTOKEN(']'); }
219<MRI,WILD>"[" { RTOKEN('['); }
220<SCRIPT,EXPRESSION,MRI,WILD>"<<=" { RTOKEN(LSHIFTEQ); }
221<SCRIPT,EXPRESSION,MRI,WILD>">>=" { RTOKEN(RSHIFTEQ); }
222<EXPRESSION,MRI>"||" { RTOKEN(OROR); }
223<EXPRESSION,MRI>"==" { RTOKEN(EQ); }
224<EXPRESSION,MRI>"!=" { RTOKEN(NE); }
225<EXPRESSION,MRI>">=" { RTOKEN(GE); }
226<EXPRESSION,MRI>"<=" { RTOKEN(LE); }
227<EXPRESSION,MRI>"<<" { RTOKEN(LSHIFT); }
228<EXPRESSION,MRI>">>" { RTOKEN(RSHIFT); }
229<SCRIPT,EXPRESSION,MRI,WILD>"+=" { RTOKEN(PLUSEQ); }
230<SCRIPT,EXPRESSION,MRI,WILD>"-=" { RTOKEN(MINUSEQ); }
231<SCRIPT,EXPRESSION,MRI,WILD>"*=" { RTOKEN(MULTEQ); }
232<SCRIPT,EXPRESSION,MRI,WILD>"/=" { RTOKEN(DIVEQ); }
233<SCRIPT,EXPRESSION,MRI,WILD>"&=" { RTOKEN(ANDEQ); }
234<SCRIPT,EXPRESSION,MRI,WILD>"|=" { RTOKEN(OREQ); }
b5c37946 235<SCRIPT,EXPRESSION,MRI,WILD>"^=" { RTOKEN(XOREQ); }
f400c8d2
AM
236<EXPRESSION,MRI>"&&" { RTOKEN(ANDAND); }
237<SCRIPT,EXPRESSION,MRI>">" { RTOKEN('>'); }
238<SCRIPT,EXPRESSION,MRI,INPUTLIST>"," { RTOKEN(','); }
239<EXPRESSION,MRI,WILD>"&" { RTOKEN('&'); }
240<EXPRESSION,MRI>"|" { RTOKEN('|'); }
241<SCRIPT,EXPRESSION,MRI>"~" { RTOKEN('~'); }
242<SCRIPT,EXPRESSION,MRI>"!" { RTOKEN('!'); }
243<EXPRESSION,MRI>"?" { RTOKEN('?'); }
244<EXPRESSION,MRI>"*" { RTOKEN('*'); }
245<SCRIPT,EXPRESSION,MRI>"+" { RTOKEN('+'); }
246<SCRIPT,EXPRESSION,MRI>"-" { RTOKEN('-'); }
247<EXPRESSION,MRI>"/" { RTOKEN('/'); }
248<EXPRESSION,MRI>"%" { RTOKEN('%'); }
249<EXPRESSION,MRI>"<" { RTOKEN('<'); }
b5c37946 250<EXPRESSION,MRI>"^" { RTOKEN('^'); }
f400c8d2 251<SCRIPT,EXPRESSION,MRI,WILD>"=" { RTOKEN('='); }
af29a8ab
AM
252<SCRIPT,EXPRESSION,MRI,WILD>"}" { RTOKEN('}'); }
253<SCRIPT,EXPRESSION,MRI,WILD>"{" { RTOKEN('{'); }
f400c8d2
AM
254<SCRIPT,EXPRESSION,MRI,WILD,INPUTLIST>")" { RTOKEN(')'); }
255<SCRIPT,EXPRESSION,MRI,WILD,INPUTLIST>"(" { RTOKEN('('); }
af29a8ab 256<SCRIPT,EXPRESSION,MRI>":" { RTOKEN(':'); }
f400c8d2
AM
257<SCRIPT,EXPRESSION,MRI,WILD>";" { RTOKEN(';'); }
258<SCRIPT>"MEMORY" { RTOKEN(MEMORY); }
259<SCRIPT>"REGION_ALIAS" { RTOKEN(REGION_ALIAS); }
260<SCRIPT>"LD_FEATURE" { RTOKEN(LD_FEATURE); }
261<SCRIPT,EXPRESSION>"ORIGIN" { RTOKEN(ORIGIN); }
262<SCRIPT>"VERSION" { RTOKEN(VERSIONK); }
263<SCRIPT,EXPRESSION>"BLOCK" { RTOKEN(BLOCK); }
264<SCRIPT,EXPRESSION>"BIND" { RTOKEN(BIND); }
265<SCRIPT,EXPRESSION>"LENGTH" { RTOKEN(LENGTH); }
266<SCRIPT,EXPRESSION>"ALIGN" { RTOKEN(ALIGN_K); }
267<SCRIPT,EXPRESSION>"DATA_SEGMENT_ALIGN" { RTOKEN(DATA_SEGMENT_ALIGN); }
268<SCRIPT,EXPRESSION>"DATA_SEGMENT_RELRO_END" { RTOKEN(DATA_SEGMENT_RELRO_END); }
269<SCRIPT,EXPRESSION>"DATA_SEGMENT_END" { RTOKEN(DATA_SEGMENT_END); }
270<SCRIPT,EXPRESSION>"ADDR" { RTOKEN(ADDR); }
271<SCRIPT,EXPRESSION>"LOADADDR" { RTOKEN(LOADADDR); }
af29a8ab 272<SCRIPT,EXPRESSION>"ALIGNOF" { RTOKEN(ALIGNOF); }
b325429b 273<SCRIPT,EXPRESSION>"ABSOLUTE" { RTOKEN(ABSOLUTE); }
f400c8d2
AM
274<SCRIPT,EXPRESSION>"MAX" { RTOKEN(MAX_K); }
275<SCRIPT,EXPRESSION>"MIN" { RTOKEN(MIN_K); }
276<SCRIPT,EXPRESSION>"LOG2CEIL" { RTOKEN(LOG2CEIL); }
af29a8ab 277<SCRIPT,EXPRESSION,WILD>"ASSERT" { RTOKEN(ASSERT_K); }
f400c8d2
AM
278<SCRIPT>"ENTRY" { RTOKEN(ENTRY); }
279<SCRIPT,MRI>"EXTERN" { RTOKEN(EXTERN); }
280<SCRIPT,EXPRESSION>"NEXT" { RTOKEN(NEXT); }
281<SCRIPT,EXPRESSION>"SIZEOF_HEADERS" { RTOKEN(SIZEOF_HEADERS); }
282<SCRIPT,EXPRESSION>"SEGMENT_START" { RTOKEN(SEGMENT_START); }
283<SCRIPT>"MAP" { RTOKEN(MAP); }
284<SCRIPT,EXPRESSION>"SIZEOF" { RTOKEN(SIZEOF); }
285<SCRIPT>"TARGET" { RTOKEN(TARGET_K); }
286<SCRIPT>"SEARCH_DIR" { RTOKEN(SEARCH_DIR); }
287<SCRIPT>"OUTPUT" { RTOKEN(OUTPUT); }
288<SCRIPT>"INPUT" { RTOKEN(INPUT); }
289<SCRIPT>"GROUP" { RTOKEN(GROUP); }
290<INPUTLIST>"AS_NEEDED" { RTOKEN(AS_NEEDED); }
291<SCRIPT,EXPRESSION>"DEFINED" { RTOKEN(DEFINED); }
292<WILD>"CREATE_OBJECT_SYMBOLS" { RTOKEN(CREATE_OBJECT_SYMBOLS); }
293<WILD>"CONSTRUCTORS" { RTOKEN(CONSTRUCTORS); }
294<SCRIPT>"FORCE_COMMON_ALLOCATION" { RTOKEN(FORCE_COMMON_ALLOCATION); }
295<SCRIPT>"FORCE_GROUP_ALLOCATION" { RTOKEN(FORCE_GROUP_ALLOCATION); }
296<SCRIPT>"INHIBIT_COMMON_ALLOCATION" { RTOKEN(INHIBIT_COMMON_ALLOCATION); }
297<SCRIPT>"SECTIONS" { RTOKEN(SECTIONS); }
298<SCRIPT>"INSERT" { RTOKEN(INSERT_K); }
299<SCRIPT>"AFTER" { RTOKEN(AFTER); }
300<SCRIPT>"BEFORE" { RTOKEN(BEFORE); }
301<WILD>"FILL" { RTOKEN(FILL); }
302<SCRIPT>"STARTUP" { RTOKEN(STARTUP); }
303<SCRIPT>"OUTPUT_FORMAT" { RTOKEN(OUTPUT_FORMAT); }
304<SCRIPT>"OUTPUT_ARCH" { RTOKEN(OUTPUT_ARCH); }
305<SCRIPT>"HLL" { RTOKEN(HLL); }
306<SCRIPT>"SYSLIB" { RTOKEN(SYSLIB); }
307<SCRIPT>"FLOAT" { RTOKEN(FLOAT); }
308<WILD>"QUAD" { RTOKEN(QUAD); }
309<WILD>"SQUAD" { RTOKEN(SQUAD); }
310<WILD>"LONG" { RTOKEN(LONG); }
311<WILD>"SHORT" { RTOKEN(SHORT); }
312<WILD>"BYTE" { RTOKEN(BYTE); }
0d79a2a8 313<WILD>"ASCIZ" { RTOKEN(ASCIZ); }
2d5783fa 314<WILD>"LINKER_VERSION" { RTOKEN(LINKER_VERSION); }
f400c8d2
AM
315<SCRIPT>"NOFLOAT" { RTOKEN(NOFLOAT); }
316<SCRIPT,EXPRESSION>"NOCROSSREFS" { RTOKEN(NOCROSSREFS); }
317<SCRIPT,EXPRESSION>"NOCROSSREFS_TO" { RTOKEN(NOCROSSREFS_TO); }
318<SCRIPT,EXPRESSION>"OVERLAY" { RTOKEN(OVERLAY); }
319<WILD>"SORT_BY_NAME" { RTOKEN(SORT_BY_NAME); }
320<WILD>"SORT_BY_ALIGNMENT" { RTOKEN(SORT_BY_ALIGNMENT); }
321<WILD>"SORT" { RTOKEN(SORT_BY_NAME); }
322<WILD>"SORT_BY_INIT_PRIORITY" { RTOKEN(SORT_BY_INIT_PRIORITY); }
323<WILD>"SORT_NONE" { RTOKEN(SORT_NONE); }
85921e9a 324<WILD>"REVERSE" { RTOKEN(REVERSE); }
f400c8d2
AM
325<EXPRESSION>"NOLOAD" { RTOKEN(NOLOAD); }
326<EXPRESSION>"READONLY" { RTOKEN(READONLY); }
327<EXPRESSION>"DSECT" { RTOKEN(DSECT); }
328<EXPRESSION>"COPY" { RTOKEN(COPY); }
329<EXPRESSION>"INFO" { RTOKEN(INFO); }
c212f39d 330<EXPRESSION>"TYPE" { RTOKEN(TYPE); }
f400c8d2
AM
331<SCRIPT,EXPRESSION>"ONLY_IF_RO" { RTOKEN(ONLY_IF_RO); }
332<SCRIPT,EXPRESSION>"ONLY_IF_RW" { RTOKEN(ONLY_IF_RW); }
333<SCRIPT,EXPRESSION>"SPECIAL" { RTOKEN(SPECIAL); }
334<SCRIPT>"o" { RTOKEN(ORIGIN); }
335<SCRIPT>"org" { RTOKEN(ORIGIN); }
336<SCRIPT>"l" { RTOKEN(LENGTH); }
337<SCRIPT>"len" { RTOKEN(LENGTH); }
338<WILD>"INPUT_SECTION_FLAGS" { RTOKEN(INPUT_SECTION_FLAGS); }
339<SCRIPT,EXPRESSION,WILD,MRI>"INCLUDE" { RTOKEN(INCLUDE);}
340<SCRIPT>"PHDRS" { RTOKEN(PHDRS); }
af29a8ab
AM
341<SCRIPT,EXPRESSION,WILD>"AT" { RTOKEN(AT);}
342<SCRIPT,EXPRESSION>"ALIGN_WITH_INPUT" { RTOKEN(ALIGN_WITH_INPUT);}
343<SCRIPT,EXPRESSION>"SUBALIGN" { RTOKEN(SUBALIGN);}
344<SCRIPT,EXPRESSION,WILD>"HIDDEN" { RTOKEN(HIDDEN); }
345<SCRIPT,EXPRESSION,WILD>"PROVIDE" { RTOKEN(PROVIDE); }
346<SCRIPT,EXPRESSION,WILD>"PROVIDE_HIDDEN" { RTOKEN(PROVIDE_HIDDEN); }
f400c8d2
AM
347<WILD>"KEEP" { RTOKEN(KEEP); }
348<WILD>"EXCLUDE_FILE" { RTOKEN(EXCLUDE_FILE); }
af29a8ab
AM
349<SCRIPT,EXPRESSION>"CONSTANT" { RTOKEN(CONSTANT);}
350
252b5132 351<MRI>"#".*\n? { ++ lineno; }
6c19b93b 352<MRI>"\n" { ++ lineno; RTOKEN(NEWLINE); }
252b5132
RH
353<MRI>"*".* { /* Mri comment line */ }
354<MRI>";".* { /* Mri comment line */ }
6c19b93b 355<MRI>"END" { RTOKEN(ENDWORD); }
b325429b 356<MRI>"ABSOLUTE" { RTOKEN(ABSOLUTE); }
3ec57632
NC
357<MRI>"ALIGNMOD" { RTOKEN(ALIGNMOD);}
358<MRI>"ALIGN" { RTOKEN(ALIGN_K);}
6c19b93b
AM
359<MRI>"CHIP" { RTOKEN(CHIP); }
360<MRI>"BASE" { RTOKEN(BASE); }
361<MRI>"ALIAS" { RTOKEN(ALIAS); }
362<MRI>"TRUNCATE" { RTOKEN(TRUNCATE); }
363<MRI>"LOAD" { RTOKEN(LOAD); }
364<MRI>"PUBLIC" { RTOKEN(PUBLIC); }
365<MRI>"ORDER" { RTOKEN(ORDER); }
366<MRI>"NAME" { RTOKEN(NAMEWORD); }
367<MRI>"FORMAT" { RTOKEN(FORMAT); }
368<MRI>"CASE" { RTOKEN(CASE); }
369<MRI>"START" { RTOKEN(START); }
370<MRI>"LIST".* { RTOKEN(LIST); /* LIST and ignore to end of line */ }
252b5132 371<MRI>"SECT" { RTOKEN(SECT); }
6c19b93b 372<MRI>"end" { RTOKEN(ENDWORD); }
b325429b 373<MRI>"absolute" { RTOKEN(ABSOLUTE); }
3ec57632
NC
374<MRI>"alignmod" { RTOKEN(ALIGNMOD);}
375<MRI>"align" { RTOKEN(ALIGN_K);}
6c19b93b
AM
376<MRI>"chip" { RTOKEN(CHIP); }
377<MRI>"base" { RTOKEN(BASE); }
378<MRI>"alias" { RTOKEN(ALIAS); }
379<MRI>"truncate" { RTOKEN(TRUNCATE); }
380<MRI>"load" { RTOKEN(LOAD); }
381<MRI>"public" { RTOKEN(PUBLIC); }
382<MRI>"order" { RTOKEN(ORDER); }
383<MRI>"name" { RTOKEN(NAMEWORD); }
384<MRI>"format" { RTOKEN(FORMAT); }
385<MRI>"case" { RTOKEN(CASE); }
386<MRI>"extern" { RTOKEN(EXTERN); }
387<MRI>"start" { RTOKEN(START); }
388<MRI>"list".* { RTOKEN(LIST); /* LIST and ignore to end of line */ }
252b5132 389<MRI>"sect" { RTOKEN(SECT); }
252b5132
RH
390
391<MRI>{FILENAMECHAR1}{NOCFILENAMECHAR}* {
392/* Filename without commas, needed to parse mri stuff */
092da96a 393 yylval.name = xstrdup (yytext);
252b5132
RH
394 return NAME;
395 }
396
397
af29a8ab 398<SCRIPT,INPUTLIST>{FILENAMECHAR1}{FILENAMECHAR}* {
092da96a 399 yylval.name = xstrdup (yytext);
252b5132
RH
400 return NAME;
401 }
eeed9cc7 402<INPUTLIST>"="{FILENAMECHAR1}{FILENAMECHAR}* {
3aa2d05a 403/* Filename to be prefixed by --sysroot or when non-sysrooted, nothing. */
092da96a 404 yylval.name = xstrdup (yytext);
eeed9cc7
HPN
405 return NAME;
406 }
af29a8ab 407<INPUTLIST>"-l"{FILENAMECHAR}+ {
8545d1a9
NS
408 yylval.name = xstrdup (yytext + 2);
409 return LNAME;
410 }
40726f16 411<EXPRESSION>{SYMBOLNAMECHAR1}{SYMBOLNAMECHAR}* {
092da96a 412 yylval.name = xstrdup (yytext);
8545d1a9
NS
413 return NAME;
414 }
f400c8d2
AM
415 /* The following rule is to prevent a fill expression on the output
416 section before /DISCARD/ interpreting the '/' as a divide. */
1c6aafe8
AM
417<EXPRESSION>"/DISCARD/" {
418 yylval.name = xstrdup (yytext);
419 return NAME;
420 }
af29a8ab 421<WILD>{WILDCHAR}* {
252b5132
RH
422 /* Annoyingly, this pattern can match comments, and we have
423 longest match issues to consider. So if the first two
424 characters are a comment opening, put the input back and
425 try again. */
426 if (yytext[0] == '/' && yytext[1] == '*')
427 {
1579bae1 428 yyless (2);
252b5132
RH
429 comment ();
430 }
431 else
432 {
1579bae1 433 yylval.name = xstrdup (yytext);
252b5132
RH
434 return NAME;
435 }
436 }
437
af29a8ab 438<SCRIPT,EXPRESSION,WILD,VERS_NODE,INPUTLIST>"\""[^\"]*"\"" {
6ef4fa07
AM
439 /* No matter the state, quotes give what's inside. */
440 yylval.name = xmemdup (yytext + 1, yyleng - 2, yyleng - 1);
441 return NAME;
442 }
cc9faa98 443
af29a8ab 444<SCRIPT,EXPRESSION,WILD,VERS_START,VERS_NODE,VERS_SCRIPT,INPUTLIST>"\n" {
cc9faa98 445 lineno++; }
af29a8ab 446<MRI,SCRIPT,EXPRESSION,WILD,VERS_START,VERS_NODE,VERS_SCRIPT,INPUTLIST>[ \t\r]+ {
cc9faa98 447 /* Eat up whitespace */ }
af29a8ab 448<SCRIPT,EXPRESSION,WILD,VERS_START,VERS_NODE,VERS_SCRIPT>#.* {
cc9faa98 449 /* Eat up comments */ }
252b5132
RH
450
451<VERS_NODE,VERS_SCRIPT>[:,;] { return *yytext; }
452
453<VERS_NODE>global { RTOKEN(GLOBAL); }
454
455<VERS_NODE>local { RTOKEN(LOCAL); }
456
457<VERS_NODE>extern { RTOKEN(EXTERN); }
458
d1b2b2dc 459<VERS_NODE>{V_IDENTIFIER} { yylval.name = xstrdup (yytext);
252b5132
RH
460 return VERS_IDENTIFIER; }
461
d1b2b2dc 462<VERS_SCRIPT>{V_TAG} { yylval.name = xstrdup (yytext);
252b5132
RH
463 return VERS_TAG; }
464
465<VERS_START>"{" { BEGIN(VERS_SCRIPT); return *yytext; }
466
1579bae1 467<VERS_SCRIPT>"{" { BEGIN(VERS_NODE);
252b5132
RH
468 vers_node_nesting = 0;
469 return *yytext;
470 }
471<VERS_SCRIPT>"}" { return *yytext; }
472<VERS_NODE>"{" { vers_node_nesting++; return *yytext; }
473<VERS_NODE>"}" { if (--vers_node_nesting < 0)
474 BEGIN(VERS_SCRIPT);
475 return *yytext;
476 }
477
252b5132
RH
478<<EOF>> {
479 include_stack_ptr--;
1579bae1 480 if (include_stack_ptr == 0)
1753ed68
JB
481 {
482 lineno = 0;
483 yyterminate ();
484 }
1579bae1 485 else
1579bae1 486 yy_switch_to_buffer (include_stack[include_stack_ptr]);
b47c4208 487
b47c4208 488 lineno = lineno_stack[include_stack_ptr];
f4a23d42 489 input_flags.sysrooted = sysrooted_stack[include_stack_ptr];
252b5132
RH
490
491 return END;
492}
493
02d44d76
JB
494<SCRIPT,WILD,MRI,VERS_START,VERS_SCRIPT,VERS_NODE>. lex_warn_invalid (_(" in script"), yytext);
495<EXPRESSION>. lex_warn_invalid (_(" in expression"), yytext);
1579bae1 496
252b5132
RH
497%%
498\f
499
500/* Switch flex to reading script file NAME, open on FILE,
501 saving the current input info on the include stack. */
502
503void
f4a23d42 504lex_push_file (FILE *file, const char *name, unsigned int sysrooted)
252b5132 505{
1579bae1 506 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
252b5132 507 {
d003af55 508 einfo (_("%F:includes nested too deeply\n"));
252b5132
RH
509 }
510 file_name_stack[include_stack_ptr] = name;
b47c4208 511 lineno_stack[include_stack_ptr] = lineno;
f4a23d42 512 sysrooted_stack[include_stack_ptr] = input_flags.sysrooted;
252b5132
RH
513 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
514
515 include_stack_ptr++;
b47c4208 516 lineno = 1;
f4a23d42 517 input_flags.sysrooted = sysrooted;
252b5132 518 yyin = file;
1579bae1 519 yy_switch_to_buffer (yy_create_buffer (yyin, YY_BUF_SIZE));
252b5132
RH
520}
521
522/* Return a newly created flex input buffer containing STRING,
523 which is SIZE bytes long. */
524
1579bae1
AM
525static YY_BUFFER_STATE
526yy_create_string_buffer (const char *string, size_t size)
252b5132
RH
527{
528 YY_BUFFER_STATE b;
529
ee44c2ac 530 b = xmalloc (sizeof (struct yy_buffer_state));
252b5132
RH
531 b->yy_input_file = 0;
532 b->yy_buf_size = size;
533
534 /* yy_ch_buf has to be 2 characters longer than the size given because
535 we need to put in 2 end-of-buffer characters. */
ee44c2ac 536 b->yy_ch_buf = xmalloc ((size_t) b->yy_buf_size + 3);
252b5132
RH
537
538 b->yy_ch_buf[0] = '\n';
539 strcpy (b->yy_ch_buf+1, string);
540 b->yy_ch_buf[size+1] = YY_END_OF_BUFFER_CHAR;
541 b->yy_ch_buf[size+2] = YY_END_OF_BUFFER_CHAR;
542 b->yy_n_chars = size+1;
543 b->yy_buf_pos = &b->yy_ch_buf[1];
544
dca7760f
AM
545 b->yy_is_our_buffer = 1;
546 b->yy_is_interactive = 0;
547 b->yy_at_bol = 1;
548 b->yy_fill_buffer = 0;
549
252b5132
RH
550 /* flex 2.4.7 changed the interface. FIXME: We should not be using
551 a flex internal interface in the first place! */
552#ifdef YY_BUFFER_NEW
553 b->yy_buffer_status = YY_BUFFER_NEW;
554#else
555 b->yy_eof_status = EOF_NOT_SEEN;
556#endif
557
558 return b;
559}
560
561/* Switch flex to reading from STRING, saving the current input info
562 on the include stack. */
563
564void
dab69f68 565lex_redirect (const char *string, const char *fake_filename, unsigned int count)
252b5132
RH
566{
567 YY_BUFFER_STATE tmp;
568
569 yy_init = 0;
1579bae1 570 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
252b5132 571 {
d003af55 572 einfo (_("%F: macros nested too deeply\n"));
252b5132 573 }
dab69f68 574 file_name_stack[include_stack_ptr] = fake_filename;
b47c4208 575 lineno_stack[include_stack_ptr] = lineno;
252b5132
RH
576 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
577 include_stack_ptr++;
dab69f68 578 lineno = count;
252b5132
RH
579 tmp = yy_create_string_buffer (string, strlen (string));
580 yy_switch_to_buffer (tmp);
252b5132
RH
581}
582\f
583/* Functions to switch to a different flex start condition,
584 saving the current start condition on `state_stack'. */
585
586static int state_stack[MAX_INCLUDE_DEPTH * 2];
587static int *state_stack_p = state_stack;
588
589void
1579bae1 590ldlex_script (void)
252b5132
RH
591{
592 *(state_stack_p)++ = yy_start;
593 BEGIN (SCRIPT);
594}
595
eeed9cc7
HPN
596void
597ldlex_inputlist (void)
598{
599 *(state_stack_p)++ = yy_start;
600 BEGIN (INPUTLIST);
601}
602
252b5132 603void
1579bae1 604ldlex_mri_script (void)
252b5132
RH
605{
606 *(state_stack_p)++ = yy_start;
607 BEGIN (MRI);
608}
609
610void
1579bae1 611ldlex_version_script (void)
252b5132
RH
612{
613 *(state_stack_p)++ = yy_start;
614 BEGIN (VERS_START);
615}
616
617void
1579bae1 618ldlex_version_file (void)
252b5132
RH
619{
620 *(state_stack_p)++ = yy_start;
621 BEGIN (VERS_SCRIPT);
622}
623
252b5132 624void
1579bae1 625ldlex_expression (void)
252b5132
RH
626{
627 *(state_stack_p)++ = yy_start;
628 BEGIN (EXPRESSION);
629}
630
631void
af29a8ab 632ldlex_wild (void)
252b5132
RH
633{
634 *(state_stack_p)++ = yy_start;
af29a8ab 635 BEGIN (WILD);
252b5132
RH
636}
637
638void
1579bae1 639ldlex_popstate (void)
252b5132
RH
640{
641 yy_start = *(--state_stack_p);
642}
dab69f68 643
40726f16
AM
644/* In cases where the parser needs to look ahead and the context
645 changes from expression to script or vice-versa, throw away a
646 NAME. What constitutes a NAME depends on context. */
647
648void
649ldlex_backup (void)
650{
651 yyless (0);
652}
653
dab69f68
AM
654/* Return the current file name, or the previous file if no file is
655 current. */
656
657const char*
658ldlex_filename (void)
659{
660 return file_name_stack[include_stack_ptr - (include_stack_ptr != 0)];
661}
252b5132
RH
662\f
663
d05c651b 664/* Place up to MAX_SIZE characters in BUF and return
252b5132
RH
665 either the number of characters read, or 0 to indicate EOF. */
666
d05c651b
AS
667static int
668yy_input (char *buf, int max_size)
252b5132 669{
d05c651b 670 int result = 0;
1b334e27 671 if (YY_CURRENT_BUFFER != NULL && YY_CURRENT_BUFFER->yy_input_file)
252b5132
RH
672 {
673 if (yyin)
674 {
d05c651b
AS
675 result = fread (buf, 1, max_size, yyin);
676 if (result < max_size && ferror (yyin))
d003af55 677 einfo (_("%F%P: read in flex scanner failed\n"));
252b5132
RH
678 }
679 }
d05c651b 680 return result;
252b5132
RH
681}
682
683/* Eat the rest of a C-style comment. */
684
685static void
1579bae1 686comment (void)
252b5132
RH
687{
688 int c;
689
690 while (1)
252b5132 691 {
252b5132 692 c = input();
9ab3a744 693 while (c != '*' && c != 0)
d003af55
AM
694 {
695 if (c == '\n')
696 lineno++;
697 c = input();
698 }
252b5132 699
d003af55
AM
700 if (c == '*')
701 {
702 c = input();
703 while (c == '*')
704 c = input();
705 if (c == '/')
706 break; /* found the end */
707 }
252b5132 708
d003af55
AM
709 if (c == '\n')
710 lineno++;
252b5132 711
9ab3a744 712 if (c == 0)
d003af55
AM
713 {
714 einfo (_("%F%P: EOF in comment\n"));
715 break;
716 }
252b5132 717 }
252b5132
RH
718}
719
720/* Warn the user about a garbage character WHAT in the input
721 in context WHERE. */
722
723static void
1579bae1 724lex_warn_invalid (char *where, char *what)
252b5132
RH
725{
726 char buf[5];
727
728 /* If we have found an input file whose format we do not recognize,
729 and we are therefore treating it as a linker script, and we find
730 an invalid character, then most likely this is a real object file
731 of some different format. Treat it as such. */
732 if (ldfile_assumed_script)
733 {
734 bfd_set_error (bfd_error_file_not_recognized);
d003af55 735 einfo (_("%F%s: file not recognized: %E\n"), ldlex_filename ());
252b5132
RH
736 }
737
3882b010 738 if (! ISPRINT (*what))
252b5132 739 {
c3a7b120 740 sprintf (buf, "\\%03o", *(unsigned char *) what);
252b5132
RH
741 what = buf;
742 }
743
c1c8c1ef 744 einfo (_("%P:%pS: ignoring invalid character `%s'%s\n"), NULL, what, where);
252b5132 745}