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