Add ORIGIN and LENGTH linker script operators.
[deliverable/binutils-gdb.git] / ld / ldlex.l
CommitLineData
252b5132
RH
1%{
2
968ec2b9 3/* Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3ec57632 4 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
252b5132 5
3ec57632 6 This file is part of GLD, the Gnu Linker.
252b5132 7
3ec57632
NC
8 GLD is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
252b5132 12
3ec57632
NC
13 GLD is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
252b5132 17
3ec57632
NC
18 You should have received a copy of the GNU General Public License
19 along with GLD; see the file COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA. */
252b5132
RH
22
23/*
24This was written by steve chamberlain
25 sac@cygnus.com
26*/
27
28
252b5132 29#include <stdio.h>
252b5132 30
252b5132
RH
31#include "bfd.h"
32#include "sysdep.h"
3882b010 33#include "safe-ctype.h"
e3e942e9 34#include "bfdlink.h"
252b5132 35#include "ld.h"
252b5132
RH
36#include "ldmisc.h"
37#include "ldexp.h"
38#include "ldlang.h"
df2a7313 39#include <ldgram.h>
252b5132
RH
40#include "ldfile.h"
41#include "ldlex.h"
42#include "ldmain.h"
d1b2b2dc 43#include "libiberty.h"
252b5132
RH
44
45/* The type of top-level parser input.
46 yylex and yyparse (indirectly) both check this. */
47input_type parser_input;
48
49/* Line number in the current input file.
50 (FIXME Actually, it doesn't appear to get reset for each file?) */
51unsigned int lineno = 1;
52
53/* The string we are currently lexing, or NULL if we are reading a
54 file. */
55const char *lex_string = NULL;
56
57/* Support for flex reading from more than one input file (stream).
58 `include_stack' is flex's input state for each open file;
59 `file_name_stack' is the file names. `lineno_stack' is the current
60 line numbers.
61
62 If `include_stack_ptr' is 0, we haven't started reading anything yet.
63 Otherwise, stack elements 0 through `include_stack_ptr - 1' are valid. */
64
65#undef YY_INPUT
1579bae1 66#define YY_INPUT(buf,result,max_size) yy_input (buf, &result, max_size)
252b5132
RH
67
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;
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
NC
244<BOTH,SCRIPT>"MEMORY" { RTOKEN(MEMORY);}
245<BOTH,SCRIPT,EXPRESSION>"ORIGIN" { RTOKEN(ORIGIN);}
246<BOTH,SCRIPT>"VERSION" { RTOKEN(VERSIONK);}
252b5132
RH
247<EXPRESSION,BOTH,SCRIPT>"BLOCK" { RTOKEN(BLOCK);}
248<EXPRESSION,BOTH,SCRIPT>"BIND" { RTOKEN(BIND);}
3ec57632
NC
249<BOTH,SCRIPT,EXPRESSION>"LENGTH" { RTOKEN(LENGTH);}
250<EXPRESSION,BOTH,SCRIPT>"ALIGN" { RTOKEN(ALIGN_K);}
2d20f7bf 251<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_ALIGN" { RTOKEN(DATA_SEGMENT_ALIGN);}
8c37241b 252<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_RELRO_END" { RTOKEN(DATA_SEGMENT_RELRO_END);}
2d20f7bf 253<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_END" { RTOKEN(DATA_SEGMENT_END);}
3ec57632
NC
254<EXPRESSION,BOTH,SCRIPT>"ADDR" { RTOKEN(ADDR);}
255<EXPRESSION,BOTH,SCRIPT>"LOADADDR" { RTOKEN(LOADADDR);}
252b5132
RH
256<EXPRESSION,BOTH>"MAX" { RTOKEN(MAX_K); }
257<EXPRESSION,BOTH>"MIN" { RTOKEN(MIN_K); }
258<EXPRESSION,BOTH>"ASSERT" { RTOKEN(ASSERT_K); }
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);}
3ec57632 272<EXPRESSION,BOTH,SCRIPT>"DEFINED" { RTOKEN(DEFINED);}
252b5132
RH
273<BOTH,SCRIPT>"CREATE_OBJECT_SYMBOLS" { RTOKEN(CREATE_OBJECT_SYMBOLS);}
274<BOTH,SCRIPT>"CONSTRUCTORS" { RTOKEN( CONSTRUCTORS);}
3ec57632 275<BOTH,SCRIPT>"FORCE_COMMON_ALLOCATION" { RTOKEN(FORCE_COMMON_ALLOCATION);}
4818e05f 276<BOTH,SCRIPT>"INHIBIT_COMMON_ALLOCATION" { RTOKEN(INHIBIT_COMMON_ALLOCATION);}
3ec57632 277<BOTH,SCRIPT>"SECTIONS" { RTOKEN(SECTIONS);}
252b5132 278<BOTH,SCRIPT>"FILL" { RTOKEN(FILL);}
3ec57632 279<BOTH,SCRIPT>"STARTUP" { RTOKEN(STARTUP);}
252b5132
RH
280<BOTH,SCRIPT>"OUTPUT_FORMAT" { RTOKEN(OUTPUT_FORMAT);}
281<BOTH,SCRIPT>"OUTPUT_ARCH" { RTOKEN( OUTPUT_ARCH);}
282<BOTH,SCRIPT>"HLL" { RTOKEN(HLL);}
3ec57632 283<BOTH,SCRIPT>"SYSLIB" { RTOKEN(SYSLIB);}
252b5132
RH
284<BOTH,SCRIPT>"FLOAT" { RTOKEN(FLOAT);}
285<BOTH,SCRIPT>"QUAD" { RTOKEN( QUAD);}
286<BOTH,SCRIPT>"SQUAD" { RTOKEN( SQUAD);}
287<BOTH,SCRIPT>"LONG" { RTOKEN( LONG);}
288<BOTH,SCRIPT>"SHORT" { RTOKEN( SHORT);}
289<BOTH,SCRIPT>"BYTE" { RTOKEN( BYTE);}
3ec57632 290<BOTH,SCRIPT>"NOFLOAT" { RTOKEN(NOFLOAT);}
252b5132
RH
291<EXPRESSION,BOTH,SCRIPT>"NOCROSSREFS" { RTOKEN(NOCROSSREFS);}
292<BOTH,SCRIPT>"OVERLAY" { RTOKEN(OVERLAY); }
bcaa7b3e
L
293<BOTH,SCRIPT>"SORT_BY_NAME" { RTOKEN(SORT_BY_NAME); }
294<BOTH,SCRIPT>"SORT_BY_ALIGNMENT" { RTOKEN(SORT_BY_ALIGNMENT); }
295<BOTH,SCRIPT>"SORT" { RTOKEN(SORT_BY_NAME); }
252b5132
RH
296<EXPRESSION,BOTH,SCRIPT>"NOLOAD" { RTOKEN(NOLOAD);}
297<EXPRESSION,BOTH,SCRIPT>"DSECT" { RTOKEN(DSECT);}
298<EXPRESSION,BOTH,SCRIPT>"COPY" { RTOKEN(COPY);}
299<EXPRESSION,BOTH,SCRIPT>"INFO" { RTOKEN(INFO);}
300<EXPRESSION,BOTH,SCRIPT>"OVERLAY" { RTOKEN(OVERLAY);}
0841712e
JJ
301<EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RO" { RTOKEN(ONLY_IF_RO); }
302<EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RW" { RTOKEN(ONLY_IF_RW); }
252b5132
RH
303<BOTH,SCRIPT>"o" { RTOKEN(ORIGIN);}
304<BOTH,SCRIPT>"org" { RTOKEN(ORIGIN);}
305<BOTH,SCRIPT>"l" { RTOKEN( LENGTH);}
306<BOTH,SCRIPT>"len" { RTOKEN( LENGTH);}
307<BOTH,SCRIPT>"INCLUDE" { RTOKEN(INCLUDE);}
308<BOTH,SCRIPT>"PHDRS" { RTOKEN (PHDRS); }
3ec57632
NC
309<EXPRESSION,BOTH,SCRIPT>"AT" { RTOKEN(AT);}
310<EXPRESSION,BOTH,SCRIPT>"SUBALIGN" { RTOKEN(SUBALIGN);}
311<EXPRESSION,BOTH,SCRIPT>"PROVIDE" { RTOKEN(PROVIDE); }
252b5132 312<EXPRESSION,BOTH,SCRIPT>"KEEP" { RTOKEN(KEEP); }
3ec57632 313<EXPRESSION,BOTH,SCRIPT>"EXCLUDE_FILE" { RTOKEN(EXCLUDE_FILE); }
252b5132
RH
314<MRI>"#".*\n? { ++ lineno; }
315<MRI>"\n" { ++ lineno; RTOKEN(NEWLINE); }
316<MRI>"*".* { /* Mri comment line */ }
317<MRI>";".* { /* Mri comment line */ }
318<MRI>"END" { RTOKEN(ENDWORD); }
3ec57632
NC
319<MRI>"ALIGNMOD" { RTOKEN(ALIGNMOD);}
320<MRI>"ALIGN" { RTOKEN(ALIGN_K);}
252b5132
RH
321<MRI>"CHIP" { RTOKEN(CHIP); }
322<MRI>"BASE" { RTOKEN(BASE); }
3ec57632
NC
323<MRI>"ALIAS" { RTOKEN(ALIAS); }
324<MRI>"TRUNCATE" { RTOKEN(TRUNCATE); }
252b5132
RH
325<MRI>"LOAD" { RTOKEN(LOAD); }
326<MRI>"PUBLIC" { RTOKEN(PUBLIC); }
327<MRI>"ORDER" { RTOKEN(ORDER); }
328<MRI>"NAME" { RTOKEN(NAMEWORD); }
329<MRI>"FORMAT" { RTOKEN(FORMAT); }
330<MRI>"CASE" { RTOKEN(CASE); }
331<MRI>"START" { RTOKEN(START); }
332<MRI>"LIST".* { RTOKEN(LIST); /* LIST and ignore to end of line */ }
333<MRI>"SECT" { RTOKEN(SECT); }
334<EXPRESSION,BOTH,SCRIPT,MRI>"ABSOLUTE" { RTOKEN(ABSOLUTE); }
335<MRI>"end" { RTOKEN(ENDWORD); }
3ec57632
NC
336<MRI>"alignmod" { RTOKEN(ALIGNMOD);}
337<MRI>"align" { RTOKEN(ALIGN_K);}
252b5132
RH
338<MRI>"chip" { RTOKEN(CHIP); }
339<MRI>"base" { RTOKEN(BASE); }
3ec57632
NC
340<MRI>"alias" { RTOKEN(ALIAS); }
341<MRI>"truncate" { RTOKEN(TRUNCATE); }
252b5132
RH
342<MRI>"load" { RTOKEN(LOAD); }
343<MRI>"public" { RTOKEN(PUBLIC); }
344<MRI>"order" { RTOKEN(ORDER); }
345<MRI>"name" { RTOKEN(NAMEWORD); }
346<MRI>"format" { RTOKEN(FORMAT); }
347<MRI>"case" { RTOKEN(CASE); }
348<MRI>"extern" { RTOKEN(EXTERN); }
349<MRI>"start" { RTOKEN(START); }
350<MRI>"list".* { RTOKEN(LIST); /* LIST and ignore to end of line */ }
351<MRI>"sect" { RTOKEN(SECT); }
352<EXPRESSION,BOTH,SCRIPT,MRI>"absolute" { RTOKEN(ABSOLUTE); }
353
354<MRI>{FILENAMECHAR1}{NOCFILENAMECHAR}* {
355/* Filename without commas, needed to parse mri stuff */
1579bae1 356 yylval.name = xstrdup (yytext);
252b5132
RH
357 return NAME;
358 }
359
360
361<BOTH,EXPRESSION>{FILENAMECHAR1}{FILENAMECHAR}* {
1579bae1 362 yylval.name = xstrdup (yytext);
252b5132
RH
363 return NAME;
364 }
365<BOTH,EXPRESSION>"-l"{FILENAMECHAR}+ {
d1b2b2dc 366 yylval.name = xstrdup (yytext + 2);
252b5132
RH
367 return LNAME;
368 }
369<SCRIPT>{WILDCHAR}* {
370 /* Annoyingly, this pattern can match comments, and we have
371 longest match issues to consider. So if the first two
372 characters are a comment opening, put the input back and
373 try again. */
374 if (yytext[0] == '/' && yytext[1] == '*')
375 {
1579bae1 376 yyless (2);
252b5132
RH
377 comment ();
378 }
379 else
380 {
1579bae1 381 yylval.name = xstrdup (yytext);
252b5132
RH
382 return NAME;
383 }
384 }
385
386<EXPRESSION,BOTH,SCRIPT,VERS_NODE>"\""[^\"]*"\"" {
387 /* No matter the state, quotes
388 give what's inside */
1579bae1
AM
389 yylval.name = xstrdup (yytext + 1);
390 yylval.name[yyleng - 2] = 0;
252b5132
RH
391 return NAME;
392 }
393<BOTH,SCRIPT,EXPRESSION>"\n" { lineno++;}
394<MRI,BOTH,SCRIPT,EXPRESSION>[ \t\r]+ { }
395
396<VERS_NODE,VERS_SCRIPT>[:,;] { return *yytext; }
397
398<VERS_NODE>global { RTOKEN(GLOBAL); }
399
400<VERS_NODE>local { RTOKEN(LOCAL); }
401
402<VERS_NODE>extern { RTOKEN(EXTERN); }
403
d1b2b2dc 404<VERS_NODE>{V_IDENTIFIER} { yylval.name = xstrdup (yytext);
252b5132
RH
405 return VERS_IDENTIFIER; }
406
d1b2b2dc 407<VERS_SCRIPT>{V_TAG} { yylval.name = xstrdup (yytext);
252b5132
RH
408 return VERS_TAG; }
409
410<VERS_START>"{" { BEGIN(VERS_SCRIPT); return *yytext; }
411
1579bae1 412<VERS_SCRIPT>"{" { BEGIN(VERS_NODE);
252b5132
RH
413 vers_node_nesting = 0;
414 return *yytext;
415 }
416<VERS_SCRIPT>"}" { return *yytext; }
417<VERS_NODE>"{" { vers_node_nesting++; return *yytext; }
418<VERS_NODE>"}" { if (--vers_node_nesting < 0)
419 BEGIN(VERS_SCRIPT);
420 return *yytext;
421 }
422
423<VERS_START,VERS_NODE,VERS_SCRIPT>[\n] { lineno++; }
424
425<VERS_START,VERS_NODE,VERS_SCRIPT>#.* { /* Eat up comments */ }
426
427<VERS_START,VERS_NODE,VERS_SCRIPT>[ \t\r]+ { /* Eat up whitespace */ }
428
429<<EOF>> {
430 include_stack_ptr--;
1579bae1
AM
431
432 if (include_stack_ptr == 0)
252b5132 433 {
1579bae1 434 yyterminate ();
252b5132 435 }
1579bae1 436 else
252b5132 437 {
1579bae1 438 yy_switch_to_buffer (include_stack[include_stack_ptr]);
252b5132 439 }
b47c4208 440
252b5132 441 ldfile_input_filename = file_name_stack[include_stack_ptr - 1];
b47c4208 442 lineno = lineno_stack[include_stack_ptr];
252b5132
RH
443
444 return END;
445}
446
1579bae1
AM
447<SCRIPT,MRI,VERS_START,VERS_SCRIPT,VERS_NODE>. lex_warn_invalid (" in script", yytext);
448<EXPRESSION,DEFSYMEXP,BOTH>. lex_warn_invalid (" in expression", yytext);
449
252b5132
RH
450%%
451\f
452
453/* Switch flex to reading script file NAME, open on FILE,
454 saving the current input info on the include stack. */
455
456void
1579bae1 457lex_push_file (FILE *file, const char *name)
252b5132 458{
1579bae1 459 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
252b5132 460 {
1579bae1 461 einfo ("%F:includes nested too deeply\n");
252b5132
RH
462 }
463 file_name_stack[include_stack_ptr] = name;
b47c4208 464 lineno_stack[include_stack_ptr] = lineno;
252b5132
RH
465 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
466
467 include_stack_ptr++;
b47c4208 468 lineno = 1;
252b5132 469 yyin = file;
1579bae1 470 yy_switch_to_buffer (yy_create_buffer (yyin, YY_BUF_SIZE));
252b5132
RH
471}
472
473/* Return a newly created flex input buffer containing STRING,
474 which is SIZE bytes long. */
475
1579bae1
AM
476static YY_BUFFER_STATE
477yy_create_string_buffer (const char *string, size_t size)
252b5132
RH
478{
479 YY_BUFFER_STATE b;
480
481 /* Calls to m-alloc get turned by sed into xm-alloc. */
1579bae1 482 b = malloc (sizeof (struct yy_buffer_state));
252b5132
RH
483 b->yy_input_file = 0;
484 b->yy_buf_size = size;
485
486 /* yy_ch_buf has to be 2 characters longer than the size given because
487 we need to put in 2 end-of-buffer characters. */
1579bae1 488 b->yy_ch_buf = malloc ((unsigned) (b->yy_buf_size + 3));
252b5132
RH
489
490 b->yy_ch_buf[0] = '\n';
491 strcpy (b->yy_ch_buf+1, string);
492 b->yy_ch_buf[size+1] = YY_END_OF_BUFFER_CHAR;
493 b->yy_ch_buf[size+2] = YY_END_OF_BUFFER_CHAR;
494 b->yy_n_chars = size+1;
495 b->yy_buf_pos = &b->yy_ch_buf[1];
496
dca7760f
AM
497 b->yy_is_our_buffer = 1;
498 b->yy_is_interactive = 0;
499 b->yy_at_bol = 1;
500 b->yy_fill_buffer = 0;
501
252b5132
RH
502 /* flex 2.4.7 changed the interface. FIXME: We should not be using
503 a flex internal interface in the first place! */
504#ifdef YY_BUFFER_NEW
505 b->yy_buffer_status = YY_BUFFER_NEW;
506#else
507 b->yy_eof_status = EOF_NOT_SEEN;
508#endif
509
510 return b;
511}
512
513/* Switch flex to reading from STRING, saving the current input info
514 on the include stack. */
515
516void
1579bae1 517lex_redirect (const char *string)
252b5132
RH
518{
519 YY_BUFFER_STATE tmp;
520
521 yy_init = 0;
1579bae1 522 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
252b5132
RH
523 {
524 einfo("%F: macros nested too deeply\n");
525 }
526 file_name_stack[include_stack_ptr] = "redirect";
b47c4208 527 lineno_stack[include_stack_ptr] = lineno;
252b5132
RH
528 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
529 include_stack_ptr++;
b47c4208 530 lineno = 1;
252b5132
RH
531 tmp = yy_create_string_buffer (string, strlen (string));
532 yy_switch_to_buffer (tmp);
252b5132
RH
533}
534\f
535/* Functions to switch to a different flex start condition,
536 saving the current start condition on `state_stack'. */
537
538static int state_stack[MAX_INCLUDE_DEPTH * 2];
539static int *state_stack_p = state_stack;
540
541void
1579bae1 542ldlex_script (void)
252b5132
RH
543{
544 *(state_stack_p)++ = yy_start;
545 BEGIN (SCRIPT);
546}
547
548void
1579bae1 549ldlex_mri_script (void)
252b5132
RH
550{
551 *(state_stack_p)++ = yy_start;
552 BEGIN (MRI);
553}
554
555void
1579bae1 556ldlex_version_script (void)
252b5132
RH
557{
558 *(state_stack_p)++ = yy_start;
559 BEGIN (VERS_START);
560}
561
562void
1579bae1 563ldlex_version_file (void)
252b5132
RH
564{
565 *(state_stack_p)++ = yy_start;
566 BEGIN (VERS_SCRIPT);
567}
568
569void
1579bae1 570ldlex_defsym (void)
252b5132
RH
571{
572 *(state_stack_p)++ = yy_start;
573 BEGIN (DEFSYMEXP);
574}
1579bae1 575
252b5132 576void
1579bae1 577ldlex_expression (void)
252b5132
RH
578{
579 *(state_stack_p)++ = yy_start;
580 BEGIN (EXPRESSION);
581}
582
583void
1579bae1 584ldlex_both (void)
252b5132
RH
585{
586 *(state_stack_p)++ = yy_start;
587 BEGIN (BOTH);
588}
589
590void
1579bae1 591ldlex_popstate (void)
252b5132
RH
592{
593 yy_start = *(--state_stack_p);
594}
595\f
596
597/* Place up to MAX_SIZE characters in BUF and return in *RESULT
598 either the number of characters read, or 0 to indicate EOF. */
599
600static void
1579bae1 601yy_input (char *buf, int *result, int max_size)
252b5132 602{
1579bae1 603 *result = 0;
731e28d8 604 if (YY_CURRENT_BUFFER->yy_input_file)
252b5132
RH
605 {
606 if (yyin)
607 {
1579bae1
AM
608 *result = fread (buf, 1, max_size, yyin);
609 if (*result < max_size && ferror (yyin))
252b5132
RH
610 einfo ("%F%P: read in flex scanner failed\n");
611 }
612 }
613}
614
615/* Eat the rest of a C-style comment. */
616
617static void
1579bae1 618comment (void)
252b5132
RH
619{
620 int c;
621
622 while (1)
623 {
624 c = input();
1579bae1 625 while (c != '*' && c != EOF)
252b5132
RH
626 {
627 if (c == '\n')
628 lineno++;
629 c = input();
630 }
631
632 if (c == '*')
633 {
634 c = input();
635 while (c == '*')
636 c = input();
637 if (c == '/')
638 break; /* found the end */
639 }
640
641 if (c == '\n')
642 lineno++;
643
644 if (c == EOF)
645 {
646 einfo( "%F%P: EOF in comment\n");
647 break;
648 }
649 }
650}
651
652/* Warn the user about a garbage character WHAT in the input
653 in context WHERE. */
654
655static void
1579bae1 656lex_warn_invalid (char *where, char *what)
252b5132
RH
657{
658 char buf[5];
659
660 /* If we have found an input file whose format we do not recognize,
661 and we are therefore treating it as a linker script, and we find
662 an invalid character, then most likely this is a real object file
663 of some different format. Treat it as such. */
664 if (ldfile_assumed_script)
665 {
666 bfd_set_error (bfd_error_file_not_recognized);
667 einfo ("%F%s: file not recognized: %E\n", ldfile_input_filename);
668 }
669
3882b010 670 if (! ISPRINT (*what))
252b5132
RH
671 {
672 sprintf (buf, "\\%03o", (unsigned int) *what);
673 what = buf;
674 }
675
676 einfo ("%P:%S: ignoring invalid character `%s'%s\n", what, where);
677}
This page took 0.260292 seconds and 4 git commands to generate.