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