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