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