2005-02-06 Andrew Cagney <cagney@gnu.org>
[deliverable/binutils-gdb.git] / ld / ldlex.l
CommitLineData
252b5132
RH
1%{
2
968ec2b9 3/* Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
b717d30e 4 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
252b5132 5
3ec57632 6 This file is part of GLD, the Gnu Linker.
252b5132 7
3ec57632
NC
8 GLD is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
252b5132 12
3ec57632
NC
13 GLD is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
252b5132 17
3ec57632
NC
18 You should have received a copy of the GNU General Public License
19 along with GLD; see the file COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA. */
252b5132
RH
22
23/*
24This was written by steve chamberlain
25 sac@cygnus.com
26*/
27
28
252b5132 29#include <stdio.h>
252b5132 30
252b5132
RH
31#include "bfd.h"
32#include "sysdep.h"
3882b010 33#include "safe-ctype.h"
e3e942e9 34#include "bfdlink.h"
252b5132 35#include "ld.h"
252b5132
RH
36#include "ldmisc.h"
37#include "ldexp.h"
38#include "ldlang.h"
df2a7313 39#include <ldgram.h>
252b5132
RH
40#include "ldfile.h"
41#include "ldlex.h"
42#include "ldmain.h"
d1b2b2dc 43#include "libiberty.h"
252b5132
RH
44
45/* The type of top-level parser input.
46 yylex and yyparse (indirectly) both check this. */
47input_type parser_input;
48
49/* Line number in the current input file.
50 (FIXME Actually, it doesn't appear to get reset for each file?) */
51unsigned int lineno = 1;
52
53/* The string we are currently lexing, or NULL if we are reading a
54 file. */
55const char *lex_string = NULL;
56
57/* Support for flex reading from more than one input file (stream).
58 `include_stack' is flex's input state for each open file;
59 `file_name_stack' is the file names. `lineno_stack' is the current
60 line numbers.
61
62 If `include_stack_ptr' is 0, we haven't started reading anything yet.
63 Otherwise, stack elements 0 through `include_stack_ptr - 1' are valid. */
64
65#undef YY_INPUT
1579bae1 66#define YY_INPUT(buf,result,max_size) yy_input (buf, &result, max_size)
252b5132
RH
67
68#define MAX_INCLUDE_DEPTH 10
69static YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
70static const char *file_name_stack[MAX_INCLUDE_DEPTH];
71static unsigned int lineno_stack[MAX_INCLUDE_DEPTH];
72static unsigned int include_stack_ptr = 0;
73static int vers_node_nesting = 0;
74
1579bae1
AM
75static void yy_input (char *, int *, int);
76static void comment (void);
77static void lex_warn_invalid (char *where, char *what);
252b5132 78
1579bae1 79/* STATES
252b5132
RH
80 EXPRESSION definitely in an expression
81 SCRIPT definitely in a script
82 BOTH either EXPRESSION or SCRIPT
83 DEFSYMEXP in an argument to -defsym
84 MRI in an MRI script
85 VERS_START starting a Sun style mapfile
86 VERS_SCRIPT a Sun style mapfile
87 VERS_NODE a node within a Sun style mapfile
88*/
89#define RTOKEN(x) { yylval.token = x; return x; }
90
91/* Some versions of flex want this. */
92#ifndef yywrap
1579bae1 93int yywrap (void) { return 1; }
252b5132
RH
94#endif
95%}
96
97%a 4000
98%o 5000
99
100CMDFILENAMECHAR [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\-\~]
101CMDFILENAMECHAR1 [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\~]
102FILENAMECHAR1 [_a-zA-Z\/\.\\\$\_\~]
103SYMBOLCHARN [_a-zA-Z\/\.\\\$\_\~0-9]
104FILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\\,\~]
105WILDCHAR [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\\,\~\?\*]
1579bae1 106WHITE [ \t\n\r]+
252b5132
RH
107
108NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
109
110V_TAG [.$_a-zA-Z][._a-zA-Z0-9]*
5e35cbc2 111V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
252b5132
RH
112
113%s SCRIPT
114%s EXPRESSION
115%s BOTH
116%s DEFSYMEXP
117%s MRI
118%s VERS_START
119%s VERS_SCRIPT
120%s VERS_NODE
121%%
122
123 if (parser_input != input_selected)
124 {
125 /* The first token of the input determines the initial parser state. */
126 input_type t = parser_input;
127 parser_input = input_selected;
128 switch (t)
129 {
130 case input_script: return INPUT_SCRIPT; break;
131 case input_mri_script: return INPUT_MRI_SCRIPT; break;
132 case input_version_script: return INPUT_VERSION_SCRIPT; break;
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
NC
244<BOTH,SCRIPT>"MEMORY" { RTOKEN(MEMORY);}
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);}
252b5132
RH
256<EXPRESSION,BOTH>"MAX" { RTOKEN(MAX_K); }
257<EXPRESSION,BOTH>"MIN" { RTOKEN(MIN_K); }
258<EXPRESSION,BOTH>"ASSERT" { RTOKEN(ASSERT_K); }
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);}
252b5132 279<BOTH,SCRIPT>"FILL" { RTOKEN(FILL);}
3ec57632 280<BOTH,SCRIPT>"STARTUP" { RTOKEN(STARTUP);}
252b5132
RH
281<BOTH,SCRIPT>"OUTPUT_FORMAT" { RTOKEN(OUTPUT_FORMAT);}
282<BOTH,SCRIPT>"OUTPUT_ARCH" { RTOKEN( OUTPUT_ARCH);}
283<BOTH,SCRIPT>"HLL" { RTOKEN(HLL);}
3ec57632 284<BOTH,SCRIPT>"SYSLIB" { RTOKEN(SYSLIB);}
252b5132
RH
285<BOTH,SCRIPT>"FLOAT" { RTOKEN(FLOAT);}
286<BOTH,SCRIPT>"QUAD" { RTOKEN( QUAD);}
287<BOTH,SCRIPT>"SQUAD" { RTOKEN( SQUAD);}
288<BOTH,SCRIPT>"LONG" { RTOKEN( LONG);}
289<BOTH,SCRIPT>"SHORT" { RTOKEN( SHORT);}
290<BOTH,SCRIPT>"BYTE" { RTOKEN( BYTE);}
3ec57632 291<BOTH,SCRIPT>"NOFLOAT" { RTOKEN(NOFLOAT);}
252b5132
RH
292<EXPRESSION,BOTH,SCRIPT>"NOCROSSREFS" { RTOKEN(NOCROSSREFS);}
293<BOTH,SCRIPT>"OVERLAY" { RTOKEN(OVERLAY); }
bcaa7b3e
L
294<BOTH,SCRIPT>"SORT_BY_NAME" { RTOKEN(SORT_BY_NAME); }
295<BOTH,SCRIPT>"SORT_BY_ALIGNMENT" { RTOKEN(SORT_BY_ALIGNMENT); }
296<BOTH,SCRIPT>"SORT" { RTOKEN(SORT_BY_NAME); }
252b5132
RH
297<EXPRESSION,BOTH,SCRIPT>"NOLOAD" { RTOKEN(NOLOAD);}
298<EXPRESSION,BOTH,SCRIPT>"DSECT" { RTOKEN(DSECT);}
299<EXPRESSION,BOTH,SCRIPT>"COPY" { RTOKEN(COPY);}
300<EXPRESSION,BOTH,SCRIPT>"INFO" { RTOKEN(INFO);}
301<EXPRESSION,BOTH,SCRIPT>"OVERLAY" { RTOKEN(OVERLAY);}
0841712e
JJ
302<EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RO" { RTOKEN(ONLY_IF_RO); }
303<EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RW" { RTOKEN(ONLY_IF_RW); }
252b5132
RH
304<BOTH,SCRIPT>"o" { RTOKEN(ORIGIN);}
305<BOTH,SCRIPT>"org" { RTOKEN(ORIGIN);}
306<BOTH,SCRIPT>"l" { RTOKEN( LENGTH);}
307<BOTH,SCRIPT>"len" { RTOKEN( LENGTH);}
308<BOTH,SCRIPT>"INCLUDE" { RTOKEN(INCLUDE);}
309<BOTH,SCRIPT>"PHDRS" { RTOKEN (PHDRS); }
3ec57632
NC
310<EXPRESSION,BOTH,SCRIPT>"AT" { RTOKEN(AT);}
311<EXPRESSION,BOTH,SCRIPT>"SUBALIGN" { RTOKEN(SUBALIGN);}
312<EXPRESSION,BOTH,SCRIPT>"PROVIDE" { RTOKEN(PROVIDE); }
252b5132 313<EXPRESSION,BOTH,SCRIPT>"KEEP" { RTOKEN(KEEP); }
3ec57632 314<EXPRESSION,BOTH,SCRIPT>"EXCLUDE_FILE" { RTOKEN(EXCLUDE_FILE); }
252b5132
RH
315<MRI>"#".*\n? { ++ lineno; }
316<MRI>"\n" { ++ lineno; RTOKEN(NEWLINE); }
317<MRI>"*".* { /* Mri comment line */ }
318<MRI>";".* { /* Mri comment line */ }
319<MRI>"END" { RTOKEN(ENDWORD); }
3ec57632
NC
320<MRI>"ALIGNMOD" { RTOKEN(ALIGNMOD);}
321<MRI>"ALIGN" { RTOKEN(ALIGN_K);}
252b5132
RH
322<MRI>"CHIP" { RTOKEN(CHIP); }
323<MRI>"BASE" { RTOKEN(BASE); }
3ec57632
NC
324<MRI>"ALIAS" { RTOKEN(ALIAS); }
325<MRI>"TRUNCATE" { RTOKEN(TRUNCATE); }
252b5132
RH
326<MRI>"LOAD" { RTOKEN(LOAD); }
327<MRI>"PUBLIC" { RTOKEN(PUBLIC); }
328<MRI>"ORDER" { RTOKEN(ORDER); }
329<MRI>"NAME" { RTOKEN(NAMEWORD); }
330<MRI>"FORMAT" { RTOKEN(FORMAT); }
331<MRI>"CASE" { RTOKEN(CASE); }
332<MRI>"START" { RTOKEN(START); }
333<MRI>"LIST".* { RTOKEN(LIST); /* LIST and ignore to end of line */ }
334<MRI>"SECT" { RTOKEN(SECT); }
335<EXPRESSION,BOTH,SCRIPT,MRI>"ABSOLUTE" { RTOKEN(ABSOLUTE); }
336<MRI>"end" { RTOKEN(ENDWORD); }
3ec57632
NC
337<MRI>"alignmod" { RTOKEN(ALIGNMOD);}
338<MRI>"align" { RTOKEN(ALIGN_K);}
252b5132
RH
339<MRI>"chip" { RTOKEN(CHIP); }
340<MRI>"base" { RTOKEN(BASE); }
3ec57632
NC
341<MRI>"alias" { RTOKEN(ALIAS); }
342<MRI>"truncate" { RTOKEN(TRUNCATE); }
252b5132
RH
343<MRI>"load" { RTOKEN(LOAD); }
344<MRI>"public" { RTOKEN(PUBLIC); }
345<MRI>"order" { RTOKEN(ORDER); }
346<MRI>"name" { RTOKEN(NAMEWORD); }
347<MRI>"format" { RTOKEN(FORMAT); }
348<MRI>"case" { RTOKEN(CASE); }
349<MRI>"extern" { RTOKEN(EXTERN); }
350<MRI>"start" { RTOKEN(START); }
351<MRI>"list".* { RTOKEN(LIST); /* LIST and ignore to end of line */ }
352<MRI>"sect" { RTOKEN(SECT); }
353<EXPRESSION,BOTH,SCRIPT,MRI>"absolute" { RTOKEN(ABSOLUTE); }
354
355<MRI>{FILENAMECHAR1}{NOCFILENAMECHAR}* {
356/* Filename without commas, needed to parse mri stuff */
1579bae1 357 yylval.name = xstrdup (yytext);
252b5132
RH
358 return NAME;
359 }
360
361
362<BOTH,EXPRESSION>{FILENAMECHAR1}{FILENAMECHAR}* {
1579bae1 363 yylval.name = xstrdup (yytext);
252b5132
RH
364 return NAME;
365 }
366<BOTH,EXPRESSION>"-l"{FILENAMECHAR}+ {
d1b2b2dc 367 yylval.name = xstrdup (yytext + 2);
252b5132
RH
368 return LNAME;
369 }
370<SCRIPT>{WILDCHAR}* {
371 /* Annoyingly, this pattern can match comments, and we have
372 longest match issues to consider. So if the first two
373 characters are a comment opening, put the input back and
374 try again. */
375 if (yytext[0] == '/' && yytext[1] == '*')
376 {
1579bae1 377 yyless (2);
252b5132
RH
378 comment ();
379 }
380 else
381 {
1579bae1 382 yylval.name = xstrdup (yytext);
252b5132
RH
383 return NAME;
384 }
385 }
386
387<EXPRESSION,BOTH,SCRIPT,VERS_NODE>"\""[^\"]*"\"" {
388 /* No matter the state, quotes
389 give what's inside */
1579bae1
AM
390 yylval.name = xstrdup (yytext + 1);
391 yylval.name[yyleng - 2] = 0;
252b5132
RH
392 return NAME;
393 }
394<BOTH,SCRIPT,EXPRESSION>"\n" { lineno++;}
395<MRI,BOTH,SCRIPT,EXPRESSION>[ \t\r]+ { }
396
397<VERS_NODE,VERS_SCRIPT>[:,;] { return *yytext; }
398
399<VERS_NODE>global { RTOKEN(GLOBAL); }
400
401<VERS_NODE>local { RTOKEN(LOCAL); }
402
403<VERS_NODE>extern { RTOKEN(EXTERN); }
404
d1b2b2dc 405<VERS_NODE>{V_IDENTIFIER} { yylval.name = xstrdup (yytext);
252b5132
RH
406 return VERS_IDENTIFIER; }
407
d1b2b2dc 408<VERS_SCRIPT>{V_TAG} { yylval.name = xstrdup (yytext);
252b5132
RH
409 return VERS_TAG; }
410
411<VERS_START>"{" { BEGIN(VERS_SCRIPT); return *yytext; }
412
1579bae1 413<VERS_SCRIPT>"{" { BEGIN(VERS_NODE);
252b5132
RH
414 vers_node_nesting = 0;
415 return *yytext;
416 }
417<VERS_SCRIPT>"}" { return *yytext; }
418<VERS_NODE>"{" { vers_node_nesting++; return *yytext; }
419<VERS_NODE>"}" { if (--vers_node_nesting < 0)
420 BEGIN(VERS_SCRIPT);
421 return *yytext;
422 }
423
424<VERS_START,VERS_NODE,VERS_SCRIPT>[\n] { lineno++; }
425
426<VERS_START,VERS_NODE,VERS_SCRIPT>#.* { /* Eat up comments */ }
427
428<VERS_START,VERS_NODE,VERS_SCRIPT>[ \t\r]+ { /* Eat up whitespace */ }
429
430<<EOF>> {
431 include_stack_ptr--;
1579bae1
AM
432
433 if (include_stack_ptr == 0)
252b5132 434 {
1579bae1 435 yyterminate ();
252b5132 436 }
1579bae1 437 else
252b5132 438 {
1579bae1 439 yy_switch_to_buffer (include_stack[include_stack_ptr]);
252b5132 440 }
b47c4208 441
252b5132 442 ldfile_input_filename = file_name_stack[include_stack_ptr - 1];
b47c4208 443 lineno = lineno_stack[include_stack_ptr];
252b5132
RH
444
445 return END;
446}
447
1579bae1
AM
448<SCRIPT,MRI,VERS_START,VERS_SCRIPT,VERS_NODE>. lex_warn_invalid (" in script", yytext);
449<EXPRESSION,DEFSYMEXP,BOTH>. lex_warn_invalid (" in expression", yytext);
450
252b5132
RH
451%%
452\f
453
454/* Switch flex to reading script file NAME, open on FILE,
455 saving the current input info on the include stack. */
456
457void
1579bae1 458lex_push_file (FILE *file, const char *name)
252b5132 459{
1579bae1 460 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
252b5132 461 {
1579bae1 462 einfo ("%F:includes nested too deeply\n");
252b5132
RH
463 }
464 file_name_stack[include_stack_ptr] = name;
b47c4208 465 lineno_stack[include_stack_ptr] = lineno;
252b5132
RH
466 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
467
468 include_stack_ptr++;
b47c4208 469 lineno = 1;
252b5132 470 yyin = file;
1579bae1 471 yy_switch_to_buffer (yy_create_buffer (yyin, YY_BUF_SIZE));
252b5132
RH
472}
473
474/* Return a newly created flex input buffer containing STRING,
475 which is SIZE bytes long. */
476
1579bae1
AM
477static YY_BUFFER_STATE
478yy_create_string_buffer (const char *string, size_t size)
252b5132
RH
479{
480 YY_BUFFER_STATE b;
481
482 /* Calls to m-alloc get turned by sed into xm-alloc. */
1579bae1 483 b = malloc (sizeof (struct yy_buffer_state));
252b5132
RH
484 b->yy_input_file = 0;
485 b->yy_buf_size = size;
486
487 /* yy_ch_buf has to be 2 characters longer than the size given because
488 we need to put in 2 end-of-buffer characters. */
1579bae1 489 b->yy_ch_buf = malloc ((unsigned) (b->yy_buf_size + 3));
252b5132
RH
490
491 b->yy_ch_buf[0] = '\n';
492 strcpy (b->yy_ch_buf+1, string);
493 b->yy_ch_buf[size+1] = YY_END_OF_BUFFER_CHAR;
494 b->yy_ch_buf[size+2] = YY_END_OF_BUFFER_CHAR;
495 b->yy_n_chars = size+1;
496 b->yy_buf_pos = &b->yy_ch_buf[1];
497
dca7760f
AM
498 b->yy_is_our_buffer = 1;
499 b->yy_is_interactive = 0;
500 b->yy_at_bol = 1;
501 b->yy_fill_buffer = 0;
502
252b5132
RH
503 /* flex 2.4.7 changed the interface. FIXME: We should not be using
504 a flex internal interface in the first place! */
505#ifdef YY_BUFFER_NEW
506 b->yy_buffer_status = YY_BUFFER_NEW;
507#else
508 b->yy_eof_status = EOF_NOT_SEEN;
509#endif
510
511 return b;
512}
513
514/* Switch flex to reading from STRING, saving the current input info
515 on the include stack. */
516
517void
1579bae1 518lex_redirect (const char *string)
252b5132
RH
519{
520 YY_BUFFER_STATE tmp;
521
522 yy_init = 0;
1579bae1 523 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
252b5132
RH
524 {
525 einfo("%F: macros nested too deeply\n");
526 }
527 file_name_stack[include_stack_ptr] = "redirect";
b47c4208 528 lineno_stack[include_stack_ptr] = lineno;
252b5132
RH
529 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
530 include_stack_ptr++;
b47c4208 531 lineno = 1;
252b5132
RH
532 tmp = yy_create_string_buffer (string, strlen (string));
533 yy_switch_to_buffer (tmp);
252b5132
RH
534}
535\f
536/* Functions to switch to a different flex start condition,
537 saving the current start condition on `state_stack'. */
538
539static int state_stack[MAX_INCLUDE_DEPTH * 2];
540static int *state_stack_p = state_stack;
541
542void
1579bae1 543ldlex_script (void)
252b5132
RH
544{
545 *(state_stack_p)++ = yy_start;
546 BEGIN (SCRIPT);
547}
548
549void
1579bae1 550ldlex_mri_script (void)
252b5132
RH
551{
552 *(state_stack_p)++ = yy_start;
553 BEGIN (MRI);
554}
555
556void
1579bae1 557ldlex_version_script (void)
252b5132
RH
558{
559 *(state_stack_p)++ = yy_start;
560 BEGIN (VERS_START);
561}
562
563void
1579bae1 564ldlex_version_file (void)
252b5132
RH
565{
566 *(state_stack_p)++ = yy_start;
567 BEGIN (VERS_SCRIPT);
568}
569
570void
1579bae1 571ldlex_defsym (void)
252b5132
RH
572{
573 *(state_stack_p)++ = yy_start;
574 BEGIN (DEFSYMEXP);
575}
1579bae1 576
252b5132 577void
1579bae1 578ldlex_expression (void)
252b5132
RH
579{
580 *(state_stack_p)++ = yy_start;
581 BEGIN (EXPRESSION);
582}
583
584void
1579bae1 585ldlex_both (void)
252b5132
RH
586{
587 *(state_stack_p)++ = yy_start;
588 BEGIN (BOTH);
589}
590
591void
1579bae1 592ldlex_popstate (void)
252b5132
RH
593{
594 yy_start = *(--state_stack_p);
595}
596\f
597
598/* Place up to MAX_SIZE characters in BUF and return in *RESULT
599 either the number of characters read, or 0 to indicate EOF. */
600
601static void
1579bae1 602yy_input (char *buf, int *result, int max_size)
252b5132 603{
1579bae1 604 *result = 0;
731e28d8 605 if (YY_CURRENT_BUFFER->yy_input_file)
252b5132
RH
606 {
607 if (yyin)
608 {
1579bae1
AM
609 *result = fread (buf, 1, max_size, yyin);
610 if (*result < max_size && ferror (yyin))
252b5132
RH
611 einfo ("%F%P: read in flex scanner failed\n");
612 }
613 }
614}
615
616/* Eat the rest of a C-style comment. */
617
618static void
1579bae1 619comment (void)
252b5132
RH
620{
621 int c;
622
623 while (1)
624 {
625 c = input();
1579bae1 626 while (c != '*' && c != EOF)
252b5132
RH
627 {
628 if (c == '\n')
629 lineno++;
630 c = input();
631 }
632
633 if (c == '*')
634 {
635 c = input();
636 while (c == '*')
637 c = input();
638 if (c == '/')
639 break; /* found the end */
640 }
641
642 if (c == '\n')
643 lineno++;
644
645 if (c == EOF)
646 {
647 einfo( "%F%P: EOF in comment\n");
648 break;
649 }
650 }
651}
652
653/* Warn the user about a garbage character WHAT in the input
654 in context WHERE. */
655
656static void
1579bae1 657lex_warn_invalid (char *where, char *what)
252b5132
RH
658{
659 char buf[5];
660
661 /* If we have found an input file whose format we do not recognize,
662 and we are therefore treating it as a linker script, and we find
663 an invalid character, then most likely this is a real object file
664 of some different format. Treat it as such. */
665 if (ldfile_assumed_script)
666 {
667 bfd_set_error (bfd_error_file_not_recognized);
668 einfo ("%F%s: file not recognized: %E\n", ldfile_input_filename);
669 }
670
3882b010 671 if (! ISPRINT (*what))
252b5132
RH
672 {
673 sprintf (buf, "\\%03o", (unsigned int) *what);
674 what = buf;
675 }
676
677 einfo ("%P:%S: ignoring invalid character `%s'%s\n", what, where);
678}
This page took 0.275087 seconds and 4 git commands to generate.