* bsd-uthread.c (bsd_uthread_wait): Don't try to fetch thread IDs
[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.
252b5132 6
3ec57632 7 This file is part of GLD, the Gnu Linker.
252b5132 8
3ec57632
NC
9 GLD is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
12 any later version.
252b5132 13
3ec57632
NC
14 GLD is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
252b5132 18
3ec57632
NC
19 You should have received a copy of the GNU General Public License
20 along with GLD; see the file COPYING. If not, write to the Free
75be928b
NC
21 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
22 02110-1301, USA. */
252b5132
RH
23
24/*
25This was written by steve chamberlain
26 sac@cygnus.com
27*/
28
252b5132 29#include "sysdep.h"
3db64b00 30#include "bfd.h"
3882b010 31#include "safe-ctype.h"
e3e942e9 32#include "bfdlink.h"
252b5132 33#include "ld.h"
252b5132
RH
34#include "ldmisc.h"
35#include "ldexp.h"
36#include "ldlang.h"
df2a7313 37#include <ldgram.h>
252b5132
RH
38#include "ldfile.h"
39#include "ldlex.h"
40#include "ldmain.h"
d1b2b2dc 41#include "libiberty.h"
252b5132
RH
42
43/* The type of top-level parser input.
44 yylex and yyparse (indirectly) both check this. */
45input_type parser_input;
46
47/* Line number in the current input file.
48 (FIXME Actually, it doesn't appear to get reset for each file?) */
49unsigned int lineno = 1;
50
51/* The string we are currently lexing, or NULL if we are reading a
52 file. */
53const char *lex_string = NULL;
54
55/* Support for flex reading from more than one input file (stream).
56 `include_stack' is flex's input state for each open file;
57 `file_name_stack' is the file names. `lineno_stack' is the current
58 line numbers.
59
60 If `include_stack_ptr' is 0, we haven't started reading anything yet.
61 Otherwise, stack elements 0 through `include_stack_ptr - 1' are valid. */
62
63#undef YY_INPUT
1579bae1 64#define YY_INPUT(buf,result,max_size) yy_input (buf, &result, max_size)
252b5132 65
297ba367
NC
66#define YY_NO_UNPUT
67
252b5132
RH
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;
55255dae 133 case input_dynamic_list: return INPUT_DYNAMIC_LIST; break;
252b5132
RH
134 case input_defsym: return INPUT_DEFSYM; break;
135 default: abort ();
136 }
137 }
138
1579bae1 139<BOTH,SCRIPT,EXPRESSION,VERS_START,VERS_NODE,VERS_SCRIPT>"/*" { comment (); }
252b5132
RH
140
141
142<DEFSYMEXP>"-" { RTOKEN('-');}
143<DEFSYMEXP>"+" { RTOKEN('+');}
1579bae1 144<DEFSYMEXP>{FILENAMECHAR1}{SYMBOLCHARN}* { yylval.name = xstrdup (yytext); return NAME; }
252b5132
RH
145<DEFSYMEXP>"=" { RTOKEN('='); }
146
147<MRI,EXPRESSION>"$"([0-9A-Fa-f])+ {
1579bae1
AM
148 yylval.integer = bfd_scan_vma (yytext + 1, 0, 16);
149 yylval.bigint.str = NULL;
252b5132
RH
150 return INT;
151 }
152
153<MRI,EXPRESSION>([0-9A-Fa-f])+(H|h|X|x|B|b|O|o|D|d) {
154 int ibase ;
1579bae1
AM
155 switch (yytext[yyleng - 1]) {
156 case 'X':
252b5132
RH
157 case 'x':
158 case 'H':
159 case 'h':
160 ibase = 16;
161 break;
162 case 'O':
163 case 'o':
164 ibase = 8;
165 break;
166 case 'B':
167 case 'b':
168 ibase = 2;
169 break;
170 default:
171 ibase = 10;
172 }
173 yylval.integer = bfd_scan_vma (yytext, 0,
174 ibase);
1579bae1 175 yylval.bigint.str = NULL;
252b5132
RH
176 return INT;
177 }
2c382fb6 178<SCRIPT,DEFSYMEXP,MRI,BOTH,EXPRESSION>((("$"|0[xX])([0-9A-Fa-f])+)|(([0-9])+))(M|K|m|k)? {
252b5132 179 char *s = yytext;
2c382fb6 180 int ibase = 0;
252b5132
RH
181
182 if (*s == '$')
2c382fb6
AM
183 {
184 ++s;
185 ibase = 16;
186 }
187 yylval.integer = bfd_scan_vma (s, 0, ibase);
1579bae1
AM
188 yylval.bigint.str = NULL;
189 if (yytext[yyleng - 1] == 'M'
190 || yytext[yyleng - 1] == 'm')
2c382fb6
AM
191 {
192 yylval.integer *= 1024 * 1024;
193 }
1579bae1
AM
194 else if (yytext[yyleng - 1] == 'K'
195 || yytext[yyleng - 1]=='k')
2c382fb6
AM
196 {
197 yylval.integer *= 1024;
198 }
199 else if (yytext[0] == '0'
200 && (yytext[1] == 'x'
201 || yytext[1] == 'X'))
202 {
203 yylval.bigint.str = xstrdup (yytext + 2);
204 }
252b5132
RH
205 return INT;
206 }
207<BOTH,SCRIPT,EXPRESSION,MRI>"]" { RTOKEN(']');}
208<BOTH,SCRIPT,EXPRESSION,MRI>"[" { RTOKEN('[');}
209<BOTH,SCRIPT,EXPRESSION,MRI>"<<=" { RTOKEN(LSHIFTEQ);}
210<BOTH,SCRIPT,EXPRESSION,MRI>">>=" { RTOKEN(RSHIFTEQ);}
211<BOTH,SCRIPT,EXPRESSION,MRI>"||" { RTOKEN(OROR);}
212<BOTH,SCRIPT,EXPRESSION,MRI>"==" { RTOKEN(EQ);}
213<BOTH,SCRIPT,EXPRESSION,MRI>"!=" { RTOKEN(NE);}
214<BOTH,SCRIPT,EXPRESSION,MRI>">=" { RTOKEN(GE);}
215<BOTH,SCRIPT,EXPRESSION,MRI>"<=" { RTOKEN(LE);}
216<BOTH,SCRIPT,EXPRESSION,MRI>"<<" { RTOKEN(LSHIFT);}
217<BOTH,SCRIPT,EXPRESSION,MRI>">>" { RTOKEN(RSHIFT);}
218<BOTH,SCRIPT,EXPRESSION,MRI>"+=" { RTOKEN(PLUSEQ);}
219<BOTH,SCRIPT,EXPRESSION,MRI>"-=" { RTOKEN(MINUSEQ);}
220<BOTH,SCRIPT,EXPRESSION,MRI>"*=" { RTOKEN(MULTEQ);}
221<BOTH,SCRIPT,EXPRESSION,MRI>"/=" { RTOKEN(DIVEQ);}
222<BOTH,SCRIPT,EXPRESSION,MRI>"&=" { RTOKEN(ANDEQ);}
223<BOTH,SCRIPT,EXPRESSION,MRI>"|=" { RTOKEN(OREQ);}
224<BOTH,SCRIPT,EXPRESSION,MRI>"&&" { RTOKEN(ANDAND);}
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('%');}
237<BOTH,SCRIPT,EXPRESSION,MRI>"<" { RTOKEN('<');}
3ec57632
NC
238<BOTH,SCRIPT,EXPRESSION,MRI>"=" { RTOKEN('=');}
239<BOTH,SCRIPT,EXPRESSION,MRI>"}" { RTOKEN('}') ; }
240<BOTH,SCRIPT,EXPRESSION,MRI>"{" { RTOKEN('{'); }
241<BOTH,SCRIPT,EXPRESSION,MRI>")" { RTOKEN(')');}
242<BOTH,SCRIPT,EXPRESSION,MRI>"(" { RTOKEN('(');}
252b5132
RH
243<BOTH,SCRIPT,EXPRESSION,MRI>":" { RTOKEN(':'); }
244<BOTH,SCRIPT,EXPRESSION,MRI>";" { RTOKEN(';');}
3ec57632
NC
245<BOTH,SCRIPT>"MEMORY" { RTOKEN(MEMORY);}
246<BOTH,SCRIPT,EXPRESSION>"ORIGIN" { RTOKEN(ORIGIN);}
247<BOTH,SCRIPT>"VERSION" { RTOKEN(VERSIONK);}
252b5132
RH
248<EXPRESSION,BOTH,SCRIPT>"BLOCK" { RTOKEN(BLOCK);}
249<EXPRESSION,BOTH,SCRIPT>"BIND" { RTOKEN(BIND);}
3ec57632
NC
250<BOTH,SCRIPT,EXPRESSION>"LENGTH" { RTOKEN(LENGTH);}
251<EXPRESSION,BOTH,SCRIPT>"ALIGN" { RTOKEN(ALIGN_K);}
2d20f7bf 252<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_ALIGN" { RTOKEN(DATA_SEGMENT_ALIGN);}
8c37241b 253<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_RELRO_END" { RTOKEN(DATA_SEGMENT_RELRO_END);}
2d20f7bf 254<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_END" { RTOKEN(DATA_SEGMENT_END);}
3ec57632
NC
255<EXPRESSION,BOTH,SCRIPT>"ADDR" { RTOKEN(ADDR);}
256<EXPRESSION,BOTH,SCRIPT>"LOADADDR" { RTOKEN(LOADADDR);}
362c1d1a 257<EXPRESSION,BOTH,SCRIPT>"ALIGNOF" { RTOKEN(ALIGNOF); }
252b5132
RH
258<EXPRESSION,BOTH>"MAX" { RTOKEN(MAX_K); }
259<EXPRESSION,BOTH>"MIN" { RTOKEN(MIN_K); }
8545d1a9 260<EXPRESSION,BOTH,SCRIPT>"ASSERT" { RTOKEN(ASSERT_K); }
252b5132
RH
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); }
7af8e998 316<EXPRESSION,BOTH,SCRIPT>"PROVIDE_HIDDEN" { RTOKEN(PROVIDE_HIDDEN); }
252b5132 317<EXPRESSION,BOTH,SCRIPT>"KEEP" { RTOKEN(KEEP); }
3ec57632 318<EXPRESSION,BOTH,SCRIPT>"EXCLUDE_FILE" { RTOKEN(EXCLUDE_FILE); }
24718e3b 319<EXPRESSION,BOTH,SCRIPT>"CONSTANT" { RTOKEN(CONSTANT);}
252b5132
RH
320<MRI>"#".*\n? { ++ lineno; }
321<MRI>"\n" { ++ lineno; RTOKEN(NEWLINE); }
322<MRI>"*".* { /* Mri comment line */ }
323<MRI>";".* { /* Mri comment line */ }
324<MRI>"END" { RTOKEN(ENDWORD); }
3ec57632
NC
325<MRI>"ALIGNMOD" { RTOKEN(ALIGNMOD);}
326<MRI>"ALIGN" { RTOKEN(ALIGN_K);}
252b5132
RH
327<MRI>"CHIP" { RTOKEN(CHIP); }
328<MRI>"BASE" { RTOKEN(BASE); }
3ec57632
NC
329<MRI>"ALIAS" { RTOKEN(ALIAS); }
330<MRI>"TRUNCATE" { RTOKEN(TRUNCATE); }
252b5132
RH
331<MRI>"LOAD" { RTOKEN(LOAD); }
332<MRI>"PUBLIC" { RTOKEN(PUBLIC); }
333<MRI>"ORDER" { RTOKEN(ORDER); }
334<MRI>"NAME" { RTOKEN(NAMEWORD); }
335<MRI>"FORMAT" { RTOKEN(FORMAT); }
336<MRI>"CASE" { RTOKEN(CASE); }
337<MRI>"START" { RTOKEN(START); }
338<MRI>"LIST".* { RTOKEN(LIST); /* LIST and ignore to end of line */ }
339<MRI>"SECT" { RTOKEN(SECT); }
340<EXPRESSION,BOTH,SCRIPT,MRI>"ABSOLUTE" { RTOKEN(ABSOLUTE); }
341<MRI>"end" { RTOKEN(ENDWORD); }
3ec57632
NC
342<MRI>"alignmod" { RTOKEN(ALIGNMOD);}
343<MRI>"align" { RTOKEN(ALIGN_K);}
252b5132
RH
344<MRI>"chip" { RTOKEN(CHIP); }
345<MRI>"base" { RTOKEN(BASE); }
3ec57632
NC
346<MRI>"alias" { RTOKEN(ALIAS); }
347<MRI>"truncate" { RTOKEN(TRUNCATE); }
252b5132
RH
348<MRI>"load" { RTOKEN(LOAD); }
349<MRI>"public" { RTOKEN(PUBLIC); }
350<MRI>"order" { RTOKEN(ORDER); }
351<MRI>"name" { RTOKEN(NAMEWORD); }
352<MRI>"format" { RTOKEN(FORMAT); }
353<MRI>"case" { RTOKEN(CASE); }
354<MRI>"extern" { RTOKEN(EXTERN); }
355<MRI>"start" { RTOKEN(START); }
356<MRI>"list".* { RTOKEN(LIST); /* LIST and ignore to end of line */ }
357<MRI>"sect" { RTOKEN(SECT); }
358<EXPRESSION,BOTH,SCRIPT,MRI>"absolute" { RTOKEN(ABSOLUTE); }
359
360<MRI>{FILENAMECHAR1}{NOCFILENAMECHAR}* {
361/* Filename without commas, needed to parse mri stuff */
1579bae1 362 yylval.name = xstrdup (yytext);
252b5132
RH
363 return NAME;
364 }
365
366
8545d1a9 367<BOTH>{FILENAMECHAR1}{FILENAMECHAR}* {
1579bae1 368 yylval.name = xstrdup (yytext);
252b5132
RH
369 return NAME;
370 }
8545d1a9
NS
371<BOTH>"-l"{FILENAMECHAR}+ {
372 yylval.name = xstrdup (yytext + 2);
373 return LNAME;
374 }
375<EXPRESSION>{FILENAMECHAR1}{NOCFILENAMECHAR}* {
376 yylval.name = xstrdup (yytext);
377 return NAME;
378 }
379<EXPRESSION>"-l"{NOCFILENAMECHAR}+ {
d1b2b2dc 380 yylval.name = xstrdup (yytext + 2);
252b5132
RH
381 return LNAME;
382 }
383<SCRIPT>{WILDCHAR}* {
384 /* Annoyingly, this pattern can match comments, and we have
385 longest match issues to consider. So if the first two
386 characters are a comment opening, put the input back and
387 try again. */
388 if (yytext[0] == '/' && yytext[1] == '*')
389 {
1579bae1 390 yyless (2);
252b5132
RH
391 comment ();
392 }
393 else
394 {
1579bae1 395 yylval.name = xstrdup (yytext);
252b5132
RH
396 return NAME;
397 }
398 }
399
400<EXPRESSION,BOTH,SCRIPT,VERS_NODE>"\""[^\"]*"\"" {
401 /* No matter the state, quotes
402 give what's inside */
1579bae1
AM
403 yylval.name = xstrdup (yytext + 1);
404 yylval.name[yyleng - 2] = 0;
252b5132
RH
405 return NAME;
406 }
407<BOTH,SCRIPT,EXPRESSION>"\n" { lineno++;}
408<MRI,BOTH,SCRIPT,EXPRESSION>[ \t\r]+ { }
409
410<VERS_NODE,VERS_SCRIPT>[:,;] { return *yytext; }
411
412<VERS_NODE>global { RTOKEN(GLOBAL); }
413
414<VERS_NODE>local { RTOKEN(LOCAL); }
415
416<VERS_NODE>extern { RTOKEN(EXTERN); }
417
d1b2b2dc 418<VERS_NODE>{V_IDENTIFIER} { yylval.name = xstrdup (yytext);
252b5132
RH
419 return VERS_IDENTIFIER; }
420
d1b2b2dc 421<VERS_SCRIPT>{V_TAG} { yylval.name = xstrdup (yytext);
252b5132
RH
422 return VERS_TAG; }
423
424<VERS_START>"{" { BEGIN(VERS_SCRIPT); return *yytext; }
425
1579bae1 426<VERS_SCRIPT>"{" { BEGIN(VERS_NODE);
252b5132
RH
427 vers_node_nesting = 0;
428 return *yytext;
429 }
430<VERS_SCRIPT>"}" { return *yytext; }
431<VERS_NODE>"{" { vers_node_nesting++; return *yytext; }
432<VERS_NODE>"}" { if (--vers_node_nesting < 0)
433 BEGIN(VERS_SCRIPT);
434 return *yytext;
435 }
436
437<VERS_START,VERS_NODE,VERS_SCRIPT>[\n] { lineno++; }
438
439<VERS_START,VERS_NODE,VERS_SCRIPT>#.* { /* Eat up comments */ }
440
441<VERS_START,VERS_NODE,VERS_SCRIPT>[ \t\r]+ { /* Eat up whitespace */ }
442
443<<EOF>> {
444 include_stack_ptr--;
1579bae1
AM
445
446 if (include_stack_ptr == 0)
252b5132 447 {
1579bae1 448 yyterminate ();
252b5132 449 }
1579bae1 450 else
252b5132 451 {
1579bae1 452 yy_switch_to_buffer (include_stack[include_stack_ptr]);
252b5132 453 }
b47c4208 454
252b5132 455 ldfile_input_filename = file_name_stack[include_stack_ptr - 1];
b47c4208 456 lineno = lineno_stack[include_stack_ptr];
252b5132
RH
457
458 return END;
459}
460
1579bae1
AM
461<SCRIPT,MRI,VERS_START,VERS_SCRIPT,VERS_NODE>. lex_warn_invalid (" in script", yytext);
462<EXPRESSION,DEFSYMEXP,BOTH>. lex_warn_invalid (" in expression", yytext);
463
252b5132
RH
464%%
465\f
466
467/* Switch flex to reading script file NAME, open on FILE,
468 saving the current input info on the include stack. */
469
470void
1579bae1 471lex_push_file (FILE *file, const char *name)
252b5132 472{
1579bae1 473 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
252b5132 474 {
1579bae1 475 einfo ("%F:includes nested too deeply\n");
252b5132
RH
476 }
477 file_name_stack[include_stack_ptr] = name;
b47c4208 478 lineno_stack[include_stack_ptr] = lineno;
252b5132
RH
479 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
480
481 include_stack_ptr++;
b47c4208 482 lineno = 1;
252b5132 483 yyin = file;
1579bae1 484 yy_switch_to_buffer (yy_create_buffer (yyin, YY_BUF_SIZE));
252b5132
RH
485}
486
487/* Return a newly created flex input buffer containing STRING,
488 which is SIZE bytes long. */
489
1579bae1
AM
490static YY_BUFFER_STATE
491yy_create_string_buffer (const char *string, size_t size)
252b5132
RH
492{
493 YY_BUFFER_STATE b;
494
495 /* Calls to m-alloc get turned by sed into xm-alloc. */
1579bae1 496 b = malloc (sizeof (struct yy_buffer_state));
252b5132
RH
497 b->yy_input_file = 0;
498 b->yy_buf_size = size;
499
500 /* yy_ch_buf has to be 2 characters longer than the size given because
501 we need to put in 2 end-of-buffer characters. */
1579bae1 502 b->yy_ch_buf = malloc ((unsigned) (b->yy_buf_size + 3));
252b5132
RH
503
504 b->yy_ch_buf[0] = '\n';
505 strcpy (b->yy_ch_buf+1, string);
506 b->yy_ch_buf[size+1] = YY_END_OF_BUFFER_CHAR;
507 b->yy_ch_buf[size+2] = YY_END_OF_BUFFER_CHAR;
508 b->yy_n_chars = size+1;
509 b->yy_buf_pos = &b->yy_ch_buf[1];
510
dca7760f
AM
511 b->yy_is_our_buffer = 1;
512 b->yy_is_interactive = 0;
513 b->yy_at_bol = 1;
514 b->yy_fill_buffer = 0;
515
252b5132
RH
516 /* flex 2.4.7 changed the interface. FIXME: We should not be using
517 a flex internal interface in the first place! */
518#ifdef YY_BUFFER_NEW
519 b->yy_buffer_status = YY_BUFFER_NEW;
520#else
521 b->yy_eof_status = EOF_NOT_SEEN;
522#endif
523
524 return b;
525}
526
527/* Switch flex to reading from STRING, saving the current input info
528 on the include stack. */
529
530void
1579bae1 531lex_redirect (const char *string)
252b5132
RH
532{
533 YY_BUFFER_STATE tmp;
534
535 yy_init = 0;
1579bae1 536 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
252b5132
RH
537 {
538 einfo("%F: macros nested too deeply\n");
539 }
540 file_name_stack[include_stack_ptr] = "redirect";
b47c4208 541 lineno_stack[include_stack_ptr] = lineno;
252b5132
RH
542 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
543 include_stack_ptr++;
b47c4208 544 lineno = 1;
252b5132
RH
545 tmp = yy_create_string_buffer (string, strlen (string));
546 yy_switch_to_buffer (tmp);
252b5132
RH
547}
548\f
549/* Functions to switch to a different flex start condition,
550 saving the current start condition on `state_stack'. */
551
552static int state_stack[MAX_INCLUDE_DEPTH * 2];
553static int *state_stack_p = state_stack;
554
555void
1579bae1 556ldlex_script (void)
252b5132
RH
557{
558 *(state_stack_p)++ = yy_start;
559 BEGIN (SCRIPT);
560}
561
562void
1579bae1 563ldlex_mri_script (void)
252b5132
RH
564{
565 *(state_stack_p)++ = yy_start;
566 BEGIN (MRI);
567}
568
569void
1579bae1 570ldlex_version_script (void)
252b5132
RH
571{
572 *(state_stack_p)++ = yy_start;
573 BEGIN (VERS_START);
574}
575
576void
1579bae1 577ldlex_version_file (void)
252b5132
RH
578{
579 *(state_stack_p)++ = yy_start;
580 BEGIN (VERS_SCRIPT);
581}
582
583void
1579bae1 584ldlex_defsym (void)
252b5132
RH
585{
586 *(state_stack_p)++ = yy_start;
587 BEGIN (DEFSYMEXP);
588}
1579bae1 589
252b5132 590void
1579bae1 591ldlex_expression (void)
252b5132
RH
592{
593 *(state_stack_p)++ = yy_start;
594 BEGIN (EXPRESSION);
595}
596
597void
1579bae1 598ldlex_both (void)
252b5132
RH
599{
600 *(state_stack_p)++ = yy_start;
601 BEGIN (BOTH);
602}
603
604void
1579bae1 605ldlex_popstate (void)
252b5132
RH
606{
607 yy_start = *(--state_stack_p);
608}
609\f
610
611/* Place up to MAX_SIZE characters in BUF and return in *RESULT
612 either the number of characters read, or 0 to indicate EOF. */
613
614static void
1579bae1 615yy_input (char *buf, int *result, int max_size)
252b5132 616{
1579bae1 617 *result = 0;
731e28d8 618 if (YY_CURRENT_BUFFER->yy_input_file)
252b5132
RH
619 {
620 if (yyin)
621 {
1579bae1
AM
622 *result = fread (buf, 1, max_size, yyin);
623 if (*result < max_size && ferror (yyin))
252b5132
RH
624 einfo ("%F%P: read in flex scanner failed\n");
625 }
626 }
627}
628
629/* Eat the rest of a C-style comment. */
630
631static void
1579bae1 632comment (void)
252b5132
RH
633{
634 int c;
635
636 while (1)
637 {
638 c = input();
1579bae1 639 while (c != '*' && c != EOF)
252b5132
RH
640 {
641 if (c == '\n')
642 lineno++;
643 c = input();
644 }
645
646 if (c == '*')
647 {
648 c = input();
649 while (c == '*')
650 c = input();
651 if (c == '/')
652 break; /* found the end */
653 }
654
655 if (c == '\n')
656 lineno++;
657
658 if (c == EOF)
659 {
660 einfo( "%F%P: EOF in comment\n");
661 break;
662 }
663 }
664}
665
666/* Warn the user about a garbage character WHAT in the input
667 in context WHERE. */
668
669static void
1579bae1 670lex_warn_invalid (char *where, char *what)
252b5132
RH
671{
672 char buf[5];
673
674 /* If we have found an input file whose format we do not recognize,
675 and we are therefore treating it as a linker script, and we find
676 an invalid character, then most likely this is a real object file
677 of some different format. Treat it as such. */
678 if (ldfile_assumed_script)
679 {
680 bfd_set_error (bfd_error_file_not_recognized);
681 einfo ("%F%s: file not recognized: %E\n", ldfile_input_filename);
682 }
683
3882b010 684 if (! ISPRINT (*what))
252b5132
RH
685 {
686 sprintf (buf, "\\%03o", (unsigned int) *what);
687 what = buf;
688 }
689
690 einfo ("%P:%S: ignoring invalid character `%s'%s\n", what, where);
691}
This page took 0.345544 seconds and 4 git commands to generate.