*** empty log message ***
[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
252b5132 27#include "sysdep.h"
3db64b00 28#include "bfd.h"
3882b010 29#include "safe-ctype.h"
e3e942e9 30#include "bfdlink.h"
252b5132 31#include "ld.h"
252b5132
RH
32#include "ldmisc.h"
33#include "ldexp.h"
34#include "ldlang.h"
df2a7313 35#include <ldgram.h>
252b5132
RH
36#include "ldfile.h"
37#include "ldlex.h"
38#include "ldmain.h"
d1b2b2dc 39#include "libiberty.h"
252b5132
RH
40
41/* The type of top-level parser input.
42 yylex and yyparse (indirectly) both check this. */
43input_type parser_input;
44
45/* Line number in the current input file.
46 (FIXME Actually, it doesn't appear to get reset for each file?) */
47unsigned int lineno = 1;
48
49/* The string we are currently lexing, or NULL if we are reading a
50 file. */
51const char *lex_string = NULL;
52
53/* Support for flex reading from more than one input file (stream).
54 `include_stack' is flex's input state for each open file;
55 `file_name_stack' is the file names. `lineno_stack' is the current
56 line numbers.
57
58 If `include_stack_ptr' is 0, we haven't started reading anything yet.
59 Otherwise, stack elements 0 through `include_stack_ptr - 1' are valid. */
60
61#undef YY_INPUT
d05c651b 62#define YY_INPUT(buf,result,max_size) result = yy_input (buf, max_size)
252b5132 63
297ba367
NC
64#define YY_NO_UNPUT
65
252b5132
RH
66#define MAX_INCLUDE_DEPTH 10
67static YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
68static const char *file_name_stack[MAX_INCLUDE_DEPTH];
69static unsigned int lineno_stack[MAX_INCLUDE_DEPTH];
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
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\/\.\-\_\+\=\$\:\[\]\\\,\~]
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
112%s EXPRESSION
113%s BOTH
114%s DEFSYMEXP
115%s MRI
116%s VERS_START
117%s VERS_SCRIPT
118%s VERS_NODE
119%%
120
121 if (parser_input != input_selected)
122 {
123 /* The first token of the input determines the initial parser state. */
124 input_type t = parser_input;
125 parser_input = input_selected;
126 switch (t)
127 {
128 case input_script: return INPUT_SCRIPT; break;
129 case input_mri_script: return INPUT_MRI_SCRIPT; break;
130 case input_version_script: return INPUT_VERSION_SCRIPT; break;
55255dae 131 case input_dynamic_list: return INPUT_DYNAMIC_LIST; break;
252b5132
RH
132 case input_defsym: return INPUT_DEFSYM; break;
133 default: abort ();
134 }
135 }
136
1579bae1 137<BOTH,SCRIPT,EXPRESSION,VERS_START,VERS_NODE,VERS_SCRIPT>"/*" { comment (); }
252b5132
RH
138
139
140<DEFSYMEXP>"-" { RTOKEN('-');}
141<DEFSYMEXP>"+" { RTOKEN('+');}
1579bae1 142<DEFSYMEXP>{FILENAMECHAR1}{SYMBOLCHARN}* { yylval.name = xstrdup (yytext); return NAME; }
252b5132
RH
143<DEFSYMEXP>"=" { RTOKEN('='); }
144
145<MRI,EXPRESSION>"$"([0-9A-Fa-f])+ {
1579bae1
AM
146 yylval.integer = bfd_scan_vma (yytext + 1, 0, 16);
147 yylval.bigint.str = NULL;
252b5132
RH
148 return INT;
149 }
150
151<MRI,EXPRESSION>([0-9A-Fa-f])+(H|h|X|x|B|b|O|o|D|d) {
152 int ibase ;
1579bae1
AM
153 switch (yytext[yyleng - 1]) {
154 case 'X':
252b5132
RH
155 case 'x':
156 case 'H':
157 case 'h':
158 ibase = 16;
159 break;
160 case 'O':
161 case 'o':
162 ibase = 8;
163 break;
164 case 'B':
165 case 'b':
166 ibase = 2;
167 break;
168 default:
169 ibase = 10;
170 }
171 yylval.integer = bfd_scan_vma (yytext, 0,
172 ibase);
1579bae1 173 yylval.bigint.str = NULL;
252b5132
RH
174 return INT;
175 }
2c382fb6 176<SCRIPT,DEFSYMEXP,MRI,BOTH,EXPRESSION>((("$"|0[xX])([0-9A-Fa-f])+)|(([0-9])+))(M|K|m|k)? {
252b5132 177 char *s = yytext;
2c382fb6 178 int ibase = 0;
252b5132
RH
179
180 if (*s == '$')
2c382fb6
AM
181 {
182 ++s;
183 ibase = 16;
184 }
185 yylval.integer = bfd_scan_vma (s, 0, ibase);
1579bae1
AM
186 yylval.bigint.str = NULL;
187 if (yytext[yyleng - 1] == 'M'
188 || yytext[yyleng - 1] == 'm')
2c382fb6
AM
189 {
190 yylval.integer *= 1024 * 1024;
191 }
1579bae1
AM
192 else if (yytext[yyleng - 1] == 'K'
193 || yytext[yyleng - 1]=='k')
2c382fb6
AM
194 {
195 yylval.integer *= 1024;
196 }
197 else if (yytext[0] == '0'
198 && (yytext[1] == 'x'
199 || yytext[1] == 'X'))
200 {
201 yylval.bigint.str = xstrdup (yytext + 2);
202 }
252b5132
RH
203 return INT;
204 }
205<BOTH,SCRIPT,EXPRESSION,MRI>"]" { RTOKEN(']');}
206<BOTH,SCRIPT,EXPRESSION,MRI>"[" { RTOKEN('[');}
207<BOTH,SCRIPT,EXPRESSION,MRI>"<<=" { RTOKEN(LSHIFTEQ);}
208<BOTH,SCRIPT,EXPRESSION,MRI>">>=" { RTOKEN(RSHIFTEQ);}
209<BOTH,SCRIPT,EXPRESSION,MRI>"||" { RTOKEN(OROR);}
210<BOTH,SCRIPT,EXPRESSION,MRI>"==" { RTOKEN(EQ);}
211<BOTH,SCRIPT,EXPRESSION,MRI>"!=" { RTOKEN(NE);}
212<BOTH,SCRIPT,EXPRESSION,MRI>">=" { RTOKEN(GE);}
213<BOTH,SCRIPT,EXPRESSION,MRI>"<=" { RTOKEN(LE);}
214<BOTH,SCRIPT,EXPRESSION,MRI>"<<" { RTOKEN(LSHIFT);}
215<BOTH,SCRIPT,EXPRESSION,MRI>">>" { RTOKEN(RSHIFT);}
216<BOTH,SCRIPT,EXPRESSION,MRI>"+=" { RTOKEN(PLUSEQ);}
217<BOTH,SCRIPT,EXPRESSION,MRI>"-=" { RTOKEN(MINUSEQ);}
218<BOTH,SCRIPT,EXPRESSION,MRI>"*=" { RTOKEN(MULTEQ);}
219<BOTH,SCRIPT,EXPRESSION,MRI>"/=" { RTOKEN(DIVEQ);}
220<BOTH,SCRIPT,EXPRESSION,MRI>"&=" { RTOKEN(ANDEQ);}
221<BOTH,SCRIPT,EXPRESSION,MRI>"|=" { RTOKEN(OREQ);}
222<BOTH,SCRIPT,EXPRESSION,MRI>"&&" { RTOKEN(ANDAND);}
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('%');}
235<BOTH,SCRIPT,EXPRESSION,MRI>"<" { RTOKEN('<');}
3ec57632
NC
236<BOTH,SCRIPT,EXPRESSION,MRI>"=" { RTOKEN('=');}
237<BOTH,SCRIPT,EXPRESSION,MRI>"}" { RTOKEN('}') ; }
238<BOTH,SCRIPT,EXPRESSION,MRI>"{" { RTOKEN('{'); }
239<BOTH,SCRIPT,EXPRESSION,MRI>")" { RTOKEN(')');}
240<BOTH,SCRIPT,EXPRESSION,MRI>"(" { RTOKEN('(');}
252b5132
RH
241<BOTH,SCRIPT,EXPRESSION,MRI>":" { RTOKEN(':'); }
242<BOTH,SCRIPT,EXPRESSION,MRI>";" { RTOKEN(';');}
3ec57632 243<BOTH,SCRIPT>"MEMORY" { RTOKEN(MEMORY);}
4a93e180 244<BOTH,SCRIPT>"REGION_ALIAS" { RTOKEN(REGION_ALIAS);}
3ec57632
NC
245<BOTH,SCRIPT,EXPRESSION>"ORIGIN" { RTOKEN(ORIGIN);}
246<BOTH,SCRIPT>"VERSION" { RTOKEN(VERSIONK);}
252b5132
RH
247<EXPRESSION,BOTH,SCRIPT>"BLOCK" { RTOKEN(BLOCK);}
248<EXPRESSION,BOTH,SCRIPT>"BIND" { RTOKEN(BIND);}
3ec57632
NC
249<BOTH,SCRIPT,EXPRESSION>"LENGTH" { RTOKEN(LENGTH);}
250<EXPRESSION,BOTH,SCRIPT>"ALIGN" { RTOKEN(ALIGN_K);}
2d20f7bf 251<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_ALIGN" { RTOKEN(DATA_SEGMENT_ALIGN);}
8c37241b 252<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_RELRO_END" { RTOKEN(DATA_SEGMENT_RELRO_END);}
2d20f7bf 253<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_END" { RTOKEN(DATA_SEGMENT_END);}
3ec57632
NC
254<EXPRESSION,BOTH,SCRIPT>"ADDR" { RTOKEN(ADDR);}
255<EXPRESSION,BOTH,SCRIPT>"LOADADDR" { RTOKEN(LOADADDR);}
362c1d1a 256<EXPRESSION,BOTH,SCRIPT>"ALIGNOF" { RTOKEN(ALIGNOF); }
252b5132
RH
257<EXPRESSION,BOTH>"MAX" { RTOKEN(MAX_K); }
258<EXPRESSION,BOTH>"MIN" { RTOKEN(MIN_K); }
8545d1a9 259<EXPRESSION,BOTH,SCRIPT>"ASSERT" { RTOKEN(ASSERT_K); }
252b5132
RH
260<BOTH,SCRIPT>"ENTRY" { RTOKEN(ENTRY);}
261<BOTH,SCRIPT,MRI>"EXTERN" { RTOKEN(EXTERN);}
3ec57632 262<EXPRESSION,BOTH,SCRIPT>"NEXT" { RTOKEN(NEXT);}
252b5132
RH
263<EXPRESSION,BOTH,SCRIPT>"sizeof_headers" { RTOKEN(SIZEOF_HEADERS);}
264<EXPRESSION,BOTH,SCRIPT>"SIZEOF_HEADERS" { RTOKEN(SIZEOF_HEADERS);}
ba916c8a 265<EXPRESSION,BOTH,SCRIPT>"SEGMENT_START" { RTOKEN(SEGMENT_START);}
252b5132 266<BOTH,SCRIPT>"MAP" { RTOKEN(MAP);}
3ec57632
NC
267<EXPRESSION,BOTH,SCRIPT>"SIZEOF" { RTOKEN(SIZEOF);}
268<BOTH,SCRIPT>"TARGET" { RTOKEN(TARGET_K);}
252b5132 269<BOTH,SCRIPT>"SEARCH_DIR" { RTOKEN(SEARCH_DIR);}
3ec57632 270<BOTH,SCRIPT>"OUTPUT" { RTOKEN(OUTPUT);}
252b5132
RH
271<BOTH,SCRIPT>"INPUT" { RTOKEN(INPUT);}
272<EXPRESSION,BOTH,SCRIPT>"GROUP" { RTOKEN(GROUP);}
b717d30e 273<EXPRESSION,BOTH,SCRIPT>"AS_NEEDED" { RTOKEN(AS_NEEDED);}
3ec57632 274<EXPRESSION,BOTH,SCRIPT>"DEFINED" { RTOKEN(DEFINED);}
252b5132
RH
275<BOTH,SCRIPT>"CREATE_OBJECT_SYMBOLS" { RTOKEN(CREATE_OBJECT_SYMBOLS);}
276<BOTH,SCRIPT>"CONSTRUCTORS" { RTOKEN( CONSTRUCTORS);}
3ec57632 277<BOTH,SCRIPT>"FORCE_COMMON_ALLOCATION" { RTOKEN(FORCE_COMMON_ALLOCATION);}
4818e05f 278<BOTH,SCRIPT>"INHIBIT_COMMON_ALLOCATION" { RTOKEN(INHIBIT_COMMON_ALLOCATION);}
3ec57632 279<BOTH,SCRIPT>"SECTIONS" { RTOKEN(SECTIONS);}
53d25da6
AM
280<BOTH,SCRIPT>"INSERT" { RTOKEN(INSERT_K);}
281<BOTH,SCRIPT>"AFTER" { RTOKEN(AFTER);}
282<BOTH,SCRIPT>"BEFORE" { RTOKEN(BEFORE);}
252b5132 283<BOTH,SCRIPT>"FILL" { RTOKEN(FILL);}
3ec57632 284<BOTH,SCRIPT>"STARTUP" { RTOKEN(STARTUP);}
252b5132
RH
285<BOTH,SCRIPT>"OUTPUT_FORMAT" { RTOKEN(OUTPUT_FORMAT);}
286<BOTH,SCRIPT>"OUTPUT_ARCH" { RTOKEN( OUTPUT_ARCH);}
287<BOTH,SCRIPT>"HLL" { RTOKEN(HLL);}
3ec57632 288<BOTH,SCRIPT>"SYSLIB" { RTOKEN(SYSLIB);}
252b5132
RH
289<BOTH,SCRIPT>"FLOAT" { RTOKEN(FLOAT);}
290<BOTH,SCRIPT>"QUAD" { RTOKEN( QUAD);}
291<BOTH,SCRIPT>"SQUAD" { RTOKEN( SQUAD);}
292<BOTH,SCRIPT>"LONG" { RTOKEN( LONG);}
293<BOTH,SCRIPT>"SHORT" { RTOKEN( SHORT);}
294<BOTH,SCRIPT>"BYTE" { RTOKEN( BYTE);}
3ec57632 295<BOTH,SCRIPT>"NOFLOAT" { RTOKEN(NOFLOAT);}
252b5132
RH
296<EXPRESSION,BOTH,SCRIPT>"NOCROSSREFS" { RTOKEN(NOCROSSREFS);}
297<BOTH,SCRIPT>"OVERLAY" { RTOKEN(OVERLAY); }
bcaa7b3e
L
298<BOTH,SCRIPT>"SORT_BY_NAME" { RTOKEN(SORT_BY_NAME); }
299<BOTH,SCRIPT>"SORT_BY_ALIGNMENT" { RTOKEN(SORT_BY_ALIGNMENT); }
300<BOTH,SCRIPT>"SORT" { RTOKEN(SORT_BY_NAME); }
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.446601 seconds and 4 git commands to generate.