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