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