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