]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - ld/ldlex.l
[binutils, ARM, 4/16] BF insns infrastructure with array of relocs in struct arm_it
[thirdparty/binutils-gdb.git] / ld / ldlex.l
CommitLineData
b0556316 1%option nounput noyywrap
cfdf38f2 2
252b5132
RH
3%{
4
82704155 5/* Copyright (C) 1991-2019 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"
252b5132 28#include "ld.h"
252b5132
RH
29#include "ldmisc.h"
30#include "ldexp.h"
31#include "ldlang.h"
df2a7313 32#include <ldgram.h>
252b5132
RH
33#include "ldfile.h"
34#include "ldlex.h"
35#include "ldmain.h"
d1b2b2dc 36#include "libiberty.h"
252b5132
RH
37
38/* The type of top-level parser input.
39 yylex and yyparse (indirectly) both check this. */
40input_type parser_input;
41
1753ed68
JB
42/* Line number in the current input file. */
43unsigned int lineno;
252b5132
RH
44
45/* The string we are currently lexing, or NULL if we are reading a
46 file. */
47const char *lex_string = NULL;
48
49/* Support for flex reading from more than one input file (stream).
50 `include_stack' is flex's input state for each open file;
51 `file_name_stack' is the file names. `lineno_stack' is the current
52 line numbers.
53
54 If `include_stack_ptr' is 0, we haven't started reading anything yet.
55 Otherwise, stack elements 0 through `include_stack_ptr - 1' are valid. */
56
57#undef YY_INPUT
d05c651b 58#define YY_INPUT(buf,result,max_size) result = yy_input (buf, max_size)
252b5132 59
5b806d27 60#ifndef YY_NO_UNPUT
297ba367 61#define YY_NO_UNPUT
5b806d27 62#endif
297ba367 63
252b5132
RH
64#define MAX_INCLUDE_DEPTH 10
65static YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
66static const char *file_name_stack[MAX_INCLUDE_DEPTH];
67static unsigned int lineno_stack[MAX_INCLUDE_DEPTH];
f4a23d42 68static unsigned int sysrooted_stack[MAX_INCLUDE_DEPTH];
252b5132
RH
69static unsigned int include_stack_ptr = 0;
70static int vers_node_nesting = 0;
71
d05c651b 72static int yy_input (char *, int);
1579bae1
AM
73static void comment (void);
74static void lex_warn_invalid (char *where, char *what);
252b5132 75
1579bae1 76/* STATES
252b5132
RH
77 EXPRESSION definitely in an expression
78 SCRIPT definitely in a script
eeed9cc7 79 INPUTLIST definitely in a script, a filename-list
252b5132
RH
80 BOTH either EXPRESSION or SCRIPT
81 DEFSYMEXP in an argument to -defsym
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
109%s DEFSYMEXP
110%s MRI
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
eeed9cc7 132<BOTH,SCRIPT,EXPRESSION,VERS_START,VERS_NODE,VERS_SCRIPT,INPUTLIST>"/*" { comment (); }
252b5132
RH
133
134
6c19b93b
AM
135<DEFSYMEXP>"-" { RTOKEN('-');}
136<DEFSYMEXP>"+" { RTOKEN('+');}
092da96a
AM
137<DEFSYMEXP>{SYMBOLNAMECHAR1}{SYMBOLNAMECHAR}* { yylval.name = xstrdup (yytext);
138 return NAME; }
6c19b93b 139<DEFSYMEXP>"=" { RTOKEN('='); }
252b5132
RH
140
141<MRI,EXPRESSION>"$"([0-9A-Fa-f])+ {
6c19b93b 142 yylval.integer = bfd_scan_vma (yytext + 1, 0, 16);
1579bae1 143 yylval.bigint.str = NULL;
252b5132
RH
144 return INT;
145 }
146
147<MRI,EXPRESSION>([0-9A-Fa-f])+(H|h|X|x|B|b|O|o|D|d) {
148 int ibase ;
1579bae1
AM
149 switch (yytext[yyleng - 1]) {
150 case 'X':
252b5132
RH
151 case 'x':
152 case 'H':
153 case 'h':
154 ibase = 16;
155 break;
156 case 'O':
157 case 'o':
158 ibase = 8;
159 break;
160 case 'B':
161 case 'b':
162 ibase = 2;
163 break;
164 default:
165 ibase = 10;
166 }
167 yylval.integer = bfd_scan_vma (yytext, 0,
168 ibase);
1579bae1 169 yylval.bigint.str = NULL;
252b5132
RH
170 return INT;
171 }
2c382fb6 172<SCRIPT,DEFSYMEXP,MRI,BOTH,EXPRESSION>((("$"|0[xX])([0-9A-Fa-f])+)|(([0-9])+))(M|K|m|k)? {
252b5132 173 char *s = yytext;
2c382fb6 174 int ibase = 0;
252b5132
RH
175
176 if (*s == '$')
2c382fb6
AM
177 {
178 ++s;
179 ibase = 16;
180 }
181 yylval.integer = bfd_scan_vma (s, 0, ibase);
1579bae1
AM
182 yylval.bigint.str = NULL;
183 if (yytext[yyleng - 1] == 'M'
184 || yytext[yyleng - 1] == 'm')
2c382fb6
AM
185 {
186 yylval.integer *= 1024 * 1024;
187 }
1579bae1
AM
188 else if (yytext[yyleng - 1] == 'K'
189 || yytext[yyleng - 1]=='k')
2c382fb6
AM
190 {
191 yylval.integer *= 1024;
192 }
193 else if (yytext[0] == '0'
194 && (yytext[1] == 'x'
195 || yytext[1] == 'X'))
196 {
197 yylval.bigint.str = xstrdup (yytext + 2);
198 }
252b5132
RH
199 return INT;
200 }
201<BOTH,SCRIPT,EXPRESSION,MRI>"]" { RTOKEN(']');}
202<BOTH,SCRIPT,EXPRESSION,MRI>"[" { RTOKEN('[');}
203<BOTH,SCRIPT,EXPRESSION,MRI>"<<=" { RTOKEN(LSHIFTEQ);}
204<BOTH,SCRIPT,EXPRESSION,MRI>">>=" { RTOKEN(RSHIFTEQ);}
205<BOTH,SCRIPT,EXPRESSION,MRI>"||" { RTOKEN(OROR);}
206<BOTH,SCRIPT,EXPRESSION,MRI>"==" { RTOKEN(EQ);}
207<BOTH,SCRIPT,EXPRESSION,MRI>"!=" { RTOKEN(NE);}
208<BOTH,SCRIPT,EXPRESSION,MRI>">=" { RTOKEN(GE);}
209<BOTH,SCRIPT,EXPRESSION,MRI>"<=" { RTOKEN(LE);}
210<BOTH,SCRIPT,EXPRESSION,MRI>"<<" { RTOKEN(LSHIFT);}
211<BOTH,SCRIPT,EXPRESSION,MRI>">>" { RTOKEN(RSHIFT);}
212<BOTH,SCRIPT,EXPRESSION,MRI>"+=" { RTOKEN(PLUSEQ);}
213<BOTH,SCRIPT,EXPRESSION,MRI>"-=" { RTOKEN(MINUSEQ);}
214<BOTH,SCRIPT,EXPRESSION,MRI>"*=" { RTOKEN(MULTEQ);}
215<BOTH,SCRIPT,EXPRESSION,MRI>"/=" { RTOKEN(DIVEQ);}
216<BOTH,SCRIPT,EXPRESSION,MRI>"&=" { RTOKEN(ANDEQ);}
217<BOTH,SCRIPT,EXPRESSION,MRI>"|=" { RTOKEN(OREQ);}
218<BOTH,SCRIPT,EXPRESSION,MRI>"&&" { RTOKEN(ANDAND);}
219<BOTH,SCRIPT,EXPRESSION,MRI>">" { RTOKEN('>');}
eeed9cc7 220<BOTH,SCRIPT,EXPRESSION,MRI,INPUTLIST>"," { RTOKEN(',');}
252b5132
RH
221<BOTH,SCRIPT,EXPRESSION,MRI>"&" { RTOKEN('&');}
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('<');}
6c19b93b 232<BOTH,SCRIPT,EXPRESSION,MRI>"=" { RTOKEN('=');}
3ec57632
NC
233<BOTH,SCRIPT,EXPRESSION,MRI>"}" { RTOKEN('}') ; }
234<BOTH,SCRIPT,EXPRESSION,MRI>"{" { RTOKEN('{'); }
eeed9cc7
HPN
235<BOTH,SCRIPT,EXPRESSION,MRI,INPUTLIST>")" { RTOKEN(')');}
236<BOTH,SCRIPT,EXPRESSION,MRI,INPUTLIST>"(" { RTOKEN('(');}
252b5132
RH
237<BOTH,SCRIPT,EXPRESSION,MRI>":" { RTOKEN(':'); }
238<BOTH,SCRIPT,EXPRESSION,MRI>";" { RTOKEN(';');}
3ec57632 239<BOTH,SCRIPT>"MEMORY" { RTOKEN(MEMORY);}
4a93e180 240<BOTH,SCRIPT>"REGION_ALIAS" { RTOKEN(REGION_ALIAS);}
01554a74 241<BOTH,SCRIPT>"LD_FEATURE" { RTOKEN(LD_FEATURE);}
3ec57632
NC
242<BOTH,SCRIPT,EXPRESSION>"ORIGIN" { RTOKEN(ORIGIN);}
243<BOTH,SCRIPT>"VERSION" { RTOKEN(VERSIONK);}
252b5132
RH
244<EXPRESSION,BOTH,SCRIPT>"BLOCK" { RTOKEN(BLOCK);}
245<EXPRESSION,BOTH,SCRIPT>"BIND" { RTOKEN(BIND);}
3ec57632
NC
246<BOTH,SCRIPT,EXPRESSION>"LENGTH" { RTOKEN(LENGTH);}
247<EXPRESSION,BOTH,SCRIPT>"ALIGN" { RTOKEN(ALIGN_K);}
2d20f7bf 248<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_ALIGN" { RTOKEN(DATA_SEGMENT_ALIGN);}
8c37241b 249<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_RELRO_END" { RTOKEN(DATA_SEGMENT_RELRO_END);}
2d20f7bf 250<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_END" { RTOKEN(DATA_SEGMENT_END);}
3ec57632
NC
251<EXPRESSION,BOTH,SCRIPT>"ADDR" { RTOKEN(ADDR);}
252<EXPRESSION,BOTH,SCRIPT>"LOADADDR" { RTOKEN(LOADADDR);}
362c1d1a 253<EXPRESSION,BOTH,SCRIPT>"ALIGNOF" { RTOKEN(ALIGNOF); }
252b5132
RH
254<EXPRESSION,BOTH>"MAX" { RTOKEN(MAX_K); }
255<EXPRESSION,BOTH>"MIN" { RTOKEN(MIN_K); }
2e53f7d6 256<EXPRESSION,BOTH>"LOG2CEIL" { RTOKEN(LOG2CEIL); }
8545d1a9 257<EXPRESSION,BOTH,SCRIPT>"ASSERT" { RTOKEN(ASSERT_K); }
252b5132
RH
258<BOTH,SCRIPT>"ENTRY" { RTOKEN(ENTRY);}
259<BOTH,SCRIPT,MRI>"EXTERN" { RTOKEN(EXTERN);}
3ec57632 260<EXPRESSION,BOTH,SCRIPT>"NEXT" { RTOKEN(NEXT);}
252b5132
RH
261<EXPRESSION,BOTH,SCRIPT>"sizeof_headers" { RTOKEN(SIZEOF_HEADERS);}
262<EXPRESSION,BOTH,SCRIPT>"SIZEOF_HEADERS" { RTOKEN(SIZEOF_HEADERS);}
ba916c8a 263<EXPRESSION,BOTH,SCRIPT>"SEGMENT_START" { RTOKEN(SEGMENT_START);}
252b5132 264<BOTH,SCRIPT>"MAP" { RTOKEN(MAP);}
3ec57632
NC
265<EXPRESSION,BOTH,SCRIPT>"SIZEOF" { RTOKEN(SIZEOF);}
266<BOTH,SCRIPT>"TARGET" { RTOKEN(TARGET_K);}
252b5132 267<BOTH,SCRIPT>"SEARCH_DIR" { RTOKEN(SEARCH_DIR);}
3ec57632 268<BOTH,SCRIPT>"OUTPUT" { RTOKEN(OUTPUT);}
252b5132
RH
269<BOTH,SCRIPT>"INPUT" { RTOKEN(INPUT);}
270<EXPRESSION,BOTH,SCRIPT>"GROUP" { RTOKEN(GROUP);}
eeed9cc7 271<EXPRESSION,BOTH,SCRIPT,INPUTLIST>"AS_NEEDED" { RTOKEN(AS_NEEDED);}
3ec57632 272<EXPRESSION,BOTH,SCRIPT>"DEFINED" { RTOKEN(DEFINED);}
252b5132
RH
273<BOTH,SCRIPT>"CREATE_OBJECT_SYMBOLS" { RTOKEN(CREATE_OBJECT_SYMBOLS);}
274<BOTH,SCRIPT>"CONSTRUCTORS" { RTOKEN( CONSTRUCTORS);}
3ec57632 275<BOTH,SCRIPT>"FORCE_COMMON_ALLOCATION" { RTOKEN(FORCE_COMMON_ALLOCATION);}
7bdf4127 276<BOTH,SCRIPT>"FORCE_GROUP_ALLOCATION" { RTOKEN(FORCE_GROUP_ALLOCATION);}
4818e05f 277<BOTH,SCRIPT>"INHIBIT_COMMON_ALLOCATION" { RTOKEN(INHIBIT_COMMON_ALLOCATION);}
3ec57632 278<BOTH,SCRIPT>"SECTIONS" { RTOKEN(SECTIONS);}
53d25da6
AM
279<BOTH,SCRIPT>"INSERT" { RTOKEN(INSERT_K);}
280<BOTH,SCRIPT>"AFTER" { RTOKEN(AFTER);}
281<BOTH,SCRIPT>"BEFORE" { RTOKEN(BEFORE);}
252b5132 282<BOTH,SCRIPT>"FILL" { RTOKEN(FILL);}
3ec57632 283<BOTH,SCRIPT>"STARTUP" { RTOKEN(STARTUP);}
252b5132
RH
284<BOTH,SCRIPT>"OUTPUT_FORMAT" { RTOKEN(OUTPUT_FORMAT);}
285<BOTH,SCRIPT>"OUTPUT_ARCH" { RTOKEN( OUTPUT_ARCH);}
286<BOTH,SCRIPT>"HLL" { RTOKEN(HLL);}
3ec57632 287<BOTH,SCRIPT>"SYSLIB" { RTOKEN(SYSLIB);}
252b5132
RH
288<BOTH,SCRIPT>"FLOAT" { RTOKEN(FLOAT);}
289<BOTH,SCRIPT>"QUAD" { RTOKEN( QUAD);}
290<BOTH,SCRIPT>"SQUAD" { RTOKEN( SQUAD);}
291<BOTH,SCRIPT>"LONG" { RTOKEN( LONG);}
292<BOTH,SCRIPT>"SHORT" { RTOKEN( SHORT);}
293<BOTH,SCRIPT>"BYTE" { RTOKEN( BYTE);}
3ec57632 294<BOTH,SCRIPT>"NOFLOAT" { RTOKEN(NOFLOAT);}
252b5132 295<EXPRESSION,BOTH,SCRIPT>"NOCROSSREFS" { RTOKEN(NOCROSSREFS);}
cdf96953 296<EXPRESSION,BOTH,SCRIPT>"NOCROSSREFS_TO" { RTOKEN(NOCROSSREFS_TO);}
252b5132 297<BOTH,SCRIPT>"OVERLAY" { RTOKEN(OVERLAY); }
bcaa7b3e
L
298<BOTH,SCRIPT>"SORT_BY_NAME" { RTOKEN(SORT_BY_NAME); }
299<BOTH,SCRIPT>"SORT_BY_ALIGNMENT" { RTOKEN(SORT_BY_ALIGNMENT); }
300<BOTH,SCRIPT>"SORT" { RTOKEN(SORT_BY_NAME); }
02ecc8e9 301<BOTH,SCRIPT>"SORT_BY_INIT_PRIORITY" { RTOKEN(SORT_BY_INIT_PRIORITY); }
eda680f8 302<BOTH,SCRIPT>"SORT_NONE" { RTOKEN(SORT_NONE); }
252b5132
RH
303<EXPRESSION,BOTH,SCRIPT>"NOLOAD" { RTOKEN(NOLOAD);}
304<EXPRESSION,BOTH,SCRIPT>"DSECT" { RTOKEN(DSECT);}
305<EXPRESSION,BOTH,SCRIPT>"COPY" { RTOKEN(COPY);}
306<EXPRESSION,BOTH,SCRIPT>"INFO" { RTOKEN(INFO);}
307<EXPRESSION,BOTH,SCRIPT>"OVERLAY" { RTOKEN(OVERLAY);}
0841712e
JJ
308<EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RO" { RTOKEN(ONLY_IF_RO); }
309<EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RW" { RTOKEN(ONLY_IF_RW); }
0cf7d72c 310<EXPRESSION,BOTH,SCRIPT>"SPECIAL" { RTOKEN(SPECIAL); }
252b5132
RH
311<BOTH,SCRIPT>"o" { RTOKEN(ORIGIN);}
312<BOTH,SCRIPT>"org" { RTOKEN(ORIGIN);}
313<BOTH,SCRIPT>"l" { RTOKEN( LENGTH);}
314<BOTH,SCRIPT>"len" { RTOKEN( LENGTH);}
ae17ab41 315<EXPRESSION,BOTH,SCRIPT>"INPUT_SECTION_FLAGS" { RTOKEN(INPUT_SECTION_FLAGS); }
4006703d 316<EXPRESSION,BOTH,SCRIPT>"INCLUDE" { RTOKEN(INCLUDE);}
252b5132 317<BOTH,SCRIPT>"PHDRS" { RTOKEN (PHDRS); }
3ec57632 318<EXPRESSION,BOTH,SCRIPT>"AT" { RTOKEN(AT);}
1eec346e 319<EXPRESSION,BOTH,SCRIPT>"ALIGN_WITH_INPUT" { RTOKEN(ALIGN_WITH_INPUT);}
3ec57632 320<EXPRESSION,BOTH,SCRIPT>"SUBALIGN" { RTOKEN(SUBALIGN);}
eb8476a6 321<EXPRESSION,BOTH,SCRIPT>"HIDDEN" { RTOKEN(HIDDEN); }
3ec57632 322<EXPRESSION,BOTH,SCRIPT>"PROVIDE" { RTOKEN(PROVIDE); }
7af8e998 323<EXPRESSION,BOTH,SCRIPT>"PROVIDE_HIDDEN" { RTOKEN(PROVIDE_HIDDEN); }
252b5132 324<EXPRESSION,BOTH,SCRIPT>"KEEP" { RTOKEN(KEEP); }
3ec57632 325<EXPRESSION,BOTH,SCRIPT>"EXCLUDE_FILE" { RTOKEN(EXCLUDE_FILE); }
24718e3b 326<EXPRESSION,BOTH,SCRIPT>"CONSTANT" { RTOKEN(CONSTANT);}
252b5132 327<MRI>"#".*\n? { ++ lineno; }
6c19b93b 328<MRI>"\n" { ++ lineno; RTOKEN(NEWLINE); }
252b5132
RH
329<MRI>"*".* { /* Mri comment line */ }
330<MRI>";".* { /* Mri comment line */ }
6c19b93b 331<MRI>"END" { RTOKEN(ENDWORD); }
3ec57632
NC
332<MRI>"ALIGNMOD" { RTOKEN(ALIGNMOD);}
333<MRI>"ALIGN" { RTOKEN(ALIGN_K);}
6c19b93b
AM
334<MRI>"CHIP" { RTOKEN(CHIP); }
335<MRI>"BASE" { RTOKEN(BASE); }
336<MRI>"ALIAS" { RTOKEN(ALIAS); }
337<MRI>"TRUNCATE" { RTOKEN(TRUNCATE); }
338<MRI>"LOAD" { RTOKEN(LOAD); }
339<MRI>"PUBLIC" { RTOKEN(PUBLIC); }
340<MRI>"ORDER" { RTOKEN(ORDER); }
341<MRI>"NAME" { RTOKEN(NAMEWORD); }
342<MRI>"FORMAT" { RTOKEN(FORMAT); }
343<MRI>"CASE" { RTOKEN(CASE); }
344<MRI>"START" { RTOKEN(START); }
345<MRI>"LIST".* { RTOKEN(LIST); /* LIST and ignore to end of line */ }
252b5132
RH
346<MRI>"SECT" { RTOKEN(SECT); }
347<EXPRESSION,BOTH,SCRIPT,MRI>"ABSOLUTE" { RTOKEN(ABSOLUTE); }
6c19b93b 348<MRI>"end" { RTOKEN(ENDWORD); }
3ec57632
NC
349<MRI>"alignmod" { RTOKEN(ALIGNMOD);}
350<MRI>"align" { RTOKEN(ALIGN_K);}
6c19b93b
AM
351<MRI>"chip" { RTOKEN(CHIP); }
352<MRI>"base" { RTOKEN(BASE); }
353<MRI>"alias" { RTOKEN(ALIAS); }
354<MRI>"truncate" { RTOKEN(TRUNCATE); }
355<MRI>"load" { RTOKEN(LOAD); }
356<MRI>"public" { RTOKEN(PUBLIC); }
357<MRI>"order" { RTOKEN(ORDER); }
358<MRI>"name" { RTOKEN(NAMEWORD); }
359<MRI>"format" { RTOKEN(FORMAT); }
360<MRI>"case" { RTOKEN(CASE); }
361<MRI>"extern" { RTOKEN(EXTERN); }
362<MRI>"start" { RTOKEN(START); }
363<MRI>"list".* { RTOKEN(LIST); /* LIST and ignore to end of line */ }
252b5132
RH
364<MRI>"sect" { RTOKEN(SECT); }
365<EXPRESSION,BOTH,SCRIPT,MRI>"absolute" { RTOKEN(ABSOLUTE); }
366
367<MRI>{FILENAMECHAR1}{NOCFILENAMECHAR}* {
368/* Filename without commas, needed to parse mri stuff */
092da96a 369 yylval.name = xstrdup (yytext);
252b5132
RH
370 return NAME;
371 }
372
373
eeed9cc7 374<BOTH,INPUTLIST>{FILENAMECHAR1}{FILENAMECHAR}* {
092da96a 375 yylval.name = xstrdup (yytext);
252b5132
RH
376 return NAME;
377 }
eeed9cc7 378<INPUTLIST>"="{FILENAMECHAR1}{FILENAMECHAR}* {
3aa2d05a 379/* Filename to be prefixed by --sysroot or when non-sysrooted, nothing. */
092da96a 380 yylval.name = xstrdup (yytext);
eeed9cc7
HPN
381 return NAME;
382 }
383<BOTH,INPUTLIST>"-l"{FILENAMECHAR}+ {
8545d1a9
NS
384 yylval.name = xstrdup (yytext + 2);
385 return LNAME;
386 }
092da96a
AM
387<EXPRESSION>{SYMBOLNAMECHAR1}{NOCFILENAMECHAR}* {
388 yylval.name = xstrdup (yytext);
8545d1a9
NS
389 return NAME;
390 }
1c6aafe8
AM
391<EXPRESSION>"/DISCARD/" {
392 yylval.name = xstrdup (yytext);
393 return NAME;
394 }
8545d1a9 395<EXPRESSION>"-l"{NOCFILENAMECHAR}+ {
d1b2b2dc 396 yylval.name = xstrdup (yytext + 2);
252b5132
RH
397 return LNAME;
398 }
399<SCRIPT>{WILDCHAR}* {
400 /* Annoyingly, this pattern can match comments, and we have
401 longest match issues to consider. So if the first two
402 characters are a comment opening, put the input back and
403 try again. */
404 if (yytext[0] == '/' && yytext[1] == '*')
405 {
1579bae1 406 yyless (2);
252b5132
RH
407 comment ();
408 }
409 else
410 {
1579bae1 411 yylval.name = xstrdup (yytext);
252b5132
RH
412 return NAME;
413 }
414 }
415
eeed9cc7 416<EXPRESSION,BOTH,SCRIPT,VERS_NODE,INPUTLIST>"\""[^\"]*"\"" {
252b5132 417 /* No matter the state, quotes
406bd128
NC
418 give what's inside. */
419 bfd_size_type len;
1579bae1 420 yylval.name = xstrdup (yytext + 1);
406bd128
NC
421 /* PR ld/20906. A corrupt input file
422 can contain bogus strings. */
423 len = strlen (yylval.name);
2688aab2 424 if (len > (bfd_size_type) yyleng - 2)
406bd128
NC
425 len = yyleng - 2;
426 yylval.name[len] = 0;
252b5132
RH
427 return NAME;
428 }
429<BOTH,SCRIPT,EXPRESSION>"\n" { lineno++;}
430<MRI,BOTH,SCRIPT,EXPRESSION>[ \t\r]+ { }
431
432<VERS_NODE,VERS_SCRIPT>[:,;] { return *yytext; }
433
434<VERS_NODE>global { RTOKEN(GLOBAL); }
435
436<VERS_NODE>local { RTOKEN(LOCAL); }
437
438<VERS_NODE>extern { RTOKEN(EXTERN); }
439
d1b2b2dc 440<VERS_NODE>{V_IDENTIFIER} { yylval.name = xstrdup (yytext);
252b5132
RH
441 return VERS_IDENTIFIER; }
442
d1b2b2dc 443<VERS_SCRIPT>{V_TAG} { yylval.name = xstrdup (yytext);
252b5132
RH
444 return VERS_TAG; }
445
446<VERS_START>"{" { BEGIN(VERS_SCRIPT); return *yytext; }
447
1579bae1 448<VERS_SCRIPT>"{" { BEGIN(VERS_NODE);
252b5132
RH
449 vers_node_nesting = 0;
450 return *yytext;
451 }
452<VERS_SCRIPT>"}" { return *yytext; }
453<VERS_NODE>"{" { vers_node_nesting++; return *yytext; }
454<VERS_NODE>"}" { if (--vers_node_nesting < 0)
455 BEGIN(VERS_SCRIPT);
456 return *yytext;
457 }
458
a13eab06 459<VERS_START,VERS_NODE,VERS_SCRIPT,INPUTLIST>[\n] { lineno++; }
252b5132
RH
460
461<VERS_START,VERS_NODE,VERS_SCRIPT>#.* { /* Eat up comments */ }
462
6c19b93b 463<VERS_START,VERS_NODE,VERS_SCRIPT,INPUTLIST>[ \t\r]+ { /* Eat up whitespace */ }
252b5132
RH
464
465<<EOF>> {
466 include_stack_ptr--;
1579bae1 467 if (include_stack_ptr == 0)
1753ed68
JB
468 {
469 lineno = 0;
470 yyterminate ();
471 }
1579bae1 472 else
1579bae1 473 yy_switch_to_buffer (include_stack[include_stack_ptr]);
b47c4208 474
b47c4208 475 lineno = lineno_stack[include_stack_ptr];
f4a23d42 476 input_flags.sysrooted = sysrooted_stack[include_stack_ptr];
252b5132
RH
477
478 return END;
479}
480
1579bae1
AM
481<SCRIPT,MRI,VERS_START,VERS_SCRIPT,VERS_NODE>. lex_warn_invalid (" in script", yytext);
482<EXPRESSION,DEFSYMEXP,BOTH>. lex_warn_invalid (" in expression", yytext);
483
252b5132
RH
484%%
485\f
486
487/* Switch flex to reading script file NAME, open on FILE,
488 saving the current input info on the include stack. */
489
490void
f4a23d42 491lex_push_file (FILE *file, const char *name, unsigned int sysrooted)
252b5132 492{
1579bae1 493 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
252b5132 494 {
d003af55 495 einfo (_("%F:includes nested too deeply\n"));
252b5132
RH
496 }
497 file_name_stack[include_stack_ptr] = name;
b47c4208 498 lineno_stack[include_stack_ptr] = lineno;
f4a23d42 499 sysrooted_stack[include_stack_ptr] = input_flags.sysrooted;
252b5132
RH
500 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
501
502 include_stack_ptr++;
b47c4208 503 lineno = 1;
f4a23d42 504 input_flags.sysrooted = sysrooted;
252b5132 505 yyin = file;
1579bae1 506 yy_switch_to_buffer (yy_create_buffer (yyin, YY_BUF_SIZE));
252b5132
RH
507}
508
509/* Return a newly created flex input buffer containing STRING,
510 which is SIZE bytes long. */
511
1579bae1
AM
512static YY_BUFFER_STATE
513yy_create_string_buffer (const char *string, size_t size)
252b5132
RH
514{
515 YY_BUFFER_STATE b;
516
517 /* Calls to m-alloc get turned by sed into xm-alloc. */
1579bae1 518 b = malloc (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. */
1579bae1 524 b->yy_ch_buf = malloc ((unsigned) (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();
d003af55
AM
678 while (c != '*' && c != EOF)
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
d003af55
AM
697 if (c == EOF)
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}