* emulparams/elf_x86_64.sh: Revert last change.
[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
75be928b
NC
20 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21 02110-1301, 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); }
0cf7d72c 306<EXPRESSION,BOTH,SCRIPT>"SPECIAL" { RTOKEN(SPECIAL); }
252b5132
RH
307<BOTH,SCRIPT>"o" { RTOKEN(ORIGIN);}
308<BOTH,SCRIPT>"org" { RTOKEN(ORIGIN);}
309<BOTH,SCRIPT>"l" { RTOKEN( LENGTH);}
310<BOTH,SCRIPT>"len" { RTOKEN( LENGTH);}
311<BOTH,SCRIPT>"INCLUDE" { RTOKEN(INCLUDE);}
312<BOTH,SCRIPT>"PHDRS" { RTOKEN (PHDRS); }
3ec57632
NC
313<EXPRESSION,BOTH,SCRIPT>"AT" { RTOKEN(AT);}
314<EXPRESSION,BOTH,SCRIPT>"SUBALIGN" { RTOKEN(SUBALIGN);}
315<EXPRESSION,BOTH,SCRIPT>"PROVIDE" { RTOKEN(PROVIDE); }
252b5132 316<EXPRESSION,BOTH,SCRIPT>"KEEP" { RTOKEN(KEEP); }
3ec57632 317<EXPRESSION,BOTH,SCRIPT>"EXCLUDE_FILE" { RTOKEN(EXCLUDE_FILE); }
252b5132
RH
318<MRI>"#".*\n? { ++ lineno; }
319<MRI>"\n" { ++ lineno; RTOKEN(NEWLINE); }
320<MRI>"*".* { /* Mri comment line */ }
321<MRI>";".* { /* Mri comment line */ }
322<MRI>"END" { RTOKEN(ENDWORD); }
3ec57632
NC
323<MRI>"ALIGNMOD" { RTOKEN(ALIGNMOD);}
324<MRI>"ALIGN" { RTOKEN(ALIGN_K);}
252b5132
RH
325<MRI>"CHIP" { RTOKEN(CHIP); }
326<MRI>"BASE" { RTOKEN(BASE); }
3ec57632
NC
327<MRI>"ALIAS" { RTOKEN(ALIAS); }
328<MRI>"TRUNCATE" { RTOKEN(TRUNCATE); }
252b5132
RH
329<MRI>"LOAD" { RTOKEN(LOAD); }
330<MRI>"PUBLIC" { RTOKEN(PUBLIC); }
331<MRI>"ORDER" { RTOKEN(ORDER); }
332<MRI>"NAME" { RTOKEN(NAMEWORD); }
333<MRI>"FORMAT" { RTOKEN(FORMAT); }
334<MRI>"CASE" { RTOKEN(CASE); }
335<MRI>"START" { RTOKEN(START); }
336<MRI>"LIST".* { RTOKEN(LIST); /* LIST and ignore to end of line */ }
337<MRI>"SECT" { RTOKEN(SECT); }
338<EXPRESSION,BOTH,SCRIPT,MRI>"ABSOLUTE" { RTOKEN(ABSOLUTE); }
339<MRI>"end" { RTOKEN(ENDWORD); }
3ec57632
NC
340<MRI>"alignmod" { RTOKEN(ALIGNMOD);}
341<MRI>"align" { RTOKEN(ALIGN_K);}
252b5132
RH
342<MRI>"chip" { RTOKEN(CHIP); }
343<MRI>"base" { RTOKEN(BASE); }
3ec57632
NC
344<MRI>"alias" { RTOKEN(ALIAS); }
345<MRI>"truncate" { RTOKEN(TRUNCATE); }
252b5132
RH
346<MRI>"load" { RTOKEN(LOAD); }
347<MRI>"public" { RTOKEN(PUBLIC); }
348<MRI>"order" { RTOKEN(ORDER); }
349<MRI>"name" { RTOKEN(NAMEWORD); }
350<MRI>"format" { RTOKEN(FORMAT); }
351<MRI>"case" { RTOKEN(CASE); }
352<MRI>"extern" { RTOKEN(EXTERN); }
353<MRI>"start" { RTOKEN(START); }
354<MRI>"list".* { RTOKEN(LIST); /* LIST and ignore to end of line */ }
355<MRI>"sect" { RTOKEN(SECT); }
356<EXPRESSION,BOTH,SCRIPT,MRI>"absolute" { RTOKEN(ABSOLUTE); }
357
358<MRI>{FILENAMECHAR1}{NOCFILENAMECHAR}* {
359/* Filename without commas, needed to parse mri stuff */
1579bae1 360 yylval.name = xstrdup (yytext);
252b5132
RH
361 return NAME;
362 }
363
364
365<BOTH,EXPRESSION>{FILENAMECHAR1}{FILENAMECHAR}* {
1579bae1 366 yylval.name = xstrdup (yytext);
252b5132
RH
367 return NAME;
368 }
369<BOTH,EXPRESSION>"-l"{FILENAMECHAR}+ {
d1b2b2dc 370 yylval.name = xstrdup (yytext + 2);
252b5132
RH
371 return LNAME;
372 }
373<SCRIPT>{WILDCHAR}* {
374 /* Annoyingly, this pattern can match comments, and we have
375 longest match issues to consider. So if the first two
376 characters are a comment opening, put the input back and
377 try again. */
378 if (yytext[0] == '/' && yytext[1] == '*')
379 {
1579bae1 380 yyless (2);
252b5132
RH
381 comment ();
382 }
383 else
384 {
1579bae1 385 yylval.name = xstrdup (yytext);
252b5132
RH
386 return NAME;
387 }
388 }
389
390<EXPRESSION,BOTH,SCRIPT,VERS_NODE>"\""[^\"]*"\"" {
391 /* No matter the state, quotes
392 give what's inside */
1579bae1
AM
393 yylval.name = xstrdup (yytext + 1);
394 yylval.name[yyleng - 2] = 0;
252b5132
RH
395 return NAME;
396 }
397<BOTH,SCRIPT,EXPRESSION>"\n" { lineno++;}
398<MRI,BOTH,SCRIPT,EXPRESSION>[ \t\r]+ { }
399
400<VERS_NODE,VERS_SCRIPT>[:,;] { return *yytext; }
401
402<VERS_NODE>global { RTOKEN(GLOBAL); }
403
404<VERS_NODE>local { RTOKEN(LOCAL); }
405
406<VERS_NODE>extern { RTOKEN(EXTERN); }
407
d1b2b2dc 408<VERS_NODE>{V_IDENTIFIER} { yylval.name = xstrdup (yytext);
252b5132
RH
409 return VERS_IDENTIFIER; }
410
d1b2b2dc 411<VERS_SCRIPT>{V_TAG} { yylval.name = xstrdup (yytext);
252b5132
RH
412 return VERS_TAG; }
413
414<VERS_START>"{" { BEGIN(VERS_SCRIPT); return *yytext; }
415
1579bae1 416<VERS_SCRIPT>"{" { BEGIN(VERS_NODE);
252b5132
RH
417 vers_node_nesting = 0;
418 return *yytext;
419 }
420<VERS_SCRIPT>"}" { return *yytext; }
421<VERS_NODE>"{" { vers_node_nesting++; return *yytext; }
422<VERS_NODE>"}" { if (--vers_node_nesting < 0)
423 BEGIN(VERS_SCRIPT);
424 return *yytext;
425 }
426
427<VERS_START,VERS_NODE,VERS_SCRIPT>[\n] { lineno++; }
428
429<VERS_START,VERS_NODE,VERS_SCRIPT>#.* { /* Eat up comments */ }
430
431<VERS_START,VERS_NODE,VERS_SCRIPT>[ \t\r]+ { /* Eat up whitespace */ }
432
433<<EOF>> {
434 include_stack_ptr--;
1579bae1
AM
435
436 if (include_stack_ptr == 0)
252b5132 437 {
1579bae1 438 yyterminate ();
252b5132 439 }
1579bae1 440 else
252b5132 441 {
1579bae1 442 yy_switch_to_buffer (include_stack[include_stack_ptr]);
252b5132 443 }
b47c4208 444
252b5132 445 ldfile_input_filename = file_name_stack[include_stack_ptr - 1];
b47c4208 446 lineno = lineno_stack[include_stack_ptr];
252b5132
RH
447
448 return END;
449}
450
1579bae1
AM
451<SCRIPT,MRI,VERS_START,VERS_SCRIPT,VERS_NODE>. lex_warn_invalid (" in script", yytext);
452<EXPRESSION,DEFSYMEXP,BOTH>. lex_warn_invalid (" in expression", yytext);
453
252b5132
RH
454%%
455\f
456
457/* Switch flex to reading script file NAME, open on FILE,
458 saving the current input info on the include stack. */
459
460void
1579bae1 461lex_push_file (FILE *file, const char *name)
252b5132 462{
1579bae1 463 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
252b5132 464 {
1579bae1 465 einfo ("%F:includes nested too deeply\n");
252b5132
RH
466 }
467 file_name_stack[include_stack_ptr] = name;
b47c4208 468 lineno_stack[include_stack_ptr] = lineno;
252b5132
RH
469 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
470
471 include_stack_ptr++;
b47c4208 472 lineno = 1;
252b5132 473 yyin = file;
1579bae1 474 yy_switch_to_buffer (yy_create_buffer (yyin, YY_BUF_SIZE));
252b5132
RH
475}
476
477/* Return a newly created flex input buffer containing STRING,
478 which is SIZE bytes long. */
479
1579bae1
AM
480static YY_BUFFER_STATE
481yy_create_string_buffer (const char *string, size_t size)
252b5132
RH
482{
483 YY_BUFFER_STATE b;
484
485 /* Calls to m-alloc get turned by sed into xm-alloc. */
1579bae1 486 b = malloc (sizeof (struct yy_buffer_state));
252b5132
RH
487 b->yy_input_file = 0;
488 b->yy_buf_size = size;
489
490 /* yy_ch_buf has to be 2 characters longer than the size given because
491 we need to put in 2 end-of-buffer characters. */
1579bae1 492 b->yy_ch_buf = malloc ((unsigned) (b->yy_buf_size + 3));
252b5132
RH
493
494 b->yy_ch_buf[0] = '\n';
495 strcpy (b->yy_ch_buf+1, string);
496 b->yy_ch_buf[size+1] = YY_END_OF_BUFFER_CHAR;
497 b->yy_ch_buf[size+2] = YY_END_OF_BUFFER_CHAR;
498 b->yy_n_chars = size+1;
499 b->yy_buf_pos = &b->yy_ch_buf[1];
500
dca7760f
AM
501 b->yy_is_our_buffer = 1;
502 b->yy_is_interactive = 0;
503 b->yy_at_bol = 1;
504 b->yy_fill_buffer = 0;
505
252b5132
RH
506 /* flex 2.4.7 changed the interface. FIXME: We should not be using
507 a flex internal interface in the first place! */
508#ifdef YY_BUFFER_NEW
509 b->yy_buffer_status = YY_BUFFER_NEW;
510#else
511 b->yy_eof_status = EOF_NOT_SEEN;
512#endif
513
514 return b;
515}
516
517/* Switch flex to reading from STRING, saving the current input info
518 on the include stack. */
519
520void
1579bae1 521lex_redirect (const char *string)
252b5132
RH
522{
523 YY_BUFFER_STATE tmp;
524
525 yy_init = 0;
1579bae1 526 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
252b5132
RH
527 {
528 einfo("%F: macros nested too deeply\n");
529 }
530 file_name_stack[include_stack_ptr] = "redirect";
b47c4208 531 lineno_stack[include_stack_ptr] = lineno;
252b5132
RH
532 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
533 include_stack_ptr++;
b47c4208 534 lineno = 1;
252b5132
RH
535 tmp = yy_create_string_buffer (string, strlen (string));
536 yy_switch_to_buffer (tmp);
252b5132
RH
537}
538\f
539/* Functions to switch to a different flex start condition,
540 saving the current start condition on `state_stack'. */
541
542static int state_stack[MAX_INCLUDE_DEPTH * 2];
543static int *state_stack_p = state_stack;
544
545void
1579bae1 546ldlex_script (void)
252b5132
RH
547{
548 *(state_stack_p)++ = yy_start;
549 BEGIN (SCRIPT);
550}
551
552void
1579bae1 553ldlex_mri_script (void)
252b5132
RH
554{
555 *(state_stack_p)++ = yy_start;
556 BEGIN (MRI);
557}
558
559void
1579bae1 560ldlex_version_script (void)
252b5132
RH
561{
562 *(state_stack_p)++ = yy_start;
563 BEGIN (VERS_START);
564}
565
566void
1579bae1 567ldlex_version_file (void)
252b5132
RH
568{
569 *(state_stack_p)++ = yy_start;
570 BEGIN (VERS_SCRIPT);
571}
572
573void
1579bae1 574ldlex_defsym (void)
252b5132
RH
575{
576 *(state_stack_p)++ = yy_start;
577 BEGIN (DEFSYMEXP);
578}
1579bae1 579
252b5132 580void
1579bae1 581ldlex_expression (void)
252b5132
RH
582{
583 *(state_stack_p)++ = yy_start;
584 BEGIN (EXPRESSION);
585}
586
587void
1579bae1 588ldlex_both (void)
252b5132
RH
589{
590 *(state_stack_p)++ = yy_start;
591 BEGIN (BOTH);
592}
593
594void
1579bae1 595ldlex_popstate (void)
252b5132
RH
596{
597 yy_start = *(--state_stack_p);
598}
599\f
600
601/* Place up to MAX_SIZE characters in BUF and return in *RESULT
602 either the number of characters read, or 0 to indicate EOF. */
603
604static void
1579bae1 605yy_input (char *buf, int *result, int max_size)
252b5132 606{
1579bae1 607 *result = 0;
731e28d8 608 if (YY_CURRENT_BUFFER->yy_input_file)
252b5132
RH
609 {
610 if (yyin)
611 {
1579bae1
AM
612 *result = fread (buf, 1, max_size, yyin);
613 if (*result < max_size && ferror (yyin))
252b5132
RH
614 einfo ("%F%P: read in flex scanner failed\n");
615 }
616 }
617}
618
619/* Eat the rest of a C-style comment. */
620
621static void
1579bae1 622comment (void)
252b5132
RH
623{
624 int c;
625
626 while (1)
627 {
628 c = input();
1579bae1 629 while (c != '*' && c != EOF)
252b5132
RH
630 {
631 if (c == '\n')
632 lineno++;
633 c = input();
634 }
635
636 if (c == '*')
637 {
638 c = input();
639 while (c == '*')
640 c = input();
641 if (c == '/')
642 break; /* found the end */
643 }
644
645 if (c == '\n')
646 lineno++;
647
648 if (c == EOF)
649 {
650 einfo( "%F%P: EOF in comment\n");
651 break;
652 }
653 }
654}
655
656/* Warn the user about a garbage character WHAT in the input
657 in context WHERE. */
658
659static void
1579bae1 660lex_warn_invalid (char *where, char *what)
252b5132
RH
661{
662 char buf[5];
663
664 /* If we have found an input file whose format we do not recognize,
665 and we are therefore treating it as a linker script, and we find
666 an invalid character, then most likely this is a real object file
667 of some different format. Treat it as such. */
668 if (ldfile_assumed_script)
669 {
670 bfd_set_error (bfd_error_file_not_recognized);
671 einfo ("%F%s: file not recognized: %E\n", ldfile_input_filename);
672 }
673
3882b010 674 if (! ISPRINT (*what))
252b5132
RH
675 {
676 sprintf (buf, "\\%03o", (unsigned int) *what);
677 what = buf;
678 }
679
680 einfo ("%P:%S: ignoring invalid character `%s'%s\n", what, where);
681}
This page took 0.367025 seconds and 4 git commands to generate.