]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - ld/ldlex.l
ldgram.y tidies
[thirdparty/binutils-gdb.git] / ld / ldlex.l
CommitLineData
b0556316 1%option nounput noyywrap
cfdf38f2 2
252b5132
RH
3%{
4
250d07de 5/* Copyright (C) 1991-2021 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
252b5132
RH
78 EXPRESSION definitely in an expression
79 SCRIPT definitely in a script
eeed9cc7 80 INPUTLIST definitely in a script, a filename-list
252b5132 81 BOTH either EXPRESSION or SCRIPT
6c19b93b 82 MRI in an MRI script
252b5132
RH
83 VERS_START starting a Sun style mapfile
84 VERS_SCRIPT a Sun style mapfile
85 VERS_NODE a node within a Sun style mapfile
86*/
87#define RTOKEN(x) { yylval.token = x; return x; }
88
252b5132
RH
89%}
90
91%a 4000
92%o 5000
93
092da96a
AM
94WILDCHAR [_a-zA-Z0-9\/\.\\\$\~\-\+\:\[\]\,\=\?\*\^\!]
95FILENAMECHAR [_a-zA-Z0-9\/\.\\\$\~\-\+\:\[\]\,\=]
96NOCFILENAMECHAR [_a-zA-Z0-9\/\.\\\$\~\-\+\:\[\]]
97SYMBOLNAMECHAR [_a-zA-Z0-9\/\.\\\$\~]
98FILENAMECHAR1 [_a-zA-Z\/\.\\\$\~]
1c6aafe8 99SYMBOLNAMECHAR1 [_a-zA-Z\.\\\$]
1579bae1 100WHITE [ \t\n\r]+
252b5132 101
252b5132 102V_TAG [.$_a-zA-Z][._a-zA-Z0-9]*
5e35cbc2 103V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
252b5132
RH
104
105%s SCRIPT
eeed9cc7 106%s INPUTLIST
252b5132
RH
107%s EXPRESSION
108%s BOTH
252b5132
RH
109%s MRI
110%s VERS_START
111%s VERS_SCRIPT
112%s VERS_NODE
113%%
114
115 if (parser_input != input_selected)
116 {
117 /* The first token of the input determines the initial parser state. */
118 input_type t = parser_input;
119 parser_input = input_selected;
120 switch (t)
121 {
122 case input_script: return INPUT_SCRIPT; break;
123 case input_mri_script: return INPUT_MRI_SCRIPT; break;
124 case input_version_script: return INPUT_VERSION_SCRIPT; break;
55255dae 125 case input_dynamic_list: return INPUT_DYNAMIC_LIST; break;
252b5132
RH
126 case input_defsym: return INPUT_DEFSYM; break;
127 default: abort ();
128 }
129 }
130
eeed9cc7 131<BOTH,SCRIPT,EXPRESSION,VERS_START,VERS_NODE,VERS_SCRIPT,INPUTLIST>"/*" { comment (); }
252b5132
RH
132
133
252b5132 134<MRI,EXPRESSION>"$"([0-9A-Fa-f])+ {
6c19b93b 135 yylval.integer = bfd_scan_vma (yytext + 1, 0, 16);
1579bae1 136 yylval.bigint.str = NULL;
252b5132
RH
137 return INT;
138 }
139
140<MRI,EXPRESSION>([0-9A-Fa-f])+(H|h|X|x|B|b|O|o|D|d) {
141 int ibase ;
1579bae1
AM
142 switch (yytext[yyleng - 1]) {
143 case 'X':
252b5132
RH
144 case 'x':
145 case 'H':
146 case 'h':
147 ibase = 16;
148 break;
149 case 'O':
150 case 'o':
151 ibase = 8;
152 break;
153 case 'B':
154 case 'b':
155 ibase = 2;
156 break;
157 default:
158 ibase = 10;
159 }
160 yylval.integer = bfd_scan_vma (yytext, 0,
161 ibase);
1579bae1 162 yylval.bigint.str = NULL;
252b5132
RH
163 return INT;
164 }
fb6c220e 165<SCRIPT,MRI,BOTH,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 }
174 yylval.integer = bfd_scan_vma (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 }
194<BOTH,SCRIPT,EXPRESSION,MRI>"]" { RTOKEN(']');}
195<BOTH,SCRIPT,EXPRESSION,MRI>"[" { RTOKEN('[');}
196<BOTH,SCRIPT,EXPRESSION,MRI>"<<=" { RTOKEN(LSHIFTEQ);}
197<BOTH,SCRIPT,EXPRESSION,MRI>">>=" { RTOKEN(RSHIFTEQ);}
198<BOTH,SCRIPT,EXPRESSION,MRI>"||" { RTOKEN(OROR);}
199<BOTH,SCRIPT,EXPRESSION,MRI>"==" { RTOKEN(EQ);}
200<BOTH,SCRIPT,EXPRESSION,MRI>"!=" { RTOKEN(NE);}
201<BOTH,SCRIPT,EXPRESSION,MRI>">=" { RTOKEN(GE);}
202<BOTH,SCRIPT,EXPRESSION,MRI>"<=" { RTOKEN(LE);}
203<BOTH,SCRIPT,EXPRESSION,MRI>"<<" { RTOKEN(LSHIFT);}
204<BOTH,SCRIPT,EXPRESSION,MRI>">>" { RTOKEN(RSHIFT);}
205<BOTH,SCRIPT,EXPRESSION,MRI>"+=" { RTOKEN(PLUSEQ);}
206<BOTH,SCRIPT,EXPRESSION,MRI>"-=" { RTOKEN(MINUSEQ);}
207<BOTH,SCRIPT,EXPRESSION,MRI>"*=" { RTOKEN(MULTEQ);}
208<BOTH,SCRIPT,EXPRESSION,MRI>"/=" { RTOKEN(DIVEQ);}
209<BOTH,SCRIPT,EXPRESSION,MRI>"&=" { RTOKEN(ANDEQ);}
210<BOTH,SCRIPT,EXPRESSION,MRI>"|=" { RTOKEN(OREQ);}
211<BOTH,SCRIPT,EXPRESSION,MRI>"&&" { RTOKEN(ANDAND);}
212<BOTH,SCRIPT,EXPRESSION,MRI>">" { RTOKEN('>');}
eeed9cc7 213<BOTH,SCRIPT,EXPRESSION,MRI,INPUTLIST>"," { RTOKEN(',');}
252b5132
RH
214<BOTH,SCRIPT,EXPRESSION,MRI>"&" { RTOKEN('&');}
215<BOTH,SCRIPT,EXPRESSION,MRI>"|" { RTOKEN('|');}
216<BOTH,SCRIPT,EXPRESSION,MRI>"~" { RTOKEN('~');}
217<BOTH,SCRIPT,EXPRESSION,MRI>"!" { RTOKEN('!');}
218<BOTH,SCRIPT,EXPRESSION,MRI>"?" { RTOKEN('?');}
219<BOTH,SCRIPT,EXPRESSION,MRI>"*" { RTOKEN('*');}
220<BOTH,SCRIPT,EXPRESSION,MRI>"+" { RTOKEN('+');}
221<BOTH,SCRIPT,EXPRESSION,MRI>"-" { RTOKEN('-');}
222<BOTH,SCRIPT,EXPRESSION,MRI>"/" { RTOKEN('/');}
223<BOTH,SCRIPT,EXPRESSION,MRI>"%" { RTOKEN('%');}
224<BOTH,SCRIPT,EXPRESSION,MRI>"<" { RTOKEN('<');}
6c19b93b 225<BOTH,SCRIPT,EXPRESSION,MRI>"=" { RTOKEN('=');}
3ec57632
NC
226<BOTH,SCRIPT,EXPRESSION,MRI>"}" { RTOKEN('}') ; }
227<BOTH,SCRIPT,EXPRESSION,MRI>"{" { RTOKEN('{'); }
eeed9cc7
HPN
228<BOTH,SCRIPT,EXPRESSION,MRI,INPUTLIST>")" { RTOKEN(')');}
229<BOTH,SCRIPT,EXPRESSION,MRI,INPUTLIST>"(" { RTOKEN('(');}
252b5132
RH
230<BOTH,SCRIPT,EXPRESSION,MRI>":" { RTOKEN(':'); }
231<BOTH,SCRIPT,EXPRESSION,MRI>";" { RTOKEN(';');}
3ec57632 232<BOTH,SCRIPT>"MEMORY" { RTOKEN(MEMORY);}
4a93e180 233<BOTH,SCRIPT>"REGION_ALIAS" { RTOKEN(REGION_ALIAS);}
01554a74 234<BOTH,SCRIPT>"LD_FEATURE" { RTOKEN(LD_FEATURE);}
3ec57632
NC
235<BOTH,SCRIPT,EXPRESSION>"ORIGIN" { RTOKEN(ORIGIN);}
236<BOTH,SCRIPT>"VERSION" { RTOKEN(VERSIONK);}
252b5132
RH
237<EXPRESSION,BOTH,SCRIPT>"BLOCK" { RTOKEN(BLOCK);}
238<EXPRESSION,BOTH,SCRIPT>"BIND" { RTOKEN(BIND);}
3ec57632
NC
239<BOTH,SCRIPT,EXPRESSION>"LENGTH" { RTOKEN(LENGTH);}
240<EXPRESSION,BOTH,SCRIPT>"ALIGN" { RTOKEN(ALIGN_K);}
2d20f7bf 241<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_ALIGN" { RTOKEN(DATA_SEGMENT_ALIGN);}
8c37241b 242<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_RELRO_END" { RTOKEN(DATA_SEGMENT_RELRO_END);}
2d20f7bf 243<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_END" { RTOKEN(DATA_SEGMENT_END);}
3ec57632
NC
244<EXPRESSION,BOTH,SCRIPT>"ADDR" { RTOKEN(ADDR);}
245<EXPRESSION,BOTH,SCRIPT>"LOADADDR" { RTOKEN(LOADADDR);}
362c1d1a 246<EXPRESSION,BOTH,SCRIPT>"ALIGNOF" { RTOKEN(ALIGNOF); }
252b5132
RH
247<EXPRESSION,BOTH>"MAX" { RTOKEN(MAX_K); }
248<EXPRESSION,BOTH>"MIN" { RTOKEN(MIN_K); }
2e53f7d6 249<EXPRESSION,BOTH>"LOG2CEIL" { RTOKEN(LOG2CEIL); }
8545d1a9 250<EXPRESSION,BOTH,SCRIPT>"ASSERT" { RTOKEN(ASSERT_K); }
252b5132
RH
251<BOTH,SCRIPT>"ENTRY" { RTOKEN(ENTRY);}
252<BOTH,SCRIPT,MRI>"EXTERN" { RTOKEN(EXTERN);}
3ec57632 253<EXPRESSION,BOTH,SCRIPT>"NEXT" { RTOKEN(NEXT);}
252b5132
RH
254<EXPRESSION,BOTH,SCRIPT>"sizeof_headers" { RTOKEN(SIZEOF_HEADERS);}
255<EXPRESSION,BOTH,SCRIPT>"SIZEOF_HEADERS" { RTOKEN(SIZEOF_HEADERS);}
ba916c8a 256<EXPRESSION,BOTH,SCRIPT>"SEGMENT_START" { RTOKEN(SEGMENT_START);}
252b5132 257<BOTH,SCRIPT>"MAP" { RTOKEN(MAP);}
3ec57632
NC
258<EXPRESSION,BOTH,SCRIPT>"SIZEOF" { RTOKEN(SIZEOF);}
259<BOTH,SCRIPT>"TARGET" { RTOKEN(TARGET_K);}
252b5132 260<BOTH,SCRIPT>"SEARCH_DIR" { RTOKEN(SEARCH_DIR);}
3ec57632 261<BOTH,SCRIPT>"OUTPUT" { RTOKEN(OUTPUT);}
252b5132
RH
262<BOTH,SCRIPT>"INPUT" { RTOKEN(INPUT);}
263<EXPRESSION,BOTH,SCRIPT>"GROUP" { RTOKEN(GROUP);}
eeed9cc7 264<EXPRESSION,BOTH,SCRIPT,INPUTLIST>"AS_NEEDED" { RTOKEN(AS_NEEDED);}
3ec57632 265<EXPRESSION,BOTH,SCRIPT>"DEFINED" { RTOKEN(DEFINED);}
252b5132
RH
266<BOTH,SCRIPT>"CREATE_OBJECT_SYMBOLS" { RTOKEN(CREATE_OBJECT_SYMBOLS);}
267<BOTH,SCRIPT>"CONSTRUCTORS" { RTOKEN( CONSTRUCTORS);}
3ec57632 268<BOTH,SCRIPT>"FORCE_COMMON_ALLOCATION" { RTOKEN(FORCE_COMMON_ALLOCATION);}
7bdf4127 269<BOTH,SCRIPT>"FORCE_GROUP_ALLOCATION" { RTOKEN(FORCE_GROUP_ALLOCATION);}
4818e05f 270<BOTH,SCRIPT>"INHIBIT_COMMON_ALLOCATION" { RTOKEN(INHIBIT_COMMON_ALLOCATION);}
3ec57632 271<BOTH,SCRIPT>"SECTIONS" { RTOKEN(SECTIONS);}
53d25da6
AM
272<BOTH,SCRIPT>"INSERT" { RTOKEN(INSERT_K);}
273<BOTH,SCRIPT>"AFTER" { RTOKEN(AFTER);}
274<BOTH,SCRIPT>"BEFORE" { RTOKEN(BEFORE);}
252b5132 275<BOTH,SCRIPT>"FILL" { RTOKEN(FILL);}
3ec57632 276<BOTH,SCRIPT>"STARTUP" { RTOKEN(STARTUP);}
252b5132
RH
277<BOTH,SCRIPT>"OUTPUT_FORMAT" { RTOKEN(OUTPUT_FORMAT);}
278<BOTH,SCRIPT>"OUTPUT_ARCH" { RTOKEN( OUTPUT_ARCH);}
279<BOTH,SCRIPT>"HLL" { RTOKEN(HLL);}
3ec57632 280<BOTH,SCRIPT>"SYSLIB" { RTOKEN(SYSLIB);}
252b5132
RH
281<BOTH,SCRIPT>"FLOAT" { RTOKEN(FLOAT);}
282<BOTH,SCRIPT>"QUAD" { RTOKEN( QUAD);}
283<BOTH,SCRIPT>"SQUAD" { RTOKEN( SQUAD);}
284<BOTH,SCRIPT>"LONG" { RTOKEN( LONG);}
285<BOTH,SCRIPT>"SHORT" { RTOKEN( SHORT);}
286<BOTH,SCRIPT>"BYTE" { RTOKEN( BYTE);}
3ec57632 287<BOTH,SCRIPT>"NOFLOAT" { RTOKEN(NOFLOAT);}
252b5132 288<EXPRESSION,BOTH,SCRIPT>"NOCROSSREFS" { RTOKEN(NOCROSSREFS);}
cdf96953 289<EXPRESSION,BOTH,SCRIPT>"NOCROSSREFS_TO" { RTOKEN(NOCROSSREFS_TO);}
252b5132 290<BOTH,SCRIPT>"OVERLAY" { RTOKEN(OVERLAY); }
bcaa7b3e
L
291<BOTH,SCRIPT>"SORT_BY_NAME" { RTOKEN(SORT_BY_NAME); }
292<BOTH,SCRIPT>"SORT_BY_ALIGNMENT" { RTOKEN(SORT_BY_ALIGNMENT); }
293<BOTH,SCRIPT>"SORT" { RTOKEN(SORT_BY_NAME); }
02ecc8e9 294<BOTH,SCRIPT>"SORT_BY_INIT_PRIORITY" { RTOKEN(SORT_BY_INIT_PRIORITY); }
eda680f8 295<BOTH,SCRIPT>"SORT_NONE" { RTOKEN(SORT_NONE); }
252b5132 296<EXPRESSION,BOTH,SCRIPT>"NOLOAD" { RTOKEN(NOLOAD);}
6b86da53 297<EXPRESSION,BOTH,SCRIPT>"READONLY" { RTOKEN(READONLY);}
252b5132
RH
298<EXPRESSION,BOTH,SCRIPT>"DSECT" { RTOKEN(DSECT);}
299<EXPRESSION,BOTH,SCRIPT>"COPY" { RTOKEN(COPY);}
300<EXPRESSION,BOTH,SCRIPT>"INFO" { RTOKEN(INFO);}
301<EXPRESSION,BOTH,SCRIPT>"OVERLAY" { RTOKEN(OVERLAY);}
0841712e
JJ
302<EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RO" { RTOKEN(ONLY_IF_RO); }
303<EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RW" { RTOKEN(ONLY_IF_RW); }
0cf7d72c 304<EXPRESSION,BOTH,SCRIPT>"SPECIAL" { RTOKEN(SPECIAL); }
252b5132
RH
305<BOTH,SCRIPT>"o" { RTOKEN(ORIGIN);}
306<BOTH,SCRIPT>"org" { RTOKEN(ORIGIN);}
307<BOTH,SCRIPT>"l" { RTOKEN( LENGTH);}
308<BOTH,SCRIPT>"len" { RTOKEN( LENGTH);}
ae17ab41 309<EXPRESSION,BOTH,SCRIPT>"INPUT_SECTION_FLAGS" { RTOKEN(INPUT_SECTION_FLAGS); }
4006703d 310<EXPRESSION,BOTH,SCRIPT>"INCLUDE" { RTOKEN(INCLUDE);}
252b5132 311<BOTH,SCRIPT>"PHDRS" { RTOKEN (PHDRS); }
3ec57632 312<EXPRESSION,BOTH,SCRIPT>"AT" { RTOKEN(AT);}
1eec346e 313<EXPRESSION,BOTH,SCRIPT>"ALIGN_WITH_INPUT" { RTOKEN(ALIGN_WITH_INPUT);}
3ec57632 314<EXPRESSION,BOTH,SCRIPT>"SUBALIGN" { RTOKEN(SUBALIGN);}
eb8476a6 315<EXPRESSION,BOTH,SCRIPT>"HIDDEN" { RTOKEN(HIDDEN); }
3ec57632 316<EXPRESSION,BOTH,SCRIPT>"PROVIDE" { RTOKEN(PROVIDE); }
7af8e998 317<EXPRESSION,BOTH,SCRIPT>"PROVIDE_HIDDEN" { RTOKEN(PROVIDE_HIDDEN); }
252b5132 318<EXPRESSION,BOTH,SCRIPT>"KEEP" { RTOKEN(KEEP); }
3ec57632 319<EXPRESSION,BOTH,SCRIPT>"EXCLUDE_FILE" { RTOKEN(EXCLUDE_FILE); }
24718e3b 320<EXPRESSION,BOTH,SCRIPT>"CONSTANT" { RTOKEN(CONSTANT);}
252b5132 321<MRI>"#".*\n? { ++ lineno; }
6c19b93b 322<MRI>"\n" { ++ lineno; RTOKEN(NEWLINE); }
252b5132
RH
323<MRI>"*".* { /* Mri comment line */ }
324<MRI>";".* { /* Mri comment line */ }
6c19b93b 325<MRI>"END" { RTOKEN(ENDWORD); }
3ec57632
NC
326<MRI>"ALIGNMOD" { RTOKEN(ALIGNMOD);}
327<MRI>"ALIGN" { RTOKEN(ALIGN_K);}
6c19b93b
AM
328<MRI>"CHIP" { RTOKEN(CHIP); }
329<MRI>"BASE" { RTOKEN(BASE); }
330<MRI>"ALIAS" { RTOKEN(ALIAS); }
331<MRI>"TRUNCATE" { RTOKEN(TRUNCATE); }
332<MRI>"LOAD" { RTOKEN(LOAD); }
333<MRI>"PUBLIC" { RTOKEN(PUBLIC); }
334<MRI>"ORDER" { RTOKEN(ORDER); }
335<MRI>"NAME" { RTOKEN(NAMEWORD); }
336<MRI>"FORMAT" { RTOKEN(FORMAT); }
337<MRI>"CASE" { RTOKEN(CASE); }
338<MRI>"START" { RTOKEN(START); }
339<MRI>"LIST".* { RTOKEN(LIST); /* LIST and ignore to end of line */ }
252b5132
RH
340<MRI>"SECT" { RTOKEN(SECT); }
341<EXPRESSION,BOTH,SCRIPT,MRI>"ABSOLUTE" { RTOKEN(ABSOLUTE); }
6c19b93b 342<MRI>"end" { RTOKEN(ENDWORD); }
3ec57632
NC
343<MRI>"alignmod" { RTOKEN(ALIGNMOD);}
344<MRI>"align" { RTOKEN(ALIGN_K);}
6c19b93b
AM
345<MRI>"chip" { RTOKEN(CHIP); }
346<MRI>"base" { RTOKEN(BASE); }
347<MRI>"alias" { RTOKEN(ALIAS); }
348<MRI>"truncate" { RTOKEN(TRUNCATE); }
349<MRI>"load" { RTOKEN(LOAD); }
350<MRI>"public" { RTOKEN(PUBLIC); }
351<MRI>"order" { RTOKEN(ORDER); }
352<MRI>"name" { RTOKEN(NAMEWORD); }
353<MRI>"format" { RTOKEN(FORMAT); }
354<MRI>"case" { RTOKEN(CASE); }
355<MRI>"extern" { RTOKEN(EXTERN); }
356<MRI>"start" { RTOKEN(START); }
357<MRI>"list".* { RTOKEN(LIST); /* LIST and ignore to end of line */ }
252b5132
RH
358<MRI>"sect" { RTOKEN(SECT); }
359<EXPRESSION,BOTH,SCRIPT,MRI>"absolute" { RTOKEN(ABSOLUTE); }
360
361<MRI>{FILENAMECHAR1}{NOCFILENAMECHAR}* {
362/* Filename without commas, needed to parse mri stuff */
092da96a 363 yylval.name = xstrdup (yytext);
252b5132
RH
364 return NAME;
365 }
366
367
eeed9cc7 368<BOTH,INPUTLIST>{FILENAMECHAR1}{FILENAMECHAR}* {
092da96a 369 yylval.name = xstrdup (yytext);
252b5132
RH
370 return NAME;
371 }
eeed9cc7 372<INPUTLIST>"="{FILENAMECHAR1}{FILENAMECHAR}* {
3aa2d05a 373/* Filename to be prefixed by --sysroot or when non-sysrooted, nothing. */
092da96a 374 yylval.name = xstrdup (yytext);
eeed9cc7
HPN
375 return NAME;
376 }
377<BOTH,INPUTLIST>"-l"{FILENAMECHAR}+ {
8545d1a9
NS
378 yylval.name = xstrdup (yytext + 2);
379 return LNAME;
380 }
40726f16 381<EXPRESSION>{SYMBOLNAMECHAR1}{SYMBOLNAMECHAR}* {
092da96a 382 yylval.name = xstrdup (yytext);
8545d1a9
NS
383 return NAME;
384 }
1c6aafe8
AM
385<EXPRESSION>"/DISCARD/" {
386 yylval.name = xstrdup (yytext);
387 return NAME;
388 }
8545d1a9 389<EXPRESSION>"-l"{NOCFILENAMECHAR}+ {
d1b2b2dc 390 yylval.name = xstrdup (yytext + 2);
252b5132
RH
391 return LNAME;
392 }
393<SCRIPT>{WILDCHAR}* {
394 /* Annoyingly, this pattern can match comments, and we have
395 longest match issues to consider. So if the first two
396 characters are a comment opening, put the input back and
397 try again. */
398 if (yytext[0] == '/' && yytext[1] == '*')
399 {
1579bae1 400 yyless (2);
252b5132
RH
401 comment ();
402 }
403 else
404 {
1579bae1 405 yylval.name = xstrdup (yytext);
252b5132
RH
406 return NAME;
407 }
408 }
409
eeed9cc7 410<EXPRESSION,BOTH,SCRIPT,VERS_NODE,INPUTLIST>"\""[^\"]*"\"" {
252b5132 411 /* No matter the state, quotes
406bd128
NC
412 give what's inside. */
413 bfd_size_type len;
1579bae1 414 yylval.name = xstrdup (yytext + 1);
406bd128
NC
415 /* PR ld/20906. A corrupt input file
416 can contain bogus strings. */
417 len = strlen (yylval.name);
2688aab2 418 if (len > (bfd_size_type) yyleng - 2)
406bd128
NC
419 len = yyleng - 2;
420 yylval.name[len] = 0;
252b5132
RH
421 return NAME;
422 }
423<BOTH,SCRIPT,EXPRESSION>"\n" { lineno++;}
424<MRI,BOTH,SCRIPT,EXPRESSION>[ \t\r]+ { }
425
426<VERS_NODE,VERS_SCRIPT>[:,;] { return *yytext; }
427
428<VERS_NODE>global { RTOKEN(GLOBAL); }
429
430<VERS_NODE>local { RTOKEN(LOCAL); }
431
432<VERS_NODE>extern { RTOKEN(EXTERN); }
433
d1b2b2dc 434<VERS_NODE>{V_IDENTIFIER} { yylval.name = xstrdup (yytext);
252b5132
RH
435 return VERS_IDENTIFIER; }
436
d1b2b2dc 437<VERS_SCRIPT>{V_TAG} { yylval.name = xstrdup (yytext);
252b5132
RH
438 return VERS_TAG; }
439
440<VERS_START>"{" { BEGIN(VERS_SCRIPT); return *yytext; }
441
1579bae1 442<VERS_SCRIPT>"{" { BEGIN(VERS_NODE);
252b5132
RH
443 vers_node_nesting = 0;
444 return *yytext;
445 }
446<VERS_SCRIPT>"}" { return *yytext; }
447<VERS_NODE>"{" { vers_node_nesting++; return *yytext; }
448<VERS_NODE>"}" { if (--vers_node_nesting < 0)
449 BEGIN(VERS_SCRIPT);
450 return *yytext;
451 }
452
a13eab06 453<VERS_START,VERS_NODE,VERS_SCRIPT,INPUTLIST>[\n] { lineno++; }
252b5132
RH
454
455<VERS_START,VERS_NODE,VERS_SCRIPT>#.* { /* Eat up comments */ }
456
6c19b93b 457<VERS_START,VERS_NODE,VERS_SCRIPT,INPUTLIST>[ \t\r]+ { /* Eat up whitespace */ }
252b5132
RH
458
459<<EOF>> {
460 include_stack_ptr--;
1579bae1 461 if (include_stack_ptr == 0)
1753ed68
JB
462 {
463 lineno = 0;
464 yyterminate ();
465 }
1579bae1 466 else
1579bae1 467 yy_switch_to_buffer (include_stack[include_stack_ptr]);
b47c4208 468
b47c4208 469 lineno = lineno_stack[include_stack_ptr];
f4a23d42 470 input_flags.sysrooted = sysrooted_stack[include_stack_ptr];
252b5132
RH
471
472 return END;
473}
474
1579bae1 475<SCRIPT,MRI,VERS_START,VERS_SCRIPT,VERS_NODE>. lex_warn_invalid (" in script", yytext);
fb6c220e 476<EXPRESSION,BOTH>. lex_warn_invalid (" in expression", yytext);
1579bae1 477
252b5132
RH
478%%
479\f
480
481/* Switch flex to reading script file NAME, open on FILE,
482 saving the current input info on the include stack. */
483
484void
f4a23d42 485lex_push_file (FILE *file, const char *name, unsigned int sysrooted)
252b5132 486{
1579bae1 487 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
252b5132 488 {
d003af55 489 einfo (_("%F:includes nested too deeply\n"));
252b5132
RH
490 }
491 file_name_stack[include_stack_ptr] = name;
b47c4208 492 lineno_stack[include_stack_ptr] = lineno;
f4a23d42 493 sysrooted_stack[include_stack_ptr] = input_flags.sysrooted;
252b5132
RH
494 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
495
496 include_stack_ptr++;
b47c4208 497 lineno = 1;
f4a23d42 498 input_flags.sysrooted = sysrooted;
252b5132 499 yyin = file;
1579bae1 500 yy_switch_to_buffer (yy_create_buffer (yyin, YY_BUF_SIZE));
252b5132
RH
501}
502
503/* Return a newly created flex input buffer containing STRING,
504 which is SIZE bytes long. */
505
1579bae1
AM
506static YY_BUFFER_STATE
507yy_create_string_buffer (const char *string, size_t size)
252b5132
RH
508{
509 YY_BUFFER_STATE b;
510
ee44c2ac 511 b = xmalloc (sizeof (struct yy_buffer_state));
252b5132
RH
512 b->yy_input_file = 0;
513 b->yy_buf_size = size;
514
515 /* yy_ch_buf has to be 2 characters longer than the size given because
516 we need to put in 2 end-of-buffer characters. */
ee44c2ac 517 b->yy_ch_buf = xmalloc ((size_t) b->yy_buf_size + 3);
252b5132
RH
518
519 b->yy_ch_buf[0] = '\n';
520 strcpy (b->yy_ch_buf+1, string);
521 b->yy_ch_buf[size+1] = YY_END_OF_BUFFER_CHAR;
522 b->yy_ch_buf[size+2] = YY_END_OF_BUFFER_CHAR;
523 b->yy_n_chars = size+1;
524 b->yy_buf_pos = &b->yy_ch_buf[1];
525
dca7760f
AM
526 b->yy_is_our_buffer = 1;
527 b->yy_is_interactive = 0;
528 b->yy_at_bol = 1;
529 b->yy_fill_buffer = 0;
530
252b5132
RH
531 /* flex 2.4.7 changed the interface. FIXME: We should not be using
532 a flex internal interface in the first place! */
533#ifdef YY_BUFFER_NEW
534 b->yy_buffer_status = YY_BUFFER_NEW;
535#else
536 b->yy_eof_status = EOF_NOT_SEEN;
537#endif
538
539 return b;
540}
541
542/* Switch flex to reading from STRING, saving the current input info
543 on the include stack. */
544
545void
dab69f68 546lex_redirect (const char *string, const char *fake_filename, unsigned int count)
252b5132
RH
547{
548 YY_BUFFER_STATE tmp;
549
550 yy_init = 0;
1579bae1 551 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
252b5132 552 {
d003af55 553 einfo (_("%F: macros nested too deeply\n"));
252b5132 554 }
dab69f68 555 file_name_stack[include_stack_ptr] = fake_filename;
b47c4208 556 lineno_stack[include_stack_ptr] = lineno;
252b5132
RH
557 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
558 include_stack_ptr++;
dab69f68 559 lineno = count;
252b5132
RH
560 tmp = yy_create_string_buffer (string, strlen (string));
561 yy_switch_to_buffer (tmp);
252b5132
RH
562}
563\f
564/* Functions to switch to a different flex start condition,
565 saving the current start condition on `state_stack'. */
566
567static int state_stack[MAX_INCLUDE_DEPTH * 2];
568static int *state_stack_p = state_stack;
569
570void
1579bae1 571ldlex_script (void)
252b5132
RH
572{
573 *(state_stack_p)++ = yy_start;
574 BEGIN (SCRIPT);
575}
576
eeed9cc7
HPN
577void
578ldlex_inputlist (void)
579{
580 *(state_stack_p)++ = yy_start;
581 BEGIN (INPUTLIST);
582}
583
252b5132 584void
1579bae1 585ldlex_mri_script (void)
252b5132
RH
586{
587 *(state_stack_p)++ = yy_start;
588 BEGIN (MRI);
589}
590
591void
1579bae1 592ldlex_version_script (void)
252b5132
RH
593{
594 *(state_stack_p)++ = yy_start;
595 BEGIN (VERS_START);
596}
597
598void
1579bae1 599ldlex_version_file (void)
252b5132
RH
600{
601 *(state_stack_p)++ = yy_start;
602 BEGIN (VERS_SCRIPT);
603}
604
252b5132 605void
1579bae1 606ldlex_expression (void)
252b5132
RH
607{
608 *(state_stack_p)++ = yy_start;
609 BEGIN (EXPRESSION);
610}
611
612void
1579bae1 613ldlex_both (void)
252b5132
RH
614{
615 *(state_stack_p)++ = yy_start;
616 BEGIN (BOTH);
617}
618
619void
1579bae1 620ldlex_popstate (void)
252b5132
RH
621{
622 yy_start = *(--state_stack_p);
623}
dab69f68 624
40726f16
AM
625/* In cases where the parser needs to look ahead and the context
626 changes from expression to script or vice-versa, throw away a
627 NAME. What constitutes a NAME depends on context. */
628
629void
630ldlex_backup (void)
631{
632 yyless (0);
633}
634
dab69f68
AM
635/* Return the current file name, or the previous file if no file is
636 current. */
637
638const char*
639ldlex_filename (void)
640{
641 return file_name_stack[include_stack_ptr - (include_stack_ptr != 0)];
642}
252b5132
RH
643\f
644
d05c651b 645/* Place up to MAX_SIZE characters in BUF and return
252b5132
RH
646 either the number of characters read, or 0 to indicate EOF. */
647
d05c651b
AS
648static int
649yy_input (char *buf, int max_size)
252b5132 650{
d05c651b 651 int result = 0;
731e28d8 652 if (YY_CURRENT_BUFFER->yy_input_file)
252b5132
RH
653 {
654 if (yyin)
655 {
d05c651b
AS
656 result = fread (buf, 1, max_size, yyin);
657 if (result < max_size && ferror (yyin))
d003af55 658 einfo (_("%F%P: read in flex scanner failed\n"));
252b5132
RH
659 }
660 }
d05c651b 661 return result;
252b5132
RH
662}
663
664/* Eat the rest of a C-style comment. */
665
666static void
1579bae1 667comment (void)
252b5132
RH
668{
669 int c;
670
671 while (1)
252b5132 672 {
252b5132 673 c = input();
9ab3a744 674 while (c != '*' && c != 0)
d003af55
AM
675 {
676 if (c == '\n')
677 lineno++;
678 c = input();
679 }
252b5132 680
d003af55
AM
681 if (c == '*')
682 {
683 c = input();
684 while (c == '*')
685 c = input();
686 if (c == '/')
687 break; /* found the end */
688 }
252b5132 689
d003af55
AM
690 if (c == '\n')
691 lineno++;
252b5132 692
9ab3a744 693 if (c == 0)
d003af55
AM
694 {
695 einfo (_("%F%P: EOF in comment\n"));
696 break;
697 }
252b5132 698 }
252b5132
RH
699}
700
701/* Warn the user about a garbage character WHAT in the input
702 in context WHERE. */
703
704static void
1579bae1 705lex_warn_invalid (char *where, char *what)
252b5132
RH
706{
707 char buf[5];
708
709 /* If we have found an input file whose format we do not recognize,
710 and we are therefore treating it as a linker script, and we find
711 an invalid character, then most likely this is a real object file
712 of some different format. Treat it as such. */
713 if (ldfile_assumed_script)
714 {
715 bfd_set_error (bfd_error_file_not_recognized);
d003af55 716 einfo (_("%F%s: file not recognized: %E\n"), ldlex_filename ());
252b5132
RH
717 }
718
3882b010 719 if (! ISPRINT (*what))
252b5132 720 {
c3a7b120 721 sprintf (buf, "\\%03o", *(unsigned char *) what);
252b5132
RH
722 what = buf;
723 }
724
c1c8c1ef 725 einfo (_("%P:%pS: ignoring invalid character `%s'%s\n"), NULL, what, where);
252b5132 726}