ld: Fix spelling mistake in comment.
[deliverable/binutils-gdb.git] / ld / ldlex.l
CommitLineData
b0556316 1%option nounput noyywrap
cfdf38f2 2
252b5132
RH
3%{
4
2571583a 5/* Copyright (C) 1991-2017 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
82 MRI in an MRI script
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
94CMDFILENAMECHAR [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\-\~]
95CMDFILENAMECHAR1 [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\~]
96FILENAMECHAR1 [_a-zA-Z\/\.\\\$\_\~]
97SYMBOLCHARN [_a-zA-Z\/\.\\\$\_\~0-9]
98FILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\\,\~]
107c6e11 99WILDCHAR [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\\,\~\?\*\^\!]
1579bae1 100WHITE [ \t\n\r]+
252b5132
RH
101
102NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
103
104V_TAG [.$_a-zA-Z][._a-zA-Z0-9]*
5e35cbc2 105V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
252b5132
RH
106
107%s SCRIPT
eeed9cc7 108%s INPUTLIST
252b5132
RH
109%s EXPRESSION
110%s BOTH
111%s DEFSYMEXP
112%s MRI
113%s VERS_START
114%s VERS_SCRIPT
115%s VERS_NODE
116%%
117
118 if (parser_input != input_selected)
119 {
120 /* The first token of the input determines the initial parser state. */
121 input_type t = parser_input;
122 parser_input = input_selected;
123 switch (t)
124 {
125 case input_script: return INPUT_SCRIPT; break;
126 case input_mri_script: return INPUT_MRI_SCRIPT; break;
127 case input_version_script: return INPUT_VERSION_SCRIPT; break;
55255dae 128 case input_dynamic_list: return INPUT_DYNAMIC_LIST; break;
252b5132
RH
129 case input_defsym: return INPUT_DEFSYM; break;
130 default: abort ();
131 }
132 }
133
eeed9cc7 134<BOTH,SCRIPT,EXPRESSION,VERS_START,VERS_NODE,VERS_SCRIPT,INPUTLIST>"/*" { comment (); }
252b5132
RH
135
136
137<DEFSYMEXP>"-" { RTOKEN('-');}
138<DEFSYMEXP>"+" { RTOKEN('+');}
1579bae1 139<DEFSYMEXP>{FILENAMECHAR1}{SYMBOLCHARN}* { yylval.name = xstrdup (yytext); return NAME; }
252b5132
RH
140<DEFSYMEXP>"=" { RTOKEN('='); }
141
142<MRI,EXPRESSION>"$"([0-9A-Fa-f])+ {
1579bae1
AM
143 yylval.integer = bfd_scan_vma (yytext + 1, 0, 16);
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('<');}
3ec57632
NC
233<BOTH,SCRIPT,EXPRESSION,MRI>"=" { RTOKEN('=');}
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
RH
328<MRI>"#".*\n? { ++ lineno; }
329<MRI>"\n" { ++ lineno; RTOKEN(NEWLINE); }
330<MRI>"*".* { /* Mri comment line */ }
331<MRI>";".* { /* Mri comment line */ }
332<MRI>"END" { RTOKEN(ENDWORD); }
3ec57632
NC
333<MRI>"ALIGNMOD" { RTOKEN(ALIGNMOD);}
334<MRI>"ALIGN" { RTOKEN(ALIGN_K);}
252b5132
RH
335<MRI>"CHIP" { RTOKEN(CHIP); }
336<MRI>"BASE" { RTOKEN(BASE); }
3ec57632
NC
337<MRI>"ALIAS" { RTOKEN(ALIAS); }
338<MRI>"TRUNCATE" { RTOKEN(TRUNCATE); }
252b5132
RH
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 */ }
347<MRI>"SECT" { RTOKEN(SECT); }
348<EXPRESSION,BOTH,SCRIPT,MRI>"ABSOLUTE" { RTOKEN(ABSOLUTE); }
349<MRI>"end" { RTOKEN(ENDWORD); }
3ec57632
NC
350<MRI>"alignmod" { RTOKEN(ALIGNMOD);}
351<MRI>"align" { RTOKEN(ALIGN_K);}
252b5132
RH
352<MRI>"chip" { RTOKEN(CHIP); }
353<MRI>"base" { RTOKEN(BASE); }
3ec57632
NC
354<MRI>"alias" { RTOKEN(ALIAS); }
355<MRI>"truncate" { RTOKEN(TRUNCATE); }
252b5132
RH
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 */ }
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 */
1579bae1 370 yylval.name = xstrdup (yytext);
252b5132
RH
371 return NAME;
372 }
373
374
eeed9cc7 375<BOTH,INPUTLIST>{FILENAMECHAR1}{FILENAMECHAR}* {
1579bae1 376 yylval.name = xstrdup (yytext);
252b5132
RH
377 return NAME;
378 }
eeed9cc7 379<INPUTLIST>"="{FILENAMECHAR1}{FILENAMECHAR}* {
3aa2d05a
NC
380/* Filename to be prefixed by --sysroot or when non-sysrooted, nothing. */
381 yylval.name = xstrdup (yytext);
382 return NAME;
383 }
384<INPUTLIST>"$SYSROOT"{FILENAMECHAR1}{FILENAMECHAR}* {
eeed9cc7
HPN
385/* Filename to be prefixed by --sysroot or when non-sysrooted, nothing. */
386 yylval.name = xstrdup (yytext);
387 return NAME;
388 }
389<BOTH,INPUTLIST>"-l"{FILENAMECHAR}+ {
8545d1a9
NS
390 yylval.name = xstrdup (yytext + 2);
391 return LNAME;
392 }
393<EXPRESSION>{FILENAMECHAR1}{NOCFILENAMECHAR}* {
394 yylval.name = xstrdup (yytext);
395 return NAME;
396 }
397<EXPRESSION>"-l"{NOCFILENAMECHAR}+ {
d1b2b2dc 398 yylval.name = xstrdup (yytext + 2);
252b5132
RH
399 return LNAME;
400 }
401<SCRIPT>{WILDCHAR}* {
402 /* Annoyingly, this pattern can match comments, and we have
403 longest match issues to consider. So if the first two
404 characters are a comment opening, put the input back and
405 try again. */
406 if (yytext[0] == '/' && yytext[1] == '*')
407 {
1579bae1 408 yyless (2);
252b5132
RH
409 comment ();
410 }
411 else
412 {
1579bae1 413 yylval.name = xstrdup (yytext);
252b5132
RH
414 return NAME;
415 }
416 }
417
eeed9cc7 418<EXPRESSION,BOTH,SCRIPT,VERS_NODE,INPUTLIST>"\""[^\"]*"\"" {
252b5132 419 /* No matter the state, quotes
406bd128
NC
420 give what's inside. */
421 bfd_size_type len;
1579bae1 422 yylval.name = xstrdup (yytext + 1);
406bd128
NC
423 /* PR ld/20906. A corrupt input file
424 can contain bogus strings. */
425 len = strlen (yylval.name);
426 if (len > yyleng - 2)
427 len = yyleng - 2;
428 yylval.name[len] = 0;
252b5132
RH
429 return NAME;
430 }
431<BOTH,SCRIPT,EXPRESSION>"\n" { lineno++;}
432<MRI,BOTH,SCRIPT,EXPRESSION>[ \t\r]+ { }
433
434<VERS_NODE,VERS_SCRIPT>[:,;] { return *yytext; }
435
436<VERS_NODE>global { RTOKEN(GLOBAL); }
437
438<VERS_NODE>local { RTOKEN(LOCAL); }
439
440<VERS_NODE>extern { RTOKEN(EXTERN); }
441
d1b2b2dc 442<VERS_NODE>{V_IDENTIFIER} { yylval.name = xstrdup (yytext);
252b5132
RH
443 return VERS_IDENTIFIER; }
444
d1b2b2dc 445<VERS_SCRIPT>{V_TAG} { yylval.name = xstrdup (yytext);
252b5132
RH
446 return VERS_TAG; }
447
448<VERS_START>"{" { BEGIN(VERS_SCRIPT); return *yytext; }
449
1579bae1 450<VERS_SCRIPT>"{" { BEGIN(VERS_NODE);
252b5132
RH
451 vers_node_nesting = 0;
452 return *yytext;
453 }
454<VERS_SCRIPT>"}" { return *yytext; }
455<VERS_NODE>"{" { vers_node_nesting++; return *yytext; }
456<VERS_NODE>"}" { if (--vers_node_nesting < 0)
457 BEGIN(VERS_SCRIPT);
458 return *yytext;
459 }
460
a13eab06 461<VERS_START,VERS_NODE,VERS_SCRIPT,INPUTLIST>[\n] { lineno++; }
252b5132
RH
462
463<VERS_START,VERS_NODE,VERS_SCRIPT>#.* { /* Eat up comments */ }
464
eeed9cc7 465<VERS_START,VERS_NODE,VERS_SCRIPT,INPUTLIST>[ \t\r]+ { /* Eat up whitespace */ }
252b5132
RH
466
467<<EOF>> {
468 include_stack_ptr--;
1579bae1 469 if (include_stack_ptr == 0)
1753ed68
JB
470 {
471 lineno = 0;
472 yyterminate ();
473 }
1579bae1 474 else
1579bae1 475 yy_switch_to_buffer (include_stack[include_stack_ptr]);
b47c4208 476
b47c4208 477 lineno = lineno_stack[include_stack_ptr];
f4a23d42 478 input_flags.sysrooted = sysrooted_stack[include_stack_ptr];
252b5132
RH
479
480 return END;
481}
482
1579bae1
AM
483<SCRIPT,MRI,VERS_START,VERS_SCRIPT,VERS_NODE>. lex_warn_invalid (" in script", yytext);
484<EXPRESSION,DEFSYMEXP,BOTH>. lex_warn_invalid (" in expression", yytext);
485
252b5132
RH
486%%
487\f
488
489/* Switch flex to reading script file NAME, open on FILE,
490 saving the current input info on the include stack. */
491
492void
f4a23d42 493lex_push_file (FILE *file, const char *name, unsigned int sysrooted)
252b5132 494{
1579bae1 495 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
252b5132 496 {
1579bae1 497 einfo ("%F:includes nested too deeply\n");
252b5132
RH
498 }
499 file_name_stack[include_stack_ptr] = name;
b47c4208 500 lineno_stack[include_stack_ptr] = lineno;
f4a23d42 501 sysrooted_stack[include_stack_ptr] = input_flags.sysrooted;
252b5132
RH
502 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
503
504 include_stack_ptr++;
b47c4208 505 lineno = 1;
f4a23d42 506 input_flags.sysrooted = sysrooted;
252b5132 507 yyin = file;
1579bae1 508 yy_switch_to_buffer (yy_create_buffer (yyin, YY_BUF_SIZE));
252b5132
RH
509}
510
511/* Return a newly created flex input buffer containing STRING,
512 which is SIZE bytes long. */
513
1579bae1
AM
514static YY_BUFFER_STATE
515yy_create_string_buffer (const char *string, size_t size)
252b5132
RH
516{
517 YY_BUFFER_STATE b;
518
519 /* Calls to m-alloc get turned by sed into xm-alloc. */
1579bae1 520 b = malloc (sizeof (struct yy_buffer_state));
252b5132
RH
521 b->yy_input_file = 0;
522 b->yy_buf_size = size;
523
524 /* yy_ch_buf has to be 2 characters longer than the size given because
525 we need to put in 2 end-of-buffer characters. */
1579bae1 526 b->yy_ch_buf = malloc ((unsigned) (b->yy_buf_size + 3));
252b5132
RH
527
528 b->yy_ch_buf[0] = '\n';
529 strcpy (b->yy_ch_buf+1, string);
530 b->yy_ch_buf[size+1] = YY_END_OF_BUFFER_CHAR;
531 b->yy_ch_buf[size+2] = YY_END_OF_BUFFER_CHAR;
532 b->yy_n_chars = size+1;
533 b->yy_buf_pos = &b->yy_ch_buf[1];
534
dca7760f
AM
535 b->yy_is_our_buffer = 1;
536 b->yy_is_interactive = 0;
537 b->yy_at_bol = 1;
538 b->yy_fill_buffer = 0;
539
252b5132
RH
540 /* flex 2.4.7 changed the interface. FIXME: We should not be using
541 a flex internal interface in the first place! */
542#ifdef YY_BUFFER_NEW
543 b->yy_buffer_status = YY_BUFFER_NEW;
544#else
545 b->yy_eof_status = EOF_NOT_SEEN;
546#endif
547
548 return b;
549}
550
551/* Switch flex to reading from STRING, saving the current input info
552 on the include stack. */
553
554void
dab69f68 555lex_redirect (const char *string, const char *fake_filename, unsigned int count)
252b5132
RH
556{
557 YY_BUFFER_STATE tmp;
558
559 yy_init = 0;
1579bae1 560 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
252b5132
RH
561 {
562 einfo("%F: macros nested too deeply\n");
563 }
dab69f68 564 file_name_stack[include_stack_ptr] = fake_filename;
b47c4208 565 lineno_stack[include_stack_ptr] = lineno;
252b5132
RH
566 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
567 include_stack_ptr++;
dab69f68 568 lineno = count;
252b5132
RH
569 tmp = yy_create_string_buffer (string, strlen (string));
570 yy_switch_to_buffer (tmp);
252b5132
RH
571}
572\f
573/* Functions to switch to a different flex start condition,
574 saving the current start condition on `state_stack'. */
575
576static int state_stack[MAX_INCLUDE_DEPTH * 2];
577static int *state_stack_p = state_stack;
578
579void
1579bae1 580ldlex_script (void)
252b5132
RH
581{
582 *(state_stack_p)++ = yy_start;
583 BEGIN (SCRIPT);
584}
585
eeed9cc7
HPN
586void
587ldlex_inputlist (void)
588{
589 *(state_stack_p)++ = yy_start;
590 BEGIN (INPUTLIST);
591}
592
252b5132 593void
1579bae1 594ldlex_mri_script (void)
252b5132
RH
595{
596 *(state_stack_p)++ = yy_start;
597 BEGIN (MRI);
598}
599
600void
1579bae1 601ldlex_version_script (void)
252b5132
RH
602{
603 *(state_stack_p)++ = yy_start;
604 BEGIN (VERS_START);
605}
606
607void
1579bae1 608ldlex_version_file (void)
252b5132
RH
609{
610 *(state_stack_p)++ = yy_start;
611 BEGIN (VERS_SCRIPT);
612}
613
614void
1579bae1 615ldlex_defsym (void)
252b5132
RH
616{
617 *(state_stack_p)++ = yy_start;
618 BEGIN (DEFSYMEXP);
619}
1579bae1 620
252b5132 621void
1579bae1 622ldlex_expression (void)
252b5132
RH
623{
624 *(state_stack_p)++ = yy_start;
625 BEGIN (EXPRESSION);
626}
627
628void
1579bae1 629ldlex_both (void)
252b5132
RH
630{
631 *(state_stack_p)++ = yy_start;
632 BEGIN (BOTH);
633}
634
635void
1579bae1 636ldlex_popstate (void)
252b5132
RH
637{
638 yy_start = *(--state_stack_p);
639}
dab69f68
AM
640
641/* Return the current file name, or the previous file if no file is
642 current. */
643
644const char*
645ldlex_filename (void)
646{
647 return file_name_stack[include_stack_ptr - (include_stack_ptr != 0)];
648}
252b5132
RH
649\f
650
d05c651b 651/* Place up to MAX_SIZE characters in BUF and return
252b5132
RH
652 either the number of characters read, or 0 to indicate EOF. */
653
d05c651b
AS
654static int
655yy_input (char *buf, int max_size)
252b5132 656{
d05c651b 657 int result = 0;
731e28d8 658 if (YY_CURRENT_BUFFER->yy_input_file)
252b5132
RH
659 {
660 if (yyin)
661 {
d05c651b
AS
662 result = fread (buf, 1, max_size, yyin);
663 if (result < max_size && ferror (yyin))
252b5132
RH
664 einfo ("%F%P: read in flex scanner failed\n");
665 }
666 }
d05c651b 667 return result;
252b5132
RH
668}
669
670/* Eat the rest of a C-style comment. */
671
672static void
1579bae1 673comment (void)
252b5132
RH
674{
675 int c;
676
677 while (1)
678 {
679 c = input();
1579bae1 680 while (c != '*' && c != EOF)
252b5132
RH
681 {
682 if (c == '\n')
683 lineno++;
684 c = input();
685 }
686
687 if (c == '*')
688 {
689 c = input();
690 while (c == '*')
691 c = input();
692 if (c == '/')
693 break; /* found the end */
694 }
695
696 if (c == '\n')
697 lineno++;
698
699 if (c == EOF)
700 {
701 einfo( "%F%P: EOF in comment\n");
702 break;
703 }
704 }
705}
706
707/* Warn the user about a garbage character WHAT in the input
708 in context WHERE. */
709
710static void
1579bae1 711lex_warn_invalid (char *where, char *what)
252b5132
RH
712{
713 char buf[5];
714
715 /* If we have found an input file whose format we do not recognize,
716 and we are therefore treating it as a linker script, and we find
717 an invalid character, then most likely this is a real object file
718 of some different format. Treat it as such. */
719 if (ldfile_assumed_script)
720 {
721 bfd_set_error (bfd_error_file_not_recognized);
dab69f68 722 einfo ("%F%s: file not recognized: %E\n", ldlex_filename ());
252b5132
RH
723 }
724
3882b010 725 if (! ISPRINT (*what))
252b5132 726 {
c3a7b120 727 sprintf (buf, "\\%03o", *(unsigned char *) what);
252b5132
RH
728 what = buf;
729 }
730
dab69f68 731 einfo ("%P:%S: ignoring invalid character `%s'%s\n", NULL, what, where);
252b5132 732}
This page took 0.800147 seconds and 4 git commands to generate.