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