merge from gcc
[deliverable/binutils-gdb.git] / ld / ldlex.l
CommitLineData
cfdf38f2
BE
1%option nounput
2
252b5132
RH
3%{
4
729c05fc 5/* Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
dab69f68 6 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
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
5b806d27 63#ifndef YY_NO_UNPUT
297ba367 64#define YY_NO_UNPUT
5b806d27 65#endif
297ba367 66
252b5132
RH
67#define MAX_INCLUDE_DEPTH 10
68static YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
69static const char *file_name_stack[MAX_INCLUDE_DEPTH];
70static unsigned int lineno_stack[MAX_INCLUDE_DEPTH];
71static unsigned int include_stack_ptr = 0;
72static int vers_node_nesting = 0;
73
d05c651b 74static int yy_input (char *, int);
1579bae1
AM
75static void comment (void);
76static void lex_warn_invalid (char *where, char *what);
252b5132 77
1579bae1 78/* STATES
252b5132
RH
79 EXPRESSION definitely in an expression
80 SCRIPT definitely in a script
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
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
1579bae1 138<BOTH,SCRIPT,EXPRESSION,VERS_START,VERS_NODE,VERS_SCRIPT>"/*" { 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('>');}
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('/');}
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('{'); }
240<BOTH,SCRIPT,EXPRESSION,MRI>")" { RTOKEN(')');}
241<BOTH,SCRIPT,EXPRESSION,MRI>"(" { 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); }
8545d1a9 261<EXPRESSION,BOTH,SCRIPT>"ASSERT" { RTOKEN(ASSERT_K); }
252b5132
RH
262<BOTH,SCRIPT>"ENTRY" { RTOKEN(ENTRY);}
263<BOTH,SCRIPT,MRI>"EXTERN" { RTOKEN(EXTERN);}
3ec57632 264<EXPRESSION,BOTH,SCRIPT>"NEXT" { RTOKEN(NEXT);}
252b5132
RH
265<EXPRESSION,BOTH,SCRIPT>"sizeof_headers" { RTOKEN(SIZEOF_HEADERS);}
266<EXPRESSION,BOTH,SCRIPT>"SIZEOF_HEADERS" { RTOKEN(SIZEOF_HEADERS);}
ba916c8a 267<EXPRESSION,BOTH,SCRIPT>"SEGMENT_START" { RTOKEN(SEGMENT_START);}
252b5132 268<BOTH,SCRIPT>"MAP" { RTOKEN(MAP);}
3ec57632
NC
269<EXPRESSION,BOTH,SCRIPT>"SIZEOF" { RTOKEN(SIZEOF);}
270<BOTH,SCRIPT>"TARGET" { RTOKEN(TARGET_K);}
252b5132 271<BOTH,SCRIPT>"SEARCH_DIR" { RTOKEN(SEARCH_DIR);}
3ec57632 272<BOTH,SCRIPT>"OUTPUT" { RTOKEN(OUTPUT);}
252b5132
RH
273<BOTH,SCRIPT>"INPUT" { RTOKEN(INPUT);}
274<EXPRESSION,BOTH,SCRIPT>"GROUP" { RTOKEN(GROUP);}
b717d30e 275<EXPRESSION,BOTH,SCRIPT>"AS_NEEDED" { RTOKEN(AS_NEEDED);}
3ec57632 276<EXPRESSION,BOTH,SCRIPT>"DEFINED" { RTOKEN(DEFINED);}
252b5132
RH
277<BOTH,SCRIPT>"CREATE_OBJECT_SYMBOLS" { RTOKEN(CREATE_OBJECT_SYMBOLS);}
278<BOTH,SCRIPT>"CONSTRUCTORS" { RTOKEN( CONSTRUCTORS);}
3ec57632 279<BOTH,SCRIPT>"FORCE_COMMON_ALLOCATION" { RTOKEN(FORCE_COMMON_ALLOCATION);}
4818e05f 280<BOTH,SCRIPT>"INHIBIT_COMMON_ALLOCATION" { RTOKEN(INHIBIT_COMMON_ALLOCATION);}
3ec57632 281<BOTH,SCRIPT>"SECTIONS" { RTOKEN(SECTIONS);}
53d25da6
AM
282<BOTH,SCRIPT>"INSERT" { RTOKEN(INSERT_K);}
283<BOTH,SCRIPT>"AFTER" { RTOKEN(AFTER);}
284<BOTH,SCRIPT>"BEFORE" { RTOKEN(BEFORE);}
252b5132 285<BOTH,SCRIPT>"FILL" { RTOKEN(FILL);}
3ec57632 286<BOTH,SCRIPT>"STARTUP" { RTOKEN(STARTUP);}
252b5132
RH
287<BOTH,SCRIPT>"OUTPUT_FORMAT" { RTOKEN(OUTPUT_FORMAT);}
288<BOTH,SCRIPT>"OUTPUT_ARCH" { RTOKEN( OUTPUT_ARCH);}
289<BOTH,SCRIPT>"HLL" { RTOKEN(HLL);}
3ec57632 290<BOTH,SCRIPT>"SYSLIB" { RTOKEN(SYSLIB);}
252b5132
RH
291<BOTH,SCRIPT>"FLOAT" { RTOKEN(FLOAT);}
292<BOTH,SCRIPT>"QUAD" { RTOKEN( QUAD);}
293<BOTH,SCRIPT>"SQUAD" { RTOKEN( SQUAD);}
294<BOTH,SCRIPT>"LONG" { RTOKEN( LONG);}
295<BOTH,SCRIPT>"SHORT" { RTOKEN( SHORT);}
296<BOTH,SCRIPT>"BYTE" { RTOKEN( BYTE);}
3ec57632 297<BOTH,SCRIPT>"NOFLOAT" { RTOKEN(NOFLOAT);}
252b5132
RH
298<EXPRESSION,BOTH,SCRIPT>"NOCROSSREFS" { RTOKEN(NOCROSSREFS);}
299<BOTH,SCRIPT>"OVERLAY" { RTOKEN(OVERLAY); }
bcaa7b3e
L
300<BOTH,SCRIPT>"SORT_BY_NAME" { RTOKEN(SORT_BY_NAME); }
301<BOTH,SCRIPT>"SORT_BY_ALIGNMENT" { RTOKEN(SORT_BY_ALIGNMENT); }
302<BOTH,SCRIPT>"SORT" { RTOKEN(SORT_BY_NAME); }
02ecc8e9 303<BOTH,SCRIPT>"SORT_BY_INIT_PRIORITY" { RTOKEN(SORT_BY_INIT_PRIORITY); }
252b5132
RH
304<EXPRESSION,BOTH,SCRIPT>"NOLOAD" { RTOKEN(NOLOAD);}
305<EXPRESSION,BOTH,SCRIPT>"DSECT" { RTOKEN(DSECT);}
306<EXPRESSION,BOTH,SCRIPT>"COPY" { RTOKEN(COPY);}
307<EXPRESSION,BOTH,SCRIPT>"INFO" { RTOKEN(INFO);}
308<EXPRESSION,BOTH,SCRIPT>"OVERLAY" { RTOKEN(OVERLAY);}
0841712e
JJ
309<EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RO" { RTOKEN(ONLY_IF_RO); }
310<EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RW" { RTOKEN(ONLY_IF_RW); }
0cf7d72c 311<EXPRESSION,BOTH,SCRIPT>"SPECIAL" { RTOKEN(SPECIAL); }
252b5132
RH
312<BOTH,SCRIPT>"o" { RTOKEN(ORIGIN);}
313<BOTH,SCRIPT>"org" { RTOKEN(ORIGIN);}
314<BOTH,SCRIPT>"l" { RTOKEN( LENGTH);}
315<BOTH,SCRIPT>"len" { RTOKEN( LENGTH);}
ae17ab41 316<EXPRESSION,BOTH,SCRIPT>"INPUT_SECTION_FLAGS" { RTOKEN(INPUT_SECTION_FLAGS); }
4006703d 317<EXPRESSION,BOTH,SCRIPT>"INCLUDE" { RTOKEN(INCLUDE);}
252b5132 318<BOTH,SCRIPT>"PHDRS" { RTOKEN (PHDRS); }
3ec57632
NC
319<EXPRESSION,BOTH,SCRIPT>"AT" { RTOKEN(AT);}
320<EXPRESSION,BOTH,SCRIPT>"SUBALIGN" { RTOKEN(SUBALIGN);}
321<EXPRESSION,BOTH,SCRIPT>"PROVIDE" { RTOKEN(PROVIDE); }
7af8e998 322<EXPRESSION,BOTH,SCRIPT>"PROVIDE_HIDDEN" { RTOKEN(PROVIDE_HIDDEN); }
252b5132 323<EXPRESSION,BOTH,SCRIPT>"KEEP" { RTOKEN(KEEP); }
3ec57632 324<EXPRESSION,BOTH,SCRIPT>"EXCLUDE_FILE" { RTOKEN(EXCLUDE_FILE); }
24718e3b 325<EXPRESSION,BOTH,SCRIPT>"CONSTANT" { RTOKEN(CONSTANT);}
252b5132
RH
326<MRI>"#".*\n? { ++ lineno; }
327<MRI>"\n" { ++ lineno; RTOKEN(NEWLINE); }
328<MRI>"*".* { /* Mri comment line */ }
329<MRI>";".* { /* Mri comment line */ }
330<MRI>"END" { RTOKEN(ENDWORD); }
3ec57632
NC
331<MRI>"ALIGNMOD" { RTOKEN(ALIGNMOD);}
332<MRI>"ALIGN" { RTOKEN(ALIGN_K);}
252b5132
RH
333<MRI>"CHIP" { RTOKEN(CHIP); }
334<MRI>"BASE" { RTOKEN(BASE); }
3ec57632
NC
335<MRI>"ALIAS" { RTOKEN(ALIAS); }
336<MRI>"TRUNCATE" { RTOKEN(TRUNCATE); }
252b5132
RH
337<MRI>"LOAD" { RTOKEN(LOAD); }
338<MRI>"PUBLIC" { RTOKEN(PUBLIC); }
339<MRI>"ORDER" { RTOKEN(ORDER); }
340<MRI>"NAME" { RTOKEN(NAMEWORD); }
341<MRI>"FORMAT" { RTOKEN(FORMAT); }
342<MRI>"CASE" { RTOKEN(CASE); }
343<MRI>"START" { RTOKEN(START); }
344<MRI>"LIST".* { RTOKEN(LIST); /* LIST and ignore to end of line */ }
345<MRI>"SECT" { RTOKEN(SECT); }
346<EXPRESSION,BOTH,SCRIPT,MRI>"ABSOLUTE" { RTOKEN(ABSOLUTE); }
347<MRI>"end" { RTOKEN(ENDWORD); }
3ec57632
NC
348<MRI>"alignmod" { RTOKEN(ALIGNMOD);}
349<MRI>"align" { RTOKEN(ALIGN_K);}
252b5132
RH
350<MRI>"chip" { RTOKEN(CHIP); }
351<MRI>"base" { RTOKEN(BASE); }
3ec57632
NC
352<MRI>"alias" { RTOKEN(ALIAS); }
353<MRI>"truncate" { RTOKEN(TRUNCATE); }
252b5132
RH
354<MRI>"load" { RTOKEN(LOAD); }
355<MRI>"public" { RTOKEN(PUBLIC); }
356<MRI>"order" { RTOKEN(ORDER); }
357<MRI>"name" { RTOKEN(NAMEWORD); }
358<MRI>"format" { RTOKEN(FORMAT); }
359<MRI>"case" { RTOKEN(CASE); }
360<MRI>"extern" { RTOKEN(EXTERN); }
361<MRI>"start" { RTOKEN(START); }
362<MRI>"list".* { RTOKEN(LIST); /* LIST and ignore to end of line */ }
363<MRI>"sect" { RTOKEN(SECT); }
364<EXPRESSION,BOTH,SCRIPT,MRI>"absolute" { RTOKEN(ABSOLUTE); }
365
366<MRI>{FILENAMECHAR1}{NOCFILENAMECHAR}* {
367/* Filename without commas, needed to parse mri stuff */
1579bae1 368 yylval.name = xstrdup (yytext);
252b5132
RH
369 return NAME;
370 }
371
372
8545d1a9 373<BOTH>{FILENAMECHAR1}{FILENAMECHAR}* {
1579bae1 374 yylval.name = xstrdup (yytext);
252b5132
RH
375 return NAME;
376 }
8545d1a9
NS
377<BOTH>"-l"{FILENAMECHAR}+ {
378 yylval.name = xstrdup (yytext + 2);
379 return LNAME;
380 }
381<EXPRESSION>{FILENAMECHAR1}{NOCFILENAMECHAR}* {
382 yylval.name = xstrdup (yytext);
383 return NAME;
384 }
385<EXPRESSION>"-l"{NOCFILENAMECHAR}+ {
d1b2b2dc 386 yylval.name = xstrdup (yytext + 2);
252b5132
RH
387 return LNAME;
388 }
389<SCRIPT>{WILDCHAR}* {
390 /* Annoyingly, this pattern can match comments, and we have
391 longest match issues to consider. So if the first two
392 characters are a comment opening, put the input back and
393 try again. */
394 if (yytext[0] == '/' && yytext[1] == '*')
395 {
1579bae1 396 yyless (2);
252b5132
RH
397 comment ();
398 }
399 else
400 {
1579bae1 401 yylval.name = xstrdup (yytext);
252b5132
RH
402 return NAME;
403 }
404 }
405
406<EXPRESSION,BOTH,SCRIPT,VERS_NODE>"\""[^\"]*"\"" {
407 /* No matter the state, quotes
408 give what's inside */
1579bae1
AM
409 yylval.name = xstrdup (yytext + 1);
410 yylval.name[yyleng - 2] = 0;
252b5132
RH
411 return NAME;
412 }
413<BOTH,SCRIPT,EXPRESSION>"\n" { lineno++;}
414<MRI,BOTH,SCRIPT,EXPRESSION>[ \t\r]+ { }
415
416<VERS_NODE,VERS_SCRIPT>[:,;] { return *yytext; }
417
418<VERS_NODE>global { RTOKEN(GLOBAL); }
419
420<VERS_NODE>local { RTOKEN(LOCAL); }
421
422<VERS_NODE>extern { RTOKEN(EXTERN); }
423
d1b2b2dc 424<VERS_NODE>{V_IDENTIFIER} { yylval.name = xstrdup (yytext);
252b5132
RH
425 return VERS_IDENTIFIER; }
426
d1b2b2dc 427<VERS_SCRIPT>{V_TAG} { yylval.name = xstrdup (yytext);
252b5132
RH
428 return VERS_TAG; }
429
430<VERS_START>"{" { BEGIN(VERS_SCRIPT); return *yytext; }
431
1579bae1 432<VERS_SCRIPT>"{" { BEGIN(VERS_NODE);
252b5132
RH
433 vers_node_nesting = 0;
434 return *yytext;
435 }
436<VERS_SCRIPT>"}" { return *yytext; }
437<VERS_NODE>"{" { vers_node_nesting++; return *yytext; }
438<VERS_NODE>"}" { if (--vers_node_nesting < 0)
439 BEGIN(VERS_SCRIPT);
440 return *yytext;
441 }
442
443<VERS_START,VERS_NODE,VERS_SCRIPT>[\n] { lineno++; }
444
445<VERS_START,VERS_NODE,VERS_SCRIPT>#.* { /* Eat up comments */ }
446
447<VERS_START,VERS_NODE,VERS_SCRIPT>[ \t\r]+ { /* Eat up whitespace */ }
448
449<<EOF>> {
450 include_stack_ptr--;
1579bae1 451 if (include_stack_ptr == 0)
1579bae1 452 yyterminate ();
1579bae1 453 else
1579bae1 454 yy_switch_to_buffer (include_stack[include_stack_ptr]);
b47c4208 455
b47c4208 456 lineno = lineno_stack[include_stack_ptr];
252b5132
RH
457
458 return END;
459}
460
1579bae1
AM
461<SCRIPT,MRI,VERS_START,VERS_SCRIPT,VERS_NODE>. lex_warn_invalid (" in script", yytext);
462<EXPRESSION,DEFSYMEXP,BOTH>. lex_warn_invalid (" in expression", yytext);
463
252b5132
RH
464%%
465\f
466
467/* Switch flex to reading script file NAME, open on FILE,
468 saving the current input info on the include stack. */
469
470void
1579bae1 471lex_push_file (FILE *file, const char *name)
252b5132 472{
1579bae1 473 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
252b5132 474 {
1579bae1 475 einfo ("%F:includes nested too deeply\n");
252b5132
RH
476 }
477 file_name_stack[include_stack_ptr] = name;
b47c4208 478 lineno_stack[include_stack_ptr] = lineno;
252b5132
RH
479 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
480
481 include_stack_ptr++;
b47c4208 482 lineno = 1;
252b5132 483 yyin = file;
1579bae1 484 yy_switch_to_buffer (yy_create_buffer (yyin, YY_BUF_SIZE));
252b5132
RH
485}
486
487/* Return a newly created flex input buffer containing STRING,
488 which is SIZE bytes long. */
489
1579bae1
AM
490static YY_BUFFER_STATE
491yy_create_string_buffer (const char *string, size_t size)
252b5132
RH
492{
493 YY_BUFFER_STATE b;
494
495 /* Calls to m-alloc get turned by sed into xm-alloc. */
1579bae1 496 b = malloc (sizeof (struct yy_buffer_state));
252b5132
RH
497 b->yy_input_file = 0;
498 b->yy_buf_size = size;
499
500 /* yy_ch_buf has to be 2 characters longer than the size given because
501 we need to put in 2 end-of-buffer characters. */
1579bae1 502 b->yy_ch_buf = malloc ((unsigned) (b->yy_buf_size + 3));
252b5132
RH
503
504 b->yy_ch_buf[0] = '\n';
505 strcpy (b->yy_ch_buf+1, string);
506 b->yy_ch_buf[size+1] = YY_END_OF_BUFFER_CHAR;
507 b->yy_ch_buf[size+2] = YY_END_OF_BUFFER_CHAR;
508 b->yy_n_chars = size+1;
509 b->yy_buf_pos = &b->yy_ch_buf[1];
510
dca7760f
AM
511 b->yy_is_our_buffer = 1;
512 b->yy_is_interactive = 0;
513 b->yy_at_bol = 1;
514 b->yy_fill_buffer = 0;
515
252b5132
RH
516 /* flex 2.4.7 changed the interface. FIXME: We should not be using
517 a flex internal interface in the first place! */
518#ifdef YY_BUFFER_NEW
519 b->yy_buffer_status = YY_BUFFER_NEW;
520#else
521 b->yy_eof_status = EOF_NOT_SEEN;
522#endif
523
524 return b;
525}
526
527/* Switch flex to reading from STRING, saving the current input info
528 on the include stack. */
529
530void
dab69f68 531lex_redirect (const char *string, const char *fake_filename, unsigned int count)
252b5132
RH
532{
533 YY_BUFFER_STATE tmp;
534
535 yy_init = 0;
1579bae1 536 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
252b5132
RH
537 {
538 einfo("%F: macros nested too deeply\n");
539 }
dab69f68 540 file_name_stack[include_stack_ptr] = fake_filename;
b47c4208 541 lineno_stack[include_stack_ptr] = lineno;
252b5132
RH
542 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
543 include_stack_ptr++;
dab69f68 544 lineno = count;
252b5132
RH
545 tmp = yy_create_string_buffer (string, strlen (string));
546 yy_switch_to_buffer (tmp);
252b5132
RH
547}
548\f
549/* Functions to switch to a different flex start condition,
550 saving the current start condition on `state_stack'. */
551
552static int state_stack[MAX_INCLUDE_DEPTH * 2];
553static int *state_stack_p = state_stack;
554
555void
1579bae1 556ldlex_script (void)
252b5132
RH
557{
558 *(state_stack_p)++ = yy_start;
559 BEGIN (SCRIPT);
560}
561
562void
1579bae1 563ldlex_mri_script (void)
252b5132
RH
564{
565 *(state_stack_p)++ = yy_start;
566 BEGIN (MRI);
567}
568
569void
1579bae1 570ldlex_version_script (void)
252b5132
RH
571{
572 *(state_stack_p)++ = yy_start;
573 BEGIN (VERS_START);
574}
575
576void
1579bae1 577ldlex_version_file (void)
252b5132
RH
578{
579 *(state_stack_p)++ = yy_start;
580 BEGIN (VERS_SCRIPT);
581}
582
583void
1579bae1 584ldlex_defsym (void)
252b5132
RH
585{
586 *(state_stack_p)++ = yy_start;
587 BEGIN (DEFSYMEXP);
588}
1579bae1 589
252b5132 590void
1579bae1 591ldlex_expression (void)
252b5132
RH
592{
593 *(state_stack_p)++ = yy_start;
594 BEGIN (EXPRESSION);
595}
596
597void
1579bae1 598ldlex_both (void)
252b5132
RH
599{
600 *(state_stack_p)++ = yy_start;
601 BEGIN (BOTH);
602}
603
604void
1579bae1 605ldlex_popstate (void)
252b5132
RH
606{
607 yy_start = *(--state_stack_p);
608}
dab69f68
AM
609
610/* Return the current file name, or the previous file if no file is
611 current. */
612
613const char*
614ldlex_filename (void)
615{
616 return file_name_stack[include_stack_ptr - (include_stack_ptr != 0)];
617}
252b5132
RH
618\f
619
d05c651b 620/* Place up to MAX_SIZE characters in BUF and return
252b5132
RH
621 either the number of characters read, or 0 to indicate EOF. */
622
d05c651b
AS
623static int
624yy_input (char *buf, int max_size)
252b5132 625{
d05c651b 626 int result = 0;
731e28d8 627 if (YY_CURRENT_BUFFER->yy_input_file)
252b5132
RH
628 {
629 if (yyin)
630 {
d05c651b
AS
631 result = fread (buf, 1, max_size, yyin);
632 if (result < max_size && ferror (yyin))
252b5132
RH
633 einfo ("%F%P: read in flex scanner failed\n");
634 }
635 }
d05c651b 636 return result;
252b5132
RH
637}
638
639/* Eat the rest of a C-style comment. */
640
641static void
1579bae1 642comment (void)
252b5132
RH
643{
644 int c;
645
646 while (1)
647 {
648 c = input();
1579bae1 649 while (c != '*' && c != EOF)
252b5132
RH
650 {
651 if (c == '\n')
652 lineno++;
653 c = input();
654 }
655
656 if (c == '*')
657 {
658 c = input();
659 while (c == '*')
660 c = input();
661 if (c == '/')
662 break; /* found the end */
663 }
664
665 if (c == '\n')
666 lineno++;
667
668 if (c == EOF)
669 {
670 einfo( "%F%P: EOF in comment\n");
671 break;
672 }
673 }
674}
675
676/* Warn the user about a garbage character WHAT in the input
677 in context WHERE. */
678
679static void
1579bae1 680lex_warn_invalid (char *where, char *what)
252b5132
RH
681{
682 char buf[5];
683
684 /* If we have found an input file whose format we do not recognize,
685 and we are therefore treating it as a linker script, and we find
686 an invalid character, then most likely this is a real object file
687 of some different format. Treat it as such. */
688 if (ldfile_assumed_script)
689 {
690 bfd_set_error (bfd_error_file_not_recognized);
dab69f68 691 einfo ("%F%s: file not recognized: %E\n", ldlex_filename ());
252b5132
RH
692 }
693
3882b010 694 if (! ISPRINT (*what))
252b5132 695 {
c3a7b120 696 sprintf (buf, "\\%03o", *(unsigned char *) what);
252b5132
RH
697 what = buf;
698 }
699
dab69f68 700 einfo ("%P:%S: ignoring invalid character `%s'%s\n", NULL, what, where);
252b5132 701}
This page took 0.629147 seconds and 4 git commands to generate.