PR ld/12356
[deliverable/binutils-gdb.git] / ld / ldlex.l
CommitLineData
cfdf38f2
BE
1%option nounput
2
252b5132
RH
3%{
4
968ec2b9 5/* Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
aa820537 6 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
3db64b00 7 Free Software Foundation, Inc.
f96b4a7b 8 Written by Steve Chamberlain of Cygnus Support.
252b5132 9
f96b4a7b 10 This file is part of the GNU Binutils.
252b5132 11
f96b4a7b 12 This program is free software; you can redistribute it and/or modify
3ec57632 13 it under the terms of the GNU General Public License as published by
f96b4a7b
NC
14 the Free Software Foundation; either version 3 of the License, or
15 (at your option) any later version.
252b5132 16
f96b4a7b 17 This program is distributed in the hope that it will be useful,
3ec57632
NC
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
252b5132 21
3ec57632 22 You should have received a copy of the GNU General Public License
f96b4a7b
NC
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
25 MA 02110-1301, USA. */
252b5132 26
3db64b00 27#include "bfd.h"
3882b010 28#include "safe-ctype.h"
e3e942e9 29#include "bfdlink.h"
252b5132 30#include "ld.h"
252b5132
RH
31#include "ldmisc.h"
32#include "ldexp.h"
33#include "ldlang.h"
df2a7313 34#include <ldgram.h>
252b5132
RH
35#include "ldfile.h"
36#include "ldlex.h"
37#include "ldmain.h"
d1b2b2dc 38#include "libiberty.h"
252b5132
RH
39
40/* The type of top-level parser input.
41 yylex and yyparse (indirectly) both check this. */
42input_type parser_input;
43
44/* Line number in the current input file.
45 (FIXME Actually, it doesn't appear to get reset for each file?) */
46unsigned int lineno = 1;
47
48/* The string we are currently lexing, or NULL if we are reading a
49 file. */
50const char *lex_string = NULL;
51
52/* Support for flex reading from more than one input file (stream).
53 `include_stack' is flex's input state for each open file;
54 `file_name_stack' is the file names. `lineno_stack' is the current
55 line numbers.
56
57 If `include_stack_ptr' is 0, we haven't started reading anything yet.
58 Otherwise, stack elements 0 through `include_stack_ptr - 1' are valid. */
59
60#undef YY_INPUT
d05c651b 61#define YY_INPUT(buf,result,max_size) result = yy_input (buf, max_size)
252b5132 62
297ba367
NC
63#define YY_NO_UNPUT
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];
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
79 BOTH either EXPRESSION or SCRIPT
80 DEFSYMEXP in an argument to -defsym
81 MRI in an MRI script
82 VERS_START starting a Sun style mapfile
83 VERS_SCRIPT a Sun style mapfile
84 VERS_NODE a node within a Sun style mapfile
85*/
86#define RTOKEN(x) { yylval.token = x; return x; }
87
88/* Some versions of flex want this. */
89#ifndef yywrap
1579bae1 90int yywrap (void) { return 1; }
252b5132
RH
91#endif
92%}
93
94%a 4000
95%o 5000
96
97CMDFILENAMECHAR [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\-\~]
98CMDFILENAMECHAR1 [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\~]
99FILENAMECHAR1 [_a-zA-Z\/\.\\\$\_\~]
100SYMBOLCHARN [_a-zA-Z\/\.\\\$\_\~0-9]
101FILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\\,\~]
107c6e11 102WILDCHAR [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\\,\~\?\*\^\!]
1579bae1 103WHITE [ \t\n\r]+
252b5132
RH
104
105NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
106
107V_TAG [.$_a-zA-Z][._a-zA-Z0-9]*
5e35cbc2 108V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
252b5132
RH
109
110%s SCRIPT
111%s EXPRESSION
112%s BOTH
113%s DEFSYMEXP
114%s MRI
115%s VERS_START
116%s VERS_SCRIPT
117%s VERS_NODE
118%%
119
120 if (parser_input != input_selected)
121 {
122 /* The first token of the input determines the initial parser state. */
123 input_type t = parser_input;
124 parser_input = input_selected;
125 switch (t)
126 {
127 case input_script: return INPUT_SCRIPT; break;
128 case input_mri_script: return INPUT_MRI_SCRIPT; break;
129 case input_version_script: return INPUT_VERSION_SCRIPT; break;
55255dae 130 case input_dynamic_list: return INPUT_DYNAMIC_LIST; break;
252b5132
RH
131 case input_defsym: return INPUT_DEFSYM; break;
132 default: abort ();
133 }
134 }
135
1579bae1 136<BOTH,SCRIPT,EXPRESSION,VERS_START,VERS_NODE,VERS_SCRIPT>"/*" { comment (); }
252b5132
RH
137
138
139<DEFSYMEXP>"-" { RTOKEN('-');}
140<DEFSYMEXP>"+" { RTOKEN('+');}
1579bae1 141<DEFSYMEXP>{FILENAMECHAR1}{SYMBOLCHARN}* { yylval.name = xstrdup (yytext); return NAME; }
252b5132
RH
142<DEFSYMEXP>"=" { RTOKEN('='); }
143
144<MRI,EXPRESSION>"$"([0-9A-Fa-f])+ {
1579bae1
AM
145 yylval.integer = bfd_scan_vma (yytext + 1, 0, 16);
146 yylval.bigint.str = NULL;
252b5132
RH
147 return INT;
148 }
149
150<MRI,EXPRESSION>([0-9A-Fa-f])+(H|h|X|x|B|b|O|o|D|d) {
151 int ibase ;
1579bae1
AM
152 switch (yytext[yyleng - 1]) {
153 case 'X':
252b5132
RH
154 case 'x':
155 case 'H':
156 case 'h':
157 ibase = 16;
158 break;
159 case 'O':
160 case 'o':
161 ibase = 8;
162 break;
163 case 'B':
164 case 'b':
165 ibase = 2;
166 break;
167 default:
168 ibase = 10;
169 }
170 yylval.integer = bfd_scan_vma (yytext, 0,
171 ibase);
1579bae1 172 yylval.bigint.str = NULL;
252b5132
RH
173 return INT;
174 }
2c382fb6 175<SCRIPT,DEFSYMEXP,MRI,BOTH,EXPRESSION>((("$"|0[xX])([0-9A-Fa-f])+)|(([0-9])+))(M|K|m|k)? {
252b5132 176 char *s = yytext;
2c382fb6 177 int ibase = 0;
252b5132
RH
178
179 if (*s == '$')
2c382fb6
AM
180 {
181 ++s;
182 ibase = 16;
183 }
184 yylval.integer = bfd_scan_vma (s, 0, ibase);
1579bae1
AM
185 yylval.bigint.str = NULL;
186 if (yytext[yyleng - 1] == 'M'
187 || yytext[yyleng - 1] == 'm')
2c382fb6
AM
188 {
189 yylval.integer *= 1024 * 1024;
190 }
1579bae1
AM
191 else if (yytext[yyleng - 1] == 'K'
192 || yytext[yyleng - 1]=='k')
2c382fb6
AM
193 {
194 yylval.integer *= 1024;
195 }
196 else if (yytext[0] == '0'
197 && (yytext[1] == 'x'
198 || yytext[1] == 'X'))
199 {
200 yylval.bigint.str = xstrdup (yytext + 2);
201 }
252b5132
RH
202 return INT;
203 }
204<BOTH,SCRIPT,EXPRESSION,MRI>"]" { RTOKEN(']');}
205<BOTH,SCRIPT,EXPRESSION,MRI>"[" { RTOKEN('[');}
206<BOTH,SCRIPT,EXPRESSION,MRI>"<<=" { RTOKEN(LSHIFTEQ);}
207<BOTH,SCRIPT,EXPRESSION,MRI>">>=" { RTOKEN(RSHIFTEQ);}
208<BOTH,SCRIPT,EXPRESSION,MRI>"||" { RTOKEN(OROR);}
209<BOTH,SCRIPT,EXPRESSION,MRI>"==" { RTOKEN(EQ);}
210<BOTH,SCRIPT,EXPRESSION,MRI>"!=" { RTOKEN(NE);}
211<BOTH,SCRIPT,EXPRESSION,MRI>">=" { RTOKEN(GE);}
212<BOTH,SCRIPT,EXPRESSION,MRI>"<=" { RTOKEN(LE);}
213<BOTH,SCRIPT,EXPRESSION,MRI>"<<" { RTOKEN(LSHIFT);}
214<BOTH,SCRIPT,EXPRESSION,MRI>">>" { RTOKEN(RSHIFT);}
215<BOTH,SCRIPT,EXPRESSION,MRI>"+=" { RTOKEN(PLUSEQ);}
216<BOTH,SCRIPT,EXPRESSION,MRI>"-=" { RTOKEN(MINUSEQ);}
217<BOTH,SCRIPT,EXPRESSION,MRI>"*=" { RTOKEN(MULTEQ);}
218<BOTH,SCRIPT,EXPRESSION,MRI>"/=" { RTOKEN(DIVEQ);}
219<BOTH,SCRIPT,EXPRESSION,MRI>"&=" { RTOKEN(ANDEQ);}
220<BOTH,SCRIPT,EXPRESSION,MRI>"|=" { RTOKEN(OREQ);}
221<BOTH,SCRIPT,EXPRESSION,MRI>"&&" { RTOKEN(ANDAND);}
222<BOTH,SCRIPT,EXPRESSION,MRI>">" { RTOKEN('>');}
223<BOTH,SCRIPT,EXPRESSION,MRI>"," { RTOKEN(',');}
224<BOTH,SCRIPT,EXPRESSION,MRI>"&" { RTOKEN('&');}
225<BOTH,SCRIPT,EXPRESSION,MRI>"|" { RTOKEN('|');}
226<BOTH,SCRIPT,EXPRESSION,MRI>"~" { RTOKEN('~');}
227<BOTH,SCRIPT,EXPRESSION,MRI>"!" { RTOKEN('!');}
228<BOTH,SCRIPT,EXPRESSION,MRI>"?" { RTOKEN('?');}
229<BOTH,SCRIPT,EXPRESSION,MRI>"*" { RTOKEN('*');}
230<BOTH,SCRIPT,EXPRESSION,MRI>"+" { RTOKEN('+');}
231<BOTH,SCRIPT,EXPRESSION,MRI>"-" { RTOKEN('-');}
232<BOTH,SCRIPT,EXPRESSION,MRI>"/" { RTOKEN('/');}
233<BOTH,SCRIPT,EXPRESSION,MRI>"%" { RTOKEN('%');}
234<BOTH,SCRIPT,EXPRESSION,MRI>"<" { RTOKEN('<');}
3ec57632
NC
235<BOTH,SCRIPT,EXPRESSION,MRI>"=" { RTOKEN('=');}
236<BOTH,SCRIPT,EXPRESSION,MRI>"}" { RTOKEN('}') ; }
237<BOTH,SCRIPT,EXPRESSION,MRI>"{" { RTOKEN('{'); }
238<BOTH,SCRIPT,EXPRESSION,MRI>")" { RTOKEN(')');}
239<BOTH,SCRIPT,EXPRESSION,MRI>"(" { RTOKEN('(');}
252b5132
RH
240<BOTH,SCRIPT,EXPRESSION,MRI>":" { RTOKEN(':'); }
241<BOTH,SCRIPT,EXPRESSION,MRI>";" { RTOKEN(';');}
3ec57632 242<BOTH,SCRIPT>"MEMORY" { RTOKEN(MEMORY);}
4a93e180 243<BOTH,SCRIPT>"REGION_ALIAS" { RTOKEN(REGION_ALIAS);}
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); }
8545d1a9 258<EXPRESSION,BOTH,SCRIPT>"ASSERT" { RTOKEN(ASSERT_K); }
252b5132
RH
259<BOTH,SCRIPT>"ENTRY" { RTOKEN(ENTRY);}
260<BOTH,SCRIPT,MRI>"EXTERN" { RTOKEN(EXTERN);}
3ec57632 261<EXPRESSION,BOTH,SCRIPT>"NEXT" { RTOKEN(NEXT);}
252b5132
RH
262<EXPRESSION,BOTH,SCRIPT>"sizeof_headers" { RTOKEN(SIZEOF_HEADERS);}
263<EXPRESSION,BOTH,SCRIPT>"SIZEOF_HEADERS" { RTOKEN(SIZEOF_HEADERS);}
ba916c8a 264<EXPRESSION,BOTH,SCRIPT>"SEGMENT_START" { RTOKEN(SEGMENT_START);}
252b5132 265<BOTH,SCRIPT>"MAP" { RTOKEN(MAP);}
3ec57632
NC
266<EXPRESSION,BOTH,SCRIPT>"SIZEOF" { RTOKEN(SIZEOF);}
267<BOTH,SCRIPT>"TARGET" { RTOKEN(TARGET_K);}
252b5132 268<BOTH,SCRIPT>"SEARCH_DIR" { RTOKEN(SEARCH_DIR);}
3ec57632 269<BOTH,SCRIPT>"OUTPUT" { RTOKEN(OUTPUT);}
252b5132
RH
270<BOTH,SCRIPT>"INPUT" { RTOKEN(INPUT);}
271<EXPRESSION,BOTH,SCRIPT>"GROUP" { RTOKEN(GROUP);}
b717d30e 272<EXPRESSION,BOTH,SCRIPT>"AS_NEEDED" { RTOKEN(AS_NEEDED);}
3ec57632 273<EXPRESSION,BOTH,SCRIPT>"DEFINED" { RTOKEN(DEFINED);}
252b5132
RH
274<BOTH,SCRIPT>"CREATE_OBJECT_SYMBOLS" { RTOKEN(CREATE_OBJECT_SYMBOLS);}
275<BOTH,SCRIPT>"CONSTRUCTORS" { RTOKEN( CONSTRUCTORS);}
3ec57632 276<BOTH,SCRIPT>"FORCE_COMMON_ALLOCATION" { RTOKEN(FORCE_COMMON_ALLOCATION);}
4818e05f 277<BOTH,SCRIPT>"INHIBIT_COMMON_ALLOCATION" { RTOKEN(INHIBIT_COMMON_ALLOCATION);}
3ec57632 278<BOTH,SCRIPT>"SECTIONS" { RTOKEN(SECTIONS);}
53d25da6
AM
279<BOTH,SCRIPT>"INSERT" { RTOKEN(INSERT_K);}
280<BOTH,SCRIPT>"AFTER" { RTOKEN(AFTER);}
281<BOTH,SCRIPT>"BEFORE" { RTOKEN(BEFORE);}
252b5132 282<BOTH,SCRIPT>"FILL" { RTOKEN(FILL);}
3ec57632 283<BOTH,SCRIPT>"STARTUP" { RTOKEN(STARTUP);}
252b5132
RH
284<BOTH,SCRIPT>"OUTPUT_FORMAT" { RTOKEN(OUTPUT_FORMAT);}
285<BOTH,SCRIPT>"OUTPUT_ARCH" { RTOKEN( OUTPUT_ARCH);}
286<BOTH,SCRIPT>"HLL" { RTOKEN(HLL);}
3ec57632 287<BOTH,SCRIPT>"SYSLIB" { RTOKEN(SYSLIB);}
252b5132
RH
288<BOTH,SCRIPT>"FLOAT" { RTOKEN(FLOAT);}
289<BOTH,SCRIPT>"QUAD" { RTOKEN( QUAD);}
290<BOTH,SCRIPT>"SQUAD" { RTOKEN( SQUAD);}
291<BOTH,SCRIPT>"LONG" { RTOKEN( LONG);}
292<BOTH,SCRIPT>"SHORT" { RTOKEN( SHORT);}
293<BOTH,SCRIPT>"BYTE" { RTOKEN( BYTE);}
3ec57632 294<BOTH,SCRIPT>"NOFLOAT" { RTOKEN(NOFLOAT);}
252b5132
RH
295<EXPRESSION,BOTH,SCRIPT>"NOCROSSREFS" { RTOKEN(NOCROSSREFS);}
296<BOTH,SCRIPT>"OVERLAY" { RTOKEN(OVERLAY); }
bcaa7b3e
L
297<BOTH,SCRIPT>"SORT_BY_NAME" { RTOKEN(SORT_BY_NAME); }
298<BOTH,SCRIPT>"SORT_BY_ALIGNMENT" { RTOKEN(SORT_BY_ALIGNMENT); }
299<BOTH,SCRIPT>"SORT" { RTOKEN(SORT_BY_NAME); }
02ecc8e9 300<BOTH,SCRIPT>"SORT_BY_INIT_PRIORITY" { RTOKEN(SORT_BY_INIT_PRIORITY); }
252b5132
RH
301<EXPRESSION,BOTH,SCRIPT>"NOLOAD" { RTOKEN(NOLOAD);}
302<EXPRESSION,BOTH,SCRIPT>"DSECT" { RTOKEN(DSECT);}
303<EXPRESSION,BOTH,SCRIPT>"COPY" { RTOKEN(COPY);}
304<EXPRESSION,BOTH,SCRIPT>"INFO" { RTOKEN(INFO);}
305<EXPRESSION,BOTH,SCRIPT>"OVERLAY" { RTOKEN(OVERLAY);}
0841712e
JJ
306<EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RO" { RTOKEN(ONLY_IF_RO); }
307<EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RW" { RTOKEN(ONLY_IF_RW); }
0cf7d72c 308<EXPRESSION,BOTH,SCRIPT>"SPECIAL" { RTOKEN(SPECIAL); }
252b5132
RH
309<BOTH,SCRIPT>"o" { RTOKEN(ORIGIN);}
310<BOTH,SCRIPT>"org" { RTOKEN(ORIGIN);}
311<BOTH,SCRIPT>"l" { RTOKEN( LENGTH);}
312<BOTH,SCRIPT>"len" { RTOKEN( LENGTH);}
4006703d 313<EXPRESSION,BOTH,SCRIPT>"INCLUDE" { RTOKEN(INCLUDE);}
252b5132 314<BOTH,SCRIPT>"PHDRS" { RTOKEN (PHDRS); }
3ec57632
NC
315<EXPRESSION,BOTH,SCRIPT>"AT" { RTOKEN(AT);}
316<EXPRESSION,BOTH,SCRIPT>"SUBALIGN" { RTOKEN(SUBALIGN);}
317<EXPRESSION,BOTH,SCRIPT>"PROVIDE" { RTOKEN(PROVIDE); }
7af8e998 318<EXPRESSION,BOTH,SCRIPT>"PROVIDE_HIDDEN" { RTOKEN(PROVIDE_HIDDEN); }
252b5132 319<EXPRESSION,BOTH,SCRIPT>"KEEP" { RTOKEN(KEEP); }
3ec57632 320<EXPRESSION,BOTH,SCRIPT>"EXCLUDE_FILE" { RTOKEN(EXCLUDE_FILE); }
24718e3b 321<EXPRESSION,BOTH,SCRIPT>"CONSTANT" { RTOKEN(CONSTANT);}
252b5132
RH
322<MRI>"#".*\n? { ++ lineno; }
323<MRI>"\n" { ++ lineno; RTOKEN(NEWLINE); }
324<MRI>"*".* { /* Mri comment line */ }
325<MRI>";".* { /* Mri comment line */ }
326<MRI>"END" { RTOKEN(ENDWORD); }
3ec57632
NC
327<MRI>"ALIGNMOD" { RTOKEN(ALIGNMOD);}
328<MRI>"ALIGN" { RTOKEN(ALIGN_K);}
252b5132
RH
329<MRI>"CHIP" { RTOKEN(CHIP); }
330<MRI>"BASE" { RTOKEN(BASE); }
3ec57632
NC
331<MRI>"ALIAS" { RTOKEN(ALIAS); }
332<MRI>"TRUNCATE" { RTOKEN(TRUNCATE); }
252b5132
RH
333<MRI>"LOAD" { RTOKEN(LOAD); }
334<MRI>"PUBLIC" { RTOKEN(PUBLIC); }
335<MRI>"ORDER" { RTOKEN(ORDER); }
336<MRI>"NAME" { RTOKEN(NAMEWORD); }
337<MRI>"FORMAT" { RTOKEN(FORMAT); }
338<MRI>"CASE" { RTOKEN(CASE); }
339<MRI>"START" { RTOKEN(START); }
340<MRI>"LIST".* { RTOKEN(LIST); /* LIST and ignore to end of line */ }
341<MRI>"SECT" { RTOKEN(SECT); }
342<EXPRESSION,BOTH,SCRIPT,MRI>"ABSOLUTE" { RTOKEN(ABSOLUTE); }
343<MRI>"end" { RTOKEN(ENDWORD); }
3ec57632
NC
344<MRI>"alignmod" { RTOKEN(ALIGNMOD);}
345<MRI>"align" { RTOKEN(ALIGN_K);}
252b5132
RH
346<MRI>"chip" { RTOKEN(CHIP); }
347<MRI>"base" { RTOKEN(BASE); }
3ec57632
NC
348<MRI>"alias" { RTOKEN(ALIAS); }
349<MRI>"truncate" { RTOKEN(TRUNCATE); }
252b5132
RH
350<MRI>"load" { RTOKEN(LOAD); }
351<MRI>"public" { RTOKEN(PUBLIC); }
352<MRI>"order" { RTOKEN(ORDER); }
353<MRI>"name" { RTOKEN(NAMEWORD); }
354<MRI>"format" { RTOKEN(FORMAT); }
355<MRI>"case" { RTOKEN(CASE); }
356<MRI>"extern" { RTOKEN(EXTERN); }
357<MRI>"start" { RTOKEN(START); }
358<MRI>"list".* { RTOKEN(LIST); /* LIST and ignore to end of line */ }
359<MRI>"sect" { RTOKEN(SECT); }
360<EXPRESSION,BOTH,SCRIPT,MRI>"absolute" { RTOKEN(ABSOLUTE); }
361
362<MRI>{FILENAMECHAR1}{NOCFILENAMECHAR}* {
363/* Filename without commas, needed to parse mri stuff */
1579bae1 364 yylval.name = xstrdup (yytext);
252b5132
RH
365 return NAME;
366 }
367
368
8545d1a9 369<BOTH>{FILENAMECHAR1}{FILENAMECHAR}* {
1579bae1 370 yylval.name = xstrdup (yytext);
252b5132
RH
371 return NAME;
372 }
8545d1a9
NS
373<BOTH>"-l"{FILENAMECHAR}+ {
374 yylval.name = xstrdup (yytext + 2);
375 return LNAME;
376 }
377<EXPRESSION>{FILENAMECHAR1}{NOCFILENAMECHAR}* {
378 yylval.name = xstrdup (yytext);
379 return NAME;
380 }
381<EXPRESSION>"-l"{NOCFILENAMECHAR}+ {
d1b2b2dc 382 yylval.name = xstrdup (yytext + 2);
252b5132
RH
383 return LNAME;
384 }
385<SCRIPT>{WILDCHAR}* {
386 /* Annoyingly, this pattern can match comments, and we have
387 longest match issues to consider. So if the first two
388 characters are a comment opening, put the input back and
389 try again. */
390 if (yytext[0] == '/' && yytext[1] == '*')
391 {
1579bae1 392 yyless (2);
252b5132
RH
393 comment ();
394 }
395 else
396 {
1579bae1 397 yylval.name = xstrdup (yytext);
252b5132
RH
398 return NAME;
399 }
400 }
401
402<EXPRESSION,BOTH,SCRIPT,VERS_NODE>"\""[^\"]*"\"" {
403 /* No matter the state, quotes
404 give what's inside */
1579bae1
AM
405 yylval.name = xstrdup (yytext + 1);
406 yylval.name[yyleng - 2] = 0;
252b5132
RH
407 return NAME;
408 }
409<BOTH,SCRIPT,EXPRESSION>"\n" { lineno++;}
410<MRI,BOTH,SCRIPT,EXPRESSION>[ \t\r]+ { }
411
412<VERS_NODE,VERS_SCRIPT>[:,;] { return *yytext; }
413
414<VERS_NODE>global { RTOKEN(GLOBAL); }
415
416<VERS_NODE>local { RTOKEN(LOCAL); }
417
418<VERS_NODE>extern { RTOKEN(EXTERN); }
419
d1b2b2dc 420<VERS_NODE>{V_IDENTIFIER} { yylval.name = xstrdup (yytext);
252b5132
RH
421 return VERS_IDENTIFIER; }
422
d1b2b2dc 423<VERS_SCRIPT>{V_TAG} { yylval.name = xstrdup (yytext);
252b5132
RH
424 return VERS_TAG; }
425
426<VERS_START>"{" { BEGIN(VERS_SCRIPT); return *yytext; }
427
1579bae1 428<VERS_SCRIPT>"{" { BEGIN(VERS_NODE);
252b5132
RH
429 vers_node_nesting = 0;
430 return *yytext;
431 }
432<VERS_SCRIPT>"}" { return *yytext; }
433<VERS_NODE>"{" { vers_node_nesting++; return *yytext; }
434<VERS_NODE>"}" { if (--vers_node_nesting < 0)
435 BEGIN(VERS_SCRIPT);
436 return *yytext;
437 }
438
439<VERS_START,VERS_NODE,VERS_SCRIPT>[\n] { lineno++; }
440
441<VERS_START,VERS_NODE,VERS_SCRIPT>#.* { /* Eat up comments */ }
442
443<VERS_START,VERS_NODE,VERS_SCRIPT>[ \t\r]+ { /* Eat up whitespace */ }
444
445<<EOF>> {
446 include_stack_ptr--;
1579bae1
AM
447
448 if (include_stack_ptr == 0)
252b5132 449 {
1579bae1 450 yyterminate ();
252b5132 451 }
1579bae1 452 else
252b5132 453 {
1579bae1 454 yy_switch_to_buffer (include_stack[include_stack_ptr]);
252b5132 455 }
b47c4208 456
252b5132 457 ldfile_input_filename = file_name_stack[include_stack_ptr - 1];
b47c4208 458 lineno = lineno_stack[include_stack_ptr];
252b5132
RH
459
460 return END;
461}
462
1579bae1
AM
463<SCRIPT,MRI,VERS_START,VERS_SCRIPT,VERS_NODE>. lex_warn_invalid (" in script", yytext);
464<EXPRESSION,DEFSYMEXP,BOTH>. lex_warn_invalid (" in expression", yytext);
465
252b5132
RH
466%%
467\f
468
469/* Switch flex to reading script file NAME, open on FILE,
470 saving the current input info on the include stack. */
471
472void
1579bae1 473lex_push_file (FILE *file, const char *name)
252b5132 474{
1579bae1 475 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
252b5132 476 {
1579bae1 477 einfo ("%F:includes nested too deeply\n");
252b5132
RH
478 }
479 file_name_stack[include_stack_ptr] = name;
b47c4208 480 lineno_stack[include_stack_ptr] = lineno;
252b5132
RH
481 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
482
483 include_stack_ptr++;
b47c4208 484 lineno = 1;
252b5132 485 yyin = file;
1579bae1 486 yy_switch_to_buffer (yy_create_buffer (yyin, YY_BUF_SIZE));
252b5132
RH
487}
488
489/* Return a newly created flex input buffer containing STRING,
490 which is SIZE bytes long. */
491
1579bae1
AM
492static YY_BUFFER_STATE
493yy_create_string_buffer (const char *string, size_t size)
252b5132
RH
494{
495 YY_BUFFER_STATE b;
496
497 /* Calls to m-alloc get turned by sed into xm-alloc. */
1579bae1 498 b = malloc (sizeof (struct yy_buffer_state));
252b5132
RH
499 b->yy_input_file = 0;
500 b->yy_buf_size = size;
501
502 /* yy_ch_buf has to be 2 characters longer than the size given because
503 we need to put in 2 end-of-buffer characters. */
1579bae1 504 b->yy_ch_buf = malloc ((unsigned) (b->yy_buf_size + 3));
252b5132
RH
505
506 b->yy_ch_buf[0] = '\n';
507 strcpy (b->yy_ch_buf+1, string);
508 b->yy_ch_buf[size+1] = YY_END_OF_BUFFER_CHAR;
509 b->yy_ch_buf[size+2] = YY_END_OF_BUFFER_CHAR;
510 b->yy_n_chars = size+1;
511 b->yy_buf_pos = &b->yy_ch_buf[1];
512
dca7760f
AM
513 b->yy_is_our_buffer = 1;
514 b->yy_is_interactive = 0;
515 b->yy_at_bol = 1;
516 b->yy_fill_buffer = 0;
517
252b5132
RH
518 /* flex 2.4.7 changed the interface. FIXME: We should not be using
519 a flex internal interface in the first place! */
520#ifdef YY_BUFFER_NEW
521 b->yy_buffer_status = YY_BUFFER_NEW;
522#else
523 b->yy_eof_status = EOF_NOT_SEEN;
524#endif
525
526 return b;
527}
528
529/* Switch flex to reading from STRING, saving the current input info
530 on the include stack. */
531
532void
1579bae1 533lex_redirect (const char *string)
252b5132
RH
534{
535 YY_BUFFER_STATE tmp;
536
537 yy_init = 0;
1579bae1 538 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
252b5132
RH
539 {
540 einfo("%F: macros nested too deeply\n");
541 }
542 file_name_stack[include_stack_ptr] = "redirect";
b47c4208 543 lineno_stack[include_stack_ptr] = lineno;
252b5132
RH
544 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
545 include_stack_ptr++;
b47c4208 546 lineno = 1;
252b5132
RH
547 tmp = yy_create_string_buffer (string, strlen (string));
548 yy_switch_to_buffer (tmp);
252b5132
RH
549}
550\f
551/* Functions to switch to a different flex start condition,
552 saving the current start condition on `state_stack'. */
553
554static int state_stack[MAX_INCLUDE_DEPTH * 2];
555static int *state_stack_p = state_stack;
556
557void
1579bae1 558ldlex_script (void)
252b5132
RH
559{
560 *(state_stack_p)++ = yy_start;
561 BEGIN (SCRIPT);
562}
563
564void
1579bae1 565ldlex_mri_script (void)
252b5132
RH
566{
567 *(state_stack_p)++ = yy_start;
568 BEGIN (MRI);
569}
570
571void
1579bae1 572ldlex_version_script (void)
252b5132
RH
573{
574 *(state_stack_p)++ = yy_start;
575 BEGIN (VERS_START);
576}
577
578void
1579bae1 579ldlex_version_file (void)
252b5132
RH
580{
581 *(state_stack_p)++ = yy_start;
582 BEGIN (VERS_SCRIPT);
583}
584
585void
1579bae1 586ldlex_defsym (void)
252b5132
RH
587{
588 *(state_stack_p)++ = yy_start;
589 BEGIN (DEFSYMEXP);
590}
1579bae1 591
252b5132 592void
1579bae1 593ldlex_expression (void)
252b5132
RH
594{
595 *(state_stack_p)++ = yy_start;
596 BEGIN (EXPRESSION);
597}
598
599void
1579bae1 600ldlex_both (void)
252b5132
RH
601{
602 *(state_stack_p)++ = yy_start;
603 BEGIN (BOTH);
604}
605
606void
1579bae1 607ldlex_popstate (void)
252b5132
RH
608{
609 yy_start = *(--state_stack_p);
610}
611\f
612
d05c651b 613/* Place up to MAX_SIZE characters in BUF and return
252b5132
RH
614 either the number of characters read, or 0 to indicate EOF. */
615
d05c651b
AS
616static int
617yy_input (char *buf, int max_size)
252b5132 618{
d05c651b 619 int result = 0;
731e28d8 620 if (YY_CURRENT_BUFFER->yy_input_file)
252b5132
RH
621 {
622 if (yyin)
623 {
d05c651b
AS
624 result = fread (buf, 1, max_size, yyin);
625 if (result < max_size && ferror (yyin))
252b5132
RH
626 einfo ("%F%P: read in flex scanner failed\n");
627 }
628 }
d05c651b 629 return result;
252b5132
RH
630}
631
632/* Eat the rest of a C-style comment. */
633
634static void
1579bae1 635comment (void)
252b5132
RH
636{
637 int c;
638
639 while (1)
640 {
641 c = input();
1579bae1 642 while (c != '*' && c != EOF)
252b5132
RH
643 {
644 if (c == '\n')
645 lineno++;
646 c = input();
647 }
648
649 if (c == '*')
650 {
651 c = input();
652 while (c == '*')
653 c = input();
654 if (c == '/')
655 break; /* found the end */
656 }
657
658 if (c == '\n')
659 lineno++;
660
661 if (c == EOF)
662 {
663 einfo( "%F%P: EOF in comment\n");
664 break;
665 }
666 }
667}
668
669/* Warn the user about a garbage character WHAT in the input
670 in context WHERE. */
671
672static void
1579bae1 673lex_warn_invalid (char *where, char *what)
252b5132
RH
674{
675 char buf[5];
676
677 /* If we have found an input file whose format we do not recognize,
678 and we are therefore treating it as a linker script, and we find
679 an invalid character, then most likely this is a real object file
680 of some different format. Treat it as such. */
681 if (ldfile_assumed_script)
682 {
683 bfd_set_error (bfd_error_file_not_recognized);
684 einfo ("%F%s: file not recognized: %E\n", ldfile_input_filename);
685 }
686
3882b010 687 if (! ISPRINT (*what))
252b5132
RH
688 {
689 sprintf (buf, "\\%03o", (unsigned int) *what);
690 what = buf;
691 }
692
693 einfo ("%P:%S: ignoring invalid character `%s'%s\n", what, where);
694}
This page took 0.545516 seconds and 4 git commands to generate.