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