Check .gnu.warning section in shared library
[deliverable/binutils-gdb.git] / ld / ldlex.l
CommitLineData
cfdf38f2
BE
1%option nounput
2
252b5132
RH
3%{
4
1eec346e 5/* Copyright 1991-2013 Free Software Foundation, Inc.
f96b4a7b 6 Written by Steve Chamberlain of Cygnus Support.
252b5132 7
f96b4a7b 8 This file is part of the GNU Binutils.
252b5132 9
f96b4a7b 10 This program is free software; you can redistribute it and/or modify
3ec57632 11 it under the terms of the GNU General Public License as published by
f96b4a7b
NC
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
252b5132 14
f96b4a7b 15 This program is distributed in the hope that it will be useful,
3ec57632
NC
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
252b5132 19
3ec57632 20 You should have received a copy of the GNU General Public License
f96b4a7b
NC
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
23 MA 02110-1301, USA. */
252b5132 24
3db64b00 25#include "bfd.h"
3882b010 26#include "safe-ctype.h"
e3e942e9 27#include "bfdlink.h"
252b5132 28#include "ld.h"
252b5132
RH
29#include "ldmisc.h"
30#include "ldexp.h"
31#include "ldlang.h"
df2a7313 32#include <ldgram.h>
252b5132
RH
33#include "ldfile.h"
34#include "ldlex.h"
35#include "ldmain.h"
d1b2b2dc 36#include "libiberty.h"
252b5132
RH
37
38/* The type of top-level parser input.
39 yylex and yyparse (indirectly) both check this. */
40input_type parser_input;
41
42/* Line number in the current input file.
43 (FIXME Actually, it doesn't appear to get reset for each file?) */
44unsigned int lineno = 1;
45
46/* The string we are currently lexing, or NULL if we are reading a
47 file. */
48const char *lex_string = NULL;
49
50/* Support for flex reading from more than one input file (stream).
51 `include_stack' is flex's input state for each open file;
52 `file_name_stack' is the file names. `lineno_stack' is the current
53 line numbers.
54
55 If `include_stack_ptr' is 0, we haven't started reading anything yet.
56 Otherwise, stack elements 0 through `include_stack_ptr - 1' are valid. */
57
58#undef YY_INPUT
d05c651b 59#define YY_INPUT(buf,result,max_size) result = yy_input (buf, max_size)
252b5132 60
5b806d27 61#ifndef YY_NO_UNPUT
297ba367 62#define YY_NO_UNPUT
5b806d27 63#endif
297ba367 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];
f4a23d42 69static unsigned int sysrooted_stack[MAX_INCLUDE_DEPTH];
252b5132
RH
70static unsigned int include_stack_ptr = 0;
71static int vers_node_nesting = 0;
72
d05c651b 73static int yy_input (char *, int);
1579bae1
AM
74static void comment (void);
75static void lex_warn_invalid (char *where, char *what);
252b5132 76
1579bae1 77/* STATES
252b5132
RH
78 EXPRESSION definitely in an expression
79 SCRIPT definitely in a script
80 BOTH either EXPRESSION or SCRIPT
81 DEFSYMEXP in an argument to -defsym
82 MRI in an MRI script
83 VERS_START starting a Sun style mapfile
84 VERS_SCRIPT a Sun style mapfile
85 VERS_NODE a node within a Sun style mapfile
86*/
87#define RTOKEN(x) { yylval.token = x; return x; }
88
89/* Some versions of flex want this. */
90#ifndef yywrap
1579bae1 91int yywrap (void) { return 1; }
252b5132
RH
92#endif
93%}
94
95%a 4000
96%o 5000
97
98CMDFILENAMECHAR [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\-\~]
99CMDFILENAMECHAR1 [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\~]
100FILENAMECHAR1 [_a-zA-Z\/\.\\\$\_\~]
101SYMBOLCHARN [_a-zA-Z\/\.\\\$\_\~0-9]
102FILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\\,\~]
107c6e11 103WILDCHAR [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\\,\~\?\*\^\!]
1579bae1 104WHITE [ \t\n\r]+
252b5132
RH
105
106NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
107
108V_TAG [.$_a-zA-Z][._a-zA-Z0-9]*
5e35cbc2 109V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
252b5132
RH
110
111%s SCRIPT
112%s EXPRESSION
113%s BOTH
114%s DEFSYMEXP
115%s MRI
116%s VERS_START
117%s VERS_SCRIPT
118%s VERS_NODE
119%%
120
121 if (parser_input != input_selected)
122 {
123 /* The first token of the input determines the initial parser state. */
124 input_type t = parser_input;
125 parser_input = input_selected;
126 switch (t)
127 {
128 case input_script: return INPUT_SCRIPT; break;
129 case input_mri_script: return INPUT_MRI_SCRIPT; break;
130 case input_version_script: return INPUT_VERSION_SCRIPT; break;
55255dae 131 case input_dynamic_list: return INPUT_DYNAMIC_LIST; break;
252b5132
RH
132 case input_defsym: return INPUT_DEFSYM; break;
133 default: abort ();
134 }
135 }
136
1579bae1 137<BOTH,SCRIPT,EXPRESSION,VERS_START,VERS_NODE,VERS_SCRIPT>"/*" { comment (); }
252b5132
RH
138
139
140<DEFSYMEXP>"-" { RTOKEN('-');}
141<DEFSYMEXP>"+" { RTOKEN('+');}
1579bae1 142<DEFSYMEXP>{FILENAMECHAR1}{SYMBOLCHARN}* { yylval.name = xstrdup (yytext); return NAME; }
252b5132
RH
143<DEFSYMEXP>"=" { RTOKEN('='); }
144
145<MRI,EXPRESSION>"$"([0-9A-Fa-f])+ {
1579bae1
AM
146 yylval.integer = bfd_scan_vma (yytext + 1, 0, 16);
147 yylval.bigint.str = NULL;
252b5132
RH
148 return INT;
149 }
150
151<MRI,EXPRESSION>([0-9A-Fa-f])+(H|h|X|x|B|b|O|o|D|d) {
152 int ibase ;
1579bae1
AM
153 switch (yytext[yyleng - 1]) {
154 case 'X':
252b5132
RH
155 case 'x':
156 case 'H':
157 case 'h':
158 ibase = 16;
159 break;
160 case 'O':
161 case 'o':
162 ibase = 8;
163 break;
164 case 'B':
165 case 'b':
166 ibase = 2;
167 break;
168 default:
169 ibase = 10;
170 }
171 yylval.integer = bfd_scan_vma (yytext, 0,
172 ibase);
1579bae1 173 yylval.bigint.str = NULL;
252b5132
RH
174 return INT;
175 }
2c382fb6 176<SCRIPT,DEFSYMEXP,MRI,BOTH,EXPRESSION>((("$"|0[xX])([0-9A-Fa-f])+)|(([0-9])+))(M|K|m|k)? {
252b5132 177 char *s = yytext;
2c382fb6 178 int ibase = 0;
252b5132
RH
179
180 if (*s == '$')
2c382fb6
AM
181 {
182 ++s;
183 ibase = 16;
184 }
185 yylval.integer = bfd_scan_vma (s, 0, ibase);
1579bae1
AM
186 yylval.bigint.str = NULL;
187 if (yytext[yyleng - 1] == 'M'
188 || yytext[yyleng - 1] == 'm')
2c382fb6
AM
189 {
190 yylval.integer *= 1024 * 1024;
191 }
1579bae1
AM
192 else if (yytext[yyleng - 1] == 'K'
193 || yytext[yyleng - 1]=='k')
2c382fb6
AM
194 {
195 yylval.integer *= 1024;
196 }
197 else if (yytext[0] == '0'
198 && (yytext[1] == 'x'
199 || yytext[1] == 'X'))
200 {
201 yylval.bigint.str = xstrdup (yytext + 2);
202 }
252b5132
RH
203 return INT;
204 }
205<BOTH,SCRIPT,EXPRESSION,MRI>"]" { RTOKEN(']');}
206<BOTH,SCRIPT,EXPRESSION,MRI>"[" { RTOKEN('[');}
207<BOTH,SCRIPT,EXPRESSION,MRI>"<<=" { RTOKEN(LSHIFTEQ);}
208<BOTH,SCRIPT,EXPRESSION,MRI>">>=" { RTOKEN(RSHIFTEQ);}
209<BOTH,SCRIPT,EXPRESSION,MRI>"||" { RTOKEN(OROR);}
210<BOTH,SCRIPT,EXPRESSION,MRI>"==" { RTOKEN(EQ);}
211<BOTH,SCRIPT,EXPRESSION,MRI>"!=" { RTOKEN(NE);}
212<BOTH,SCRIPT,EXPRESSION,MRI>">=" { RTOKEN(GE);}
213<BOTH,SCRIPT,EXPRESSION,MRI>"<=" { RTOKEN(LE);}
214<BOTH,SCRIPT,EXPRESSION,MRI>"<<" { RTOKEN(LSHIFT);}
215<BOTH,SCRIPT,EXPRESSION,MRI>">>" { RTOKEN(RSHIFT);}
216<BOTH,SCRIPT,EXPRESSION,MRI>"+=" { RTOKEN(PLUSEQ);}
217<BOTH,SCRIPT,EXPRESSION,MRI>"-=" { RTOKEN(MINUSEQ);}
218<BOTH,SCRIPT,EXPRESSION,MRI>"*=" { RTOKEN(MULTEQ);}
219<BOTH,SCRIPT,EXPRESSION,MRI>"/=" { RTOKEN(DIVEQ);}
220<BOTH,SCRIPT,EXPRESSION,MRI>"&=" { RTOKEN(ANDEQ);}
221<BOTH,SCRIPT,EXPRESSION,MRI>"|=" { RTOKEN(OREQ);}
222<BOTH,SCRIPT,EXPRESSION,MRI>"&&" { RTOKEN(ANDAND);}
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('%');}
235<BOTH,SCRIPT,EXPRESSION,MRI>"<" { RTOKEN('<');}
3ec57632
NC
236<BOTH,SCRIPT,EXPRESSION,MRI>"=" { RTOKEN('=');}
237<BOTH,SCRIPT,EXPRESSION,MRI>"}" { RTOKEN('}') ; }
238<BOTH,SCRIPT,EXPRESSION,MRI>"{" { RTOKEN('{'); }
239<BOTH,SCRIPT,EXPRESSION,MRI>")" { RTOKEN(')');}
240<BOTH,SCRIPT,EXPRESSION,MRI>"(" { RTOKEN('(');}
252b5132
RH
241<BOTH,SCRIPT,EXPRESSION,MRI>":" { RTOKEN(':'); }
242<BOTH,SCRIPT,EXPRESSION,MRI>";" { RTOKEN(';');}
3ec57632 243<BOTH,SCRIPT>"MEMORY" { RTOKEN(MEMORY);}
4a93e180 244<BOTH,SCRIPT>"REGION_ALIAS" { RTOKEN(REGION_ALIAS);}
01554a74 245<BOTH,SCRIPT>"LD_FEATURE" { RTOKEN(LD_FEATURE);}
3ec57632
NC
246<BOTH,SCRIPT,EXPRESSION>"ORIGIN" { RTOKEN(ORIGIN);}
247<BOTH,SCRIPT>"VERSION" { RTOKEN(VERSIONK);}
252b5132
RH
248<EXPRESSION,BOTH,SCRIPT>"BLOCK" { RTOKEN(BLOCK);}
249<EXPRESSION,BOTH,SCRIPT>"BIND" { RTOKEN(BIND);}
3ec57632
NC
250<BOTH,SCRIPT,EXPRESSION>"LENGTH" { RTOKEN(LENGTH);}
251<EXPRESSION,BOTH,SCRIPT>"ALIGN" { RTOKEN(ALIGN_K);}
2d20f7bf 252<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_ALIGN" { RTOKEN(DATA_SEGMENT_ALIGN);}
8c37241b 253<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_RELRO_END" { RTOKEN(DATA_SEGMENT_RELRO_END);}
2d20f7bf 254<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_END" { RTOKEN(DATA_SEGMENT_END);}
3ec57632
NC
255<EXPRESSION,BOTH,SCRIPT>"ADDR" { RTOKEN(ADDR);}
256<EXPRESSION,BOTH,SCRIPT>"LOADADDR" { RTOKEN(LOADADDR);}
362c1d1a 257<EXPRESSION,BOTH,SCRIPT>"ALIGNOF" { RTOKEN(ALIGNOF); }
252b5132
RH
258<EXPRESSION,BOTH>"MAX" { RTOKEN(MAX_K); }
259<EXPRESSION,BOTH>"MIN" { RTOKEN(MIN_K); }
8545d1a9 260<EXPRESSION,BOTH,SCRIPT>"ASSERT" { RTOKEN(ASSERT_K); }
252b5132
RH
261<BOTH,SCRIPT>"ENTRY" { RTOKEN(ENTRY);}
262<BOTH,SCRIPT,MRI>"EXTERN" { RTOKEN(EXTERN);}
3ec57632 263<EXPRESSION,BOTH,SCRIPT>"NEXT" { RTOKEN(NEXT);}
252b5132
RH
264<EXPRESSION,BOTH,SCRIPT>"sizeof_headers" { RTOKEN(SIZEOF_HEADERS);}
265<EXPRESSION,BOTH,SCRIPT>"SIZEOF_HEADERS" { RTOKEN(SIZEOF_HEADERS);}
ba916c8a 266<EXPRESSION,BOTH,SCRIPT>"SEGMENT_START" { RTOKEN(SEGMENT_START);}
252b5132 267<BOTH,SCRIPT>"MAP" { RTOKEN(MAP);}
3ec57632
NC
268<EXPRESSION,BOTH,SCRIPT>"SIZEOF" { RTOKEN(SIZEOF);}
269<BOTH,SCRIPT>"TARGET" { RTOKEN(TARGET_K);}
252b5132 270<BOTH,SCRIPT>"SEARCH_DIR" { RTOKEN(SEARCH_DIR);}
3ec57632 271<BOTH,SCRIPT>"OUTPUT" { RTOKEN(OUTPUT);}
252b5132
RH
272<BOTH,SCRIPT>"INPUT" { RTOKEN(INPUT);}
273<EXPRESSION,BOTH,SCRIPT>"GROUP" { RTOKEN(GROUP);}
b717d30e 274<EXPRESSION,BOTH,SCRIPT>"AS_NEEDED" { RTOKEN(AS_NEEDED);}
3ec57632 275<EXPRESSION,BOTH,SCRIPT>"DEFINED" { RTOKEN(DEFINED);}
252b5132
RH
276<BOTH,SCRIPT>"CREATE_OBJECT_SYMBOLS" { RTOKEN(CREATE_OBJECT_SYMBOLS);}
277<BOTH,SCRIPT>"CONSTRUCTORS" { RTOKEN( CONSTRUCTORS);}
3ec57632 278<BOTH,SCRIPT>"FORCE_COMMON_ALLOCATION" { RTOKEN(FORCE_COMMON_ALLOCATION);}
4818e05f 279<BOTH,SCRIPT>"INHIBIT_COMMON_ALLOCATION" { RTOKEN(INHIBIT_COMMON_ALLOCATION);}
3ec57632 280<BOTH,SCRIPT>"SECTIONS" { RTOKEN(SECTIONS);}
53d25da6
AM
281<BOTH,SCRIPT>"INSERT" { RTOKEN(INSERT_K);}
282<BOTH,SCRIPT>"AFTER" { RTOKEN(AFTER);}
283<BOTH,SCRIPT>"BEFORE" { RTOKEN(BEFORE);}
252b5132 284<BOTH,SCRIPT>"FILL" { RTOKEN(FILL);}
3ec57632 285<BOTH,SCRIPT>"STARTUP" { RTOKEN(STARTUP);}
252b5132
RH
286<BOTH,SCRIPT>"OUTPUT_FORMAT" { RTOKEN(OUTPUT_FORMAT);}
287<BOTH,SCRIPT>"OUTPUT_ARCH" { RTOKEN( OUTPUT_ARCH);}
288<BOTH,SCRIPT>"HLL" { RTOKEN(HLL);}
3ec57632 289<BOTH,SCRIPT>"SYSLIB" { RTOKEN(SYSLIB);}
252b5132
RH
290<BOTH,SCRIPT>"FLOAT" { RTOKEN(FLOAT);}
291<BOTH,SCRIPT>"QUAD" { RTOKEN( QUAD);}
292<BOTH,SCRIPT>"SQUAD" { RTOKEN( SQUAD);}
293<BOTH,SCRIPT>"LONG" { RTOKEN( LONG);}
294<BOTH,SCRIPT>"SHORT" { RTOKEN( SHORT);}
295<BOTH,SCRIPT>"BYTE" { RTOKEN( BYTE);}
3ec57632 296<BOTH,SCRIPT>"NOFLOAT" { RTOKEN(NOFLOAT);}
252b5132
RH
297<EXPRESSION,BOTH,SCRIPT>"NOCROSSREFS" { RTOKEN(NOCROSSREFS);}
298<BOTH,SCRIPT>"OVERLAY" { RTOKEN(OVERLAY); }
bcaa7b3e
L
299<BOTH,SCRIPT>"SORT_BY_NAME" { RTOKEN(SORT_BY_NAME); }
300<BOTH,SCRIPT>"SORT_BY_ALIGNMENT" { RTOKEN(SORT_BY_ALIGNMENT); }
301<BOTH,SCRIPT>"SORT" { RTOKEN(SORT_BY_NAME); }
02ecc8e9 302<BOTH,SCRIPT>"SORT_BY_INIT_PRIORITY" { RTOKEN(SORT_BY_INIT_PRIORITY); }
eda680f8 303<BOTH,SCRIPT>"SORT_NONE" { RTOKEN(SORT_NONE); }
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);}
ae17ab41 316<EXPRESSION,BOTH,SCRIPT>"INPUT_SECTION_FLAGS" { RTOKEN(INPUT_SECTION_FLAGS); }
4006703d 317<EXPRESSION,BOTH,SCRIPT>"INCLUDE" { RTOKEN(INCLUDE);}
252b5132 318<BOTH,SCRIPT>"PHDRS" { RTOKEN (PHDRS); }
3ec57632 319<EXPRESSION,BOTH,SCRIPT>"AT" { RTOKEN(AT);}
1eec346e 320<EXPRESSION,BOTH,SCRIPT>"ALIGN_WITH_INPUT" { RTOKEN(ALIGN_WITH_INPUT);}
3ec57632 321<EXPRESSION,BOTH,SCRIPT>"SUBALIGN" { RTOKEN(SUBALIGN);}
eb8476a6 322<EXPRESSION,BOTH,SCRIPT>"HIDDEN" { RTOKEN(HIDDEN); }
3ec57632 323<EXPRESSION,BOTH,SCRIPT>"PROVIDE" { RTOKEN(PROVIDE); }
7af8e998 324<EXPRESSION,BOTH,SCRIPT>"PROVIDE_HIDDEN" { RTOKEN(PROVIDE_HIDDEN); }
252b5132 325<EXPRESSION,BOTH,SCRIPT>"KEEP" { RTOKEN(KEEP); }
3ec57632 326<EXPRESSION,BOTH,SCRIPT>"EXCLUDE_FILE" { RTOKEN(EXCLUDE_FILE); }
24718e3b 327<EXPRESSION,BOTH,SCRIPT>"CONSTANT" { RTOKEN(CONSTANT);}
252b5132
RH
328<MRI>"#".*\n? { ++ lineno; }
329<MRI>"\n" { ++ lineno; RTOKEN(NEWLINE); }
330<MRI>"*".* { /* Mri comment line */ }
331<MRI>";".* { /* Mri comment line */ }
332<MRI>"END" { RTOKEN(ENDWORD); }
3ec57632
NC
333<MRI>"ALIGNMOD" { RTOKEN(ALIGNMOD);}
334<MRI>"ALIGN" { RTOKEN(ALIGN_K);}
252b5132
RH
335<MRI>"CHIP" { RTOKEN(CHIP); }
336<MRI>"BASE" { RTOKEN(BASE); }
3ec57632
NC
337<MRI>"ALIAS" { RTOKEN(ALIAS); }
338<MRI>"TRUNCATE" { RTOKEN(TRUNCATE); }
252b5132
RH
339<MRI>"LOAD" { RTOKEN(LOAD); }
340<MRI>"PUBLIC" { RTOKEN(PUBLIC); }
341<MRI>"ORDER" { RTOKEN(ORDER); }
342<MRI>"NAME" { RTOKEN(NAMEWORD); }
343<MRI>"FORMAT" { RTOKEN(FORMAT); }
344<MRI>"CASE" { RTOKEN(CASE); }
345<MRI>"START" { RTOKEN(START); }
346<MRI>"LIST".* { RTOKEN(LIST); /* LIST and ignore to end of line */ }
347<MRI>"SECT" { RTOKEN(SECT); }
348<EXPRESSION,BOTH,SCRIPT,MRI>"ABSOLUTE" { RTOKEN(ABSOLUTE); }
349<MRI>"end" { RTOKEN(ENDWORD); }
3ec57632
NC
350<MRI>"alignmod" { RTOKEN(ALIGNMOD);}
351<MRI>"align" { RTOKEN(ALIGN_K);}
252b5132
RH
352<MRI>"chip" { RTOKEN(CHIP); }
353<MRI>"base" { RTOKEN(BASE); }
3ec57632
NC
354<MRI>"alias" { RTOKEN(ALIAS); }
355<MRI>"truncate" { RTOKEN(TRUNCATE); }
252b5132
RH
356<MRI>"load" { RTOKEN(LOAD); }
357<MRI>"public" { RTOKEN(PUBLIC); }
358<MRI>"order" { RTOKEN(ORDER); }
359<MRI>"name" { RTOKEN(NAMEWORD); }
360<MRI>"format" { RTOKEN(FORMAT); }
361<MRI>"case" { RTOKEN(CASE); }
362<MRI>"extern" { RTOKEN(EXTERN); }
363<MRI>"start" { RTOKEN(START); }
364<MRI>"list".* { RTOKEN(LIST); /* LIST and ignore to end of line */ }
365<MRI>"sect" { RTOKEN(SECT); }
366<EXPRESSION,BOTH,SCRIPT,MRI>"absolute" { RTOKEN(ABSOLUTE); }
367
368<MRI>{FILENAMECHAR1}{NOCFILENAMECHAR}* {
369/* Filename without commas, needed to parse mri stuff */
1579bae1 370 yylval.name = xstrdup (yytext);
252b5132
RH
371 return NAME;
372 }
373
374
8545d1a9 375<BOTH>{FILENAMECHAR1}{FILENAMECHAR}* {
1579bae1 376 yylval.name = xstrdup (yytext);
252b5132
RH
377 return NAME;
378 }
8545d1a9
NS
379<BOTH>"-l"{FILENAMECHAR}+ {
380 yylval.name = xstrdup (yytext + 2);
381 return LNAME;
382 }
383<EXPRESSION>{FILENAMECHAR1}{NOCFILENAMECHAR}* {
384 yylval.name = xstrdup (yytext);
385 return NAME;
386 }
387<EXPRESSION>"-l"{NOCFILENAMECHAR}+ {
d1b2b2dc 388 yylval.name = xstrdup (yytext + 2);
252b5132
RH
389 return LNAME;
390 }
391<SCRIPT>{WILDCHAR}* {
392 /* Annoyingly, this pattern can match comments, and we have
393 longest match issues to consider. So if the first two
394 characters are a comment opening, put the input back and
395 try again. */
396 if (yytext[0] == '/' && yytext[1] == '*')
397 {
1579bae1 398 yyless (2);
252b5132
RH
399 comment ();
400 }
401 else
402 {
1579bae1 403 yylval.name = xstrdup (yytext);
252b5132
RH
404 return NAME;
405 }
406 }
407
408<EXPRESSION,BOTH,SCRIPT,VERS_NODE>"\""[^\"]*"\"" {
409 /* No matter the state, quotes
410 give what's inside */
1579bae1
AM
411 yylval.name = xstrdup (yytext + 1);
412 yylval.name[yyleng - 2] = 0;
252b5132
RH
413 return NAME;
414 }
415<BOTH,SCRIPT,EXPRESSION>"\n" { lineno++;}
416<MRI,BOTH,SCRIPT,EXPRESSION>[ \t\r]+ { }
417
418<VERS_NODE,VERS_SCRIPT>[:,;] { return *yytext; }
419
420<VERS_NODE>global { RTOKEN(GLOBAL); }
421
422<VERS_NODE>local { RTOKEN(LOCAL); }
423
424<VERS_NODE>extern { RTOKEN(EXTERN); }
425
d1b2b2dc 426<VERS_NODE>{V_IDENTIFIER} { yylval.name = xstrdup (yytext);
252b5132
RH
427 return VERS_IDENTIFIER; }
428
d1b2b2dc 429<VERS_SCRIPT>{V_TAG} { yylval.name = xstrdup (yytext);
252b5132
RH
430 return VERS_TAG; }
431
432<VERS_START>"{" { BEGIN(VERS_SCRIPT); return *yytext; }
433
1579bae1 434<VERS_SCRIPT>"{" { BEGIN(VERS_NODE);
252b5132
RH
435 vers_node_nesting = 0;
436 return *yytext;
437 }
438<VERS_SCRIPT>"}" { return *yytext; }
439<VERS_NODE>"{" { vers_node_nesting++; return *yytext; }
440<VERS_NODE>"}" { if (--vers_node_nesting < 0)
441 BEGIN(VERS_SCRIPT);
442 return *yytext;
443 }
444
445<VERS_START,VERS_NODE,VERS_SCRIPT>[\n] { lineno++; }
446
447<VERS_START,VERS_NODE,VERS_SCRIPT>#.* { /* Eat up comments */ }
448
449<VERS_START,VERS_NODE,VERS_SCRIPT>[ \t\r]+ { /* Eat up whitespace */ }
450
451<<EOF>> {
452 include_stack_ptr--;
1579bae1 453 if (include_stack_ptr == 0)
1579bae1 454 yyterminate ();
1579bae1 455 else
1579bae1 456 yy_switch_to_buffer (include_stack[include_stack_ptr]);
b47c4208 457
b47c4208 458 lineno = lineno_stack[include_stack_ptr];
f4a23d42 459 input_flags.sysrooted = sysrooted_stack[include_stack_ptr];
252b5132
RH
460
461 return END;
462}
463
1579bae1
AM
464<SCRIPT,MRI,VERS_START,VERS_SCRIPT,VERS_NODE>. lex_warn_invalid (" in script", yytext);
465<EXPRESSION,DEFSYMEXP,BOTH>. lex_warn_invalid (" in expression", yytext);
466
252b5132
RH
467%%
468\f
469
470/* Switch flex to reading script file NAME, open on FILE,
471 saving the current input info on the include stack. */
472
473void
f4a23d42 474lex_push_file (FILE *file, const char *name, unsigned int sysrooted)
252b5132 475{
1579bae1 476 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
252b5132 477 {
1579bae1 478 einfo ("%F:includes nested too deeply\n");
252b5132
RH
479 }
480 file_name_stack[include_stack_ptr] = name;
b47c4208 481 lineno_stack[include_stack_ptr] = lineno;
f4a23d42 482 sysrooted_stack[include_stack_ptr] = input_flags.sysrooted;
252b5132
RH
483 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
484
485 include_stack_ptr++;
b47c4208 486 lineno = 1;
f4a23d42 487 input_flags.sysrooted = sysrooted;
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
dab69f68 536lex_redirect (const char *string, const char *fake_filename, unsigned int count)
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 }
dab69f68 545 file_name_stack[include_stack_ptr] = fake_filename;
b47c4208 546 lineno_stack[include_stack_ptr] = lineno;
252b5132
RH
547 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
548 include_stack_ptr++;
dab69f68 549 lineno = count;
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}
dab69f68
AM
614
615/* Return the current file name, or the previous file if no file is
616 current. */
617
618const char*
619ldlex_filename (void)
620{
621 return file_name_stack[include_stack_ptr - (include_stack_ptr != 0)];
622}
252b5132
RH
623\f
624
d05c651b 625/* Place up to MAX_SIZE characters in BUF and return
252b5132
RH
626 either the number of characters read, or 0 to indicate EOF. */
627
d05c651b
AS
628static int
629yy_input (char *buf, int max_size)
252b5132 630{
d05c651b 631 int result = 0;
731e28d8 632 if (YY_CURRENT_BUFFER->yy_input_file)
252b5132
RH
633 {
634 if (yyin)
635 {
d05c651b
AS
636 result = fread (buf, 1, max_size, yyin);
637 if (result < max_size && ferror (yyin))
252b5132
RH
638 einfo ("%F%P: read in flex scanner failed\n");
639 }
640 }
d05c651b 641 return result;
252b5132
RH
642}
643
644/* Eat the rest of a C-style comment. */
645
646static void
1579bae1 647comment (void)
252b5132
RH
648{
649 int c;
650
651 while (1)
652 {
653 c = input();
1579bae1 654 while (c != '*' && c != EOF)
252b5132
RH
655 {
656 if (c == '\n')
657 lineno++;
658 c = input();
659 }
660
661 if (c == '*')
662 {
663 c = input();
664 while (c == '*')
665 c = input();
666 if (c == '/')
667 break; /* found the end */
668 }
669
670 if (c == '\n')
671 lineno++;
672
673 if (c == EOF)
674 {
675 einfo( "%F%P: EOF in comment\n");
676 break;
677 }
678 }
679}
680
681/* Warn the user about a garbage character WHAT in the input
682 in context WHERE. */
683
684static void
1579bae1 685lex_warn_invalid (char *where, char *what)
252b5132
RH
686{
687 char buf[5];
688
689 /* If we have found an input file whose format we do not recognize,
690 and we are therefore treating it as a linker script, and we find
691 an invalid character, then most likely this is a real object file
692 of some different format. Treat it as such. */
693 if (ldfile_assumed_script)
694 {
695 bfd_set_error (bfd_error_file_not_recognized);
dab69f68 696 einfo ("%F%s: file not recognized: %E\n", ldlex_filename ());
252b5132
RH
697 }
698
3882b010 699 if (! ISPRINT (*what))
252b5132 700 {
c3a7b120 701 sprintf (buf, "\\%03o", *(unsigned char *) what);
252b5132
RH
702 what = buf;
703 }
704
dab69f68 705 einfo ("%P:%S: ignoring invalid character `%s'%s\n", NULL, what, where);
252b5132 706}
This page took 0.619591 seconds and 4 git commands to generate.