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