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