* ieee.c (parse_ieee_ty): Add support for undocumented 'v' type.
[deliverable/binutils-gdb.git] / ld / ldgram.y
CommitLineData
8e5a525c
AM
1/* A YACC grammar to parse a superset of the AT&T linker scripting language.
2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3db64b00 3 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
252b5132
RH
4 Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com).
5
f96b4a7b 6 This file is part of the GNU Binutils.
252b5132 7
3ec57632
NC
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
f96b4a7b 10 the Free Software Foundation; either version 3 of the License, or
3ec57632 11 (at your option) any later version.
252b5132 12
3ec57632
NC
13 This program 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 this program; if not, write to the Free Software
f96b4a7b
NC
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
252b5132
RH
22
23%{
24/*
25
26 */
27
28#define DONTDECLARE_MALLOC
29
252b5132 30#include "sysdep.h"
3db64b00 31#include "bfd.h"
252b5132 32#include "bfdlink.h"
d038301c 33#include "ld.h"
252b5132
RH
34#include "ldexp.h"
35#include "ldver.h"
36#include "ldlang.h"
252b5132 37#include "ldfile.h"
b71e2778 38#include "ldemul.h"
252b5132
RH
39#include "ldmisc.h"
40#include "ldmain.h"
41#include "mri.h"
42#include "ldctor.h"
43#include "ldlex.h"
44
45#ifndef YYDEBUG
46#define YYDEBUG 1
47#endif
48
49static enum section_type sectype;
279e75dc 50static lang_memory_region_type *region;
252b5132 51
b34976b6 52bfd_boolean ldgram_had_keep = FALSE;
252b5132
RH
53char *ldgram_vers_current_lang = NULL;
54
55#define ERROR_NAME_MAX 20
56static char *error_names[ERROR_NAME_MAX];
57static int error_index;
58#define PUSH_ERROR(x) if (error_index < ERROR_NAME_MAX) error_names[error_index] = x; error_index++;
59#define POP_ERROR() error_index--;
60%}
61%union {
62 bfd_vma integer;
2c382fb6
AM
63 struct big_int
64 {
65 bfd_vma integer;
66 char *str;
67 } bigint;
68 fill_type *fill;
252b5132
RH
69 char *name;
70 const char *cname;
71 struct wildcard_spec wildcard;
b6bf44ba 72 struct wildcard_list *wildcard_list;
18625d54 73 struct name_list *name_list;
252b5132
RH
74 int token;
75 union etree_union *etree;
76 struct phdr_info
77 {
b34976b6
AM
78 bfd_boolean filehdr;
79 bfd_boolean phdrs;
252b5132
RH
80 union etree_union *at;
81 union etree_union *flags;
82 } phdr;
83 struct lang_nocrossref *nocrossref;
84 struct lang_output_section_phdr_list *section_phdr;
85 struct bfd_elf_version_deps *deflist;
86 struct bfd_elf_version_expr *versyms;
87 struct bfd_elf_version_tree *versnode;
88}
89
90%type <etree> exp opt_exp_with_type mustbe_exp opt_at phdr_type phdr_val
bbf115d3 91%type <etree> opt_exp_without_type opt_subalign opt_align
2c382fb6 92%type <fill> fill_opt fill_exp
18625d54 93%type <name_list> exclude_name_list
b6bf44ba 94%type <wildcard_list> file_NAME_list
252b5132 95%type <name> memspec_opt casesymlist
562d3460 96%type <name> memspec_at_opt
252b5132
RH
97%type <cname> wildcard_name
98%type <wildcard> wildcard_spec
d038301c 99%token <bigint> INT
252b5132
RH
100%token <name> NAME LNAME
101%type <integer> length
102%type <phdr> phdr_qualifiers
103%type <nocrossref> nocrossref_list
104%type <section_phdr> phdr_opt
105%type <integer> opt_nocrossrefs
106
d038301c 107%right <token> PLUSEQ MINUSEQ MULTEQ DIVEQ '=' LSHIFTEQ RSHIFTEQ ANDEQ OREQ
252b5132
RH
108%right <token> '?' ':'
109%left <token> OROR
110%left <token> ANDAND
111%left <token> '|'
112%left <token> '^'
113%left <token> '&'
114%left <token> EQ NE
115%left <token> '<' '>' LE GE
116%left <token> LSHIFT RSHIFT
117
118%left <token> '+' '-'
119%left <token> '*' '/' '%'
120
121%right UNARY
d038301c 122%token END
252b5132
RH
123%left <token> '('
124%token <token> ALIGN_K BLOCK BIND QUAD SQUAD LONG SHORT BYTE
53d25da6
AM
125%token SECTIONS PHDRS INSERT_K AFTER BEFORE
126%token DATA_SEGMENT_ALIGN DATA_SEGMENT_RELRO_END DATA_SEGMENT_END
bcaa7b3e 127%token SORT_BY_NAME SORT_BY_ALIGNMENT
252b5132
RH
128%token '{' '}'
129%token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH
4818e05f 130%token INHIBIT_COMMON_ALLOCATION
ba916c8a 131%token SEGMENT_START
252b5132 132%token INCLUDE
ed9ef263 133%token MEMORY
252b5132 134%token NOLOAD DSECT COPY INFO OVERLAY
ed9ef263 135%token DEFINED TARGET_K SEARCH_DIR MAP ENTRY
252b5132 136%token <integer> NEXT
5d41b3ef 137%token SIZEOF ALIGNOF ADDR LOADADDR MAX_K MIN_K
252b5132
RH
138%token STARTUP HLL SYSLIB FLOAT NOFLOAT NOCROSSREFS
139%token ORIGIN FILL
140%token LENGTH CREATE_OBJECT_SYMBOLS INPUT GROUP OUTPUT CONSTRUCTORS
7af8e998 141%token ALIGNMOD AT SUBALIGN PROVIDE PROVIDE_HIDDEN AS_NEEDED
0841712e 142%type <token> assign_op atype attributes_opt sect_constraint
252b5132
RH
143%type <name> filename
144%token CHIP LIST SECT ABSOLUTE LOAD NEWLINE ENDWORD ORDER NAMEWORD ASSERT_K
145%token FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE REL
146%token INPUT_SCRIPT INPUT_MRI_SCRIPT INPUT_DEFSYM CASE EXTERN START
147%token <name> VERS_TAG VERS_IDENTIFIER
148%token GLOBAL LOCAL VERSIONK INPUT_VERSION_SCRIPT
0cf7d72c 149%token KEEP ONLY_IF_RO ONLY_IF_RW SPECIAL
252b5132 150%token EXCLUDE_FILE
24718e3b 151%token CONSTANT
252b5132
RH
152%type <versyms> vers_defns
153%type <versnode> vers_tag
154%type <deflist> verdep
55255dae 155%token INPUT_DYNAMIC_LIST
252b5132
RH
156
157%%
158
d038301c 159file:
252b5132
RH
160 INPUT_SCRIPT script_file
161 | INPUT_MRI_SCRIPT mri_script_file
162 | INPUT_VERSION_SCRIPT version_script_file
55255dae 163 | INPUT_DYNAMIC_LIST dynamic_list_file
252b5132
RH
164 | INPUT_DEFSYM defsym_expr
165 ;
166
167
168filename: NAME;
169
170
171defsym_expr:
172 { ldlex_defsym(); }
173 NAME '=' exp
174 {
175 ldlex_popstate();
176 lang_add_assignment(exp_assop($3,$2,$4));
177 }
944cd72c 178 ;
252b5132 179
d038301c 180/* SYNTAX WITHIN AN MRI SCRIPT FILE */
252b5132
RH
181mri_script_file:
182 {
183 ldlex_mri_script ();
184 PUSH_ERROR (_("MRI style script"));
185 }
186 mri_script_lines
187 {
188 ldlex_popstate ();
189 mri_draw_tree ();
190 POP_ERROR ();
191 }
192 ;
193
194mri_script_lines:
195 mri_script_lines mri_script_command NEWLINE
196 |
197 ;
198
199mri_script_command:
d038301c 200 CHIP exp
252b5132
RH
201 | CHIP exp ',' exp
202 | NAME {
203 einfo(_("%P%F: unrecognised keyword in MRI style script '%s'\n"),$1);
204 }
205 | LIST {
206 config.map_filename = "-";
207 }
208 | ORDER ordernamelist
d038301c 209 | ENDWORD
252b5132
RH
210 | PUBLIC NAME '=' exp
211 { mri_public($2, $4); }
212 | PUBLIC NAME ',' exp
213 { mri_public($2, $4); }
d038301c 214 | PUBLIC NAME exp
252b5132
RH
215 { mri_public($2, $3); }
216 | FORMAT NAME
217 { mri_format($2); }
218 | SECT NAME ',' exp
219 { mri_output_section($2, $4);}
220 | SECT NAME exp
221 { mri_output_section($2, $3);}
222 | SECT NAME '=' exp
223 { mri_output_section($2, $4);}
224 | ALIGN_K NAME '=' exp
225 { mri_align($2,$4); }
226 | ALIGN_K NAME ',' exp
227 { mri_align($2,$4); }
228 | ALIGNMOD NAME '=' exp
229 { mri_alignmod($2,$4); }
230 | ALIGNMOD NAME ',' exp
231 { mri_alignmod($2,$4); }
232 | ABSOLUTE mri_abs_name_list
233 | LOAD mri_load_name_list
d038301c
RM
234 | NAMEWORD NAME
235 { mri_name($2); }
252b5132
RH
236 | ALIAS NAME ',' NAME
237 { mri_alias($2,$4,0);}
238 | ALIAS NAME ',' INT
2c382fb6 239 { mri_alias ($2, 0, (int) $4.integer); }
252b5132
RH
240 | BASE exp
241 { mri_base($2); }
2c382fb6
AM
242 | TRUNCATE INT
243 { mri_truncate ((unsigned int) $2.integer); }
252b5132
RH
244 | CASE casesymlist
245 | EXTERN extern_name_list
246 | INCLUDE filename
b47c4208
AM
247 { ldlex_script (); ldfile_open_command_file($2); }
248 mri_script_lines END
249 { ldlex_popstate (); }
252b5132 250 | START NAME
b34976b6 251 { lang_add_entry ($2, FALSE); }
252b5132
RH
252 |
253 ;
254
255ordernamelist:
256 ordernamelist ',' NAME { mri_order($3); }
257 | ordernamelist NAME { mri_order($2); }
258 |
259 ;
260
261mri_load_name_list:
262 NAME
263 { mri_load($1); }
264 | mri_load_name_list ',' NAME { mri_load($3); }
265 ;
266
267mri_abs_name_list:
268 NAME
269 { mri_only_load($1); }
270 | mri_abs_name_list ',' NAME
271 { mri_only_load($3); }
272 ;
273
274casesymlist:
275 /* empty */ { $$ = NULL; }
276 | NAME
277 | casesymlist ',' NAME
278 ;
279
8545d1a9 280/* Parsed as expressions so that commas separate entries */
252b5132 281extern_name_list:
8545d1a9
NS
282 { ldlex_expression (); }
283 extern_name_list_body
284 { ldlex_popstate (); }
285
286extern_name_list_body:
252b5132
RH
287 NAME
288 { ldlang_add_undef ($1); }
8545d1a9 289 | extern_name_list_body NAME
252b5132 290 { ldlang_add_undef ($2); }
8545d1a9 291 | extern_name_list_body ',' NAME
252b5132
RH
292 { ldlang_add_undef ($3); }
293 ;
294
295script_file:
8545d1a9
NS
296 { ldlex_both(); }
297 ifile_list
298 { ldlex_popstate(); }
252b5132
RH
299 ;
300
252b5132 301ifile_list:
8545d1a9 302 ifile_list ifile_p1
252b5132
RH
303 |
304 ;
305
306
252b5132
RH
307ifile_p1:
308 memory
309 | sections
310 | phdrs
311 | startup
312 | high_level_library
313 | low_level_library
314 | floating_point_support
315 | statement_anywhere
316 | version
317 | ';'
318 | TARGET_K '(' NAME ')'
319 { lang_add_target($3); }
320 | SEARCH_DIR '(' filename ')'
b34976b6 321 { ldfile_add_library_path ($3, FALSE); }
252b5132
RH
322 | OUTPUT '(' filename ')'
323 { lang_add_output($3, 1); }
324 | OUTPUT_FORMAT '(' NAME ')'
325 { lang_add_output_format ($3, (char *) NULL,
326 (char *) NULL, 1); }
327 | OUTPUT_FORMAT '(' NAME ',' NAME ',' NAME ')'
328 { lang_add_output_format ($3, $5, $7, 1); }
329 | OUTPUT_ARCH '(' NAME ')'
5e2f1575 330 { ldfile_set_output_arch ($3, bfd_arch_unknown); }
252b5132 331 | FORCE_COMMON_ALLOCATION
b34976b6 332 { command_line.force_common_definition = TRUE ; }
4818e05f 333 | INHIBIT_COMMON_ALLOCATION
b34976b6 334 { command_line.inhibit_common_definition = TRUE ; }
252b5132
RH
335 | INPUT '(' input_list ')'
336 | GROUP
337 { lang_enter_group (); }
338 '(' input_list ')'
339 { lang_leave_group (); }
340 | MAP '(' filename ')'
341 { lang_add_map($3); }
d038301c 342 | INCLUDE filename
b47c4208
AM
343 { ldlex_script (); ldfile_open_command_file($2); }
344 ifile_list END
345 { ldlex_popstate (); }
252b5132
RH
346 | NOCROSSREFS '(' nocrossref_list ')'
347 {
348 lang_add_nocrossref ($3);
349 }
350 | EXTERN '(' extern_name_list ')'
53d25da6
AM
351 | INSERT_K AFTER NAME
352 { lang_add_insert ($3, 0); }
353 | INSERT_K BEFORE NAME
354 { lang_add_insert ($3, 1); }
252b5132
RH
355 ;
356
357input_list:
358 NAME
359 { lang_add_input_file($1,lang_input_file_is_search_file_enum,
360 (char *)NULL); }
361 | input_list ',' NAME
362 { lang_add_input_file($3,lang_input_file_is_search_file_enum,
363 (char *)NULL); }
364 | input_list NAME
365 { lang_add_input_file($2,lang_input_file_is_search_file_enum,
366 (char *)NULL); }
367 | LNAME
368 { lang_add_input_file($1,lang_input_file_is_l_enum,
369 (char *)NULL); }
370 | input_list ',' LNAME
371 { lang_add_input_file($3,lang_input_file_is_l_enum,
372 (char *)NULL); }
373 | input_list LNAME
374 { lang_add_input_file($2,lang_input_file_is_l_enum,
375 (char *)NULL); }
b717d30e
JJ
376 | AS_NEEDED '('
377 { $<integer>$ = as_needed; as_needed = TRUE; }
378 input_list ')'
379 { as_needed = $<integer>3; }
380 | input_list ',' AS_NEEDED '('
381 { $<integer>$ = as_needed; as_needed = TRUE; }
382 input_list ')'
383 { as_needed = $<integer>5; }
384 | input_list AS_NEEDED '('
385 { $<integer>$ = as_needed; as_needed = TRUE; }
386 input_list ')'
387 { as_needed = $<integer>4; }
252b5132
RH
388 ;
389
390sections:
391 SECTIONS '{' sec_or_group_p1 '}'
392 ;
393
394sec_or_group_p1:
395 sec_or_group_p1 section
396 | sec_or_group_p1 statement_anywhere
397 |
398 ;
399
400statement_anywhere:
401 ENTRY '(' NAME ')'
b34976b6 402 { lang_add_entry ($3, FALSE); }
252b5132 403 | assignment end
b6ca8815
NS
404 | ASSERT_K {ldlex_expression ();} '(' exp ',' NAME ')'
405 { ldlex_popstate ();
406 lang_add_assignment (exp_assert ($4, $6)); }
252b5132
RH
407 ;
408
409/* The '*' and '?' cases are there because the lexer returns them as
410 separate tokens rather than as NAME. */
411wildcard_name:
412 NAME
413 {
414 $$ = $1;
415 }
416 | '*'
417 {
418 $$ = "*";
419 }
420 | '?'
421 {
422 $$ = "?";
423 }
424 ;
425
426wildcard_spec:
427 wildcard_name
428 {
429 $$.name = $1;
bcaa7b3e 430 $$.sorted = none;
18625d54 431 $$.exclude_name_list = NULL;
252b5132 432 }
18625d54 433 | EXCLUDE_FILE '(' exclude_name_list ')' wildcard_name
252b5132
RH
434 {
435 $$.name = $5;
bcaa7b3e 436 $$.sorted = none;
18625d54 437 $$.exclude_name_list = $3;
252b5132 438 }
bcaa7b3e 439 | SORT_BY_NAME '(' wildcard_name ')'
252b5132
RH
440 {
441 $$.name = $3;
bcaa7b3e 442 $$.sorted = by_name;
18625d54 443 $$.exclude_name_list = NULL;
252b5132 444 }
bcaa7b3e
L
445 | SORT_BY_ALIGNMENT '(' wildcard_name ')'
446 {
447 $$.name = $3;
448 $$.sorted = by_alignment;
449 $$.exclude_name_list = NULL;
450 }
451 | SORT_BY_NAME '(' SORT_BY_ALIGNMENT '(' wildcard_name ')' ')'
452 {
453 $$.name = $5;
454 $$.sorted = by_name_alignment;
455 $$.exclude_name_list = NULL;
456 }
457 | SORT_BY_NAME '(' SORT_BY_NAME '(' wildcard_name ')' ')'
458 {
459 $$.name = $5;
460 $$.sorted = by_name;
461 $$.exclude_name_list = NULL;
462 }
463 | SORT_BY_ALIGNMENT '(' SORT_BY_NAME '(' wildcard_name ')' ')'
464 {
465 $$.name = $5;
466 $$.sorted = by_alignment_name;
467 $$.exclude_name_list = NULL;
468 }
469 | SORT_BY_ALIGNMENT '(' SORT_BY_ALIGNMENT '(' wildcard_name ')' ')'
470 {
471 $$.name = $5;
472 $$.sorted = by_alignment;
473 $$.exclude_name_list = NULL;
474 }
475 | SORT_BY_NAME '(' EXCLUDE_FILE '(' exclude_name_list ')' wildcard_name ')'
252b5132
RH
476 {
477 $$.name = $7;
bcaa7b3e 478 $$.sorted = by_name;
18625d54 479 $$.exclude_name_list = $5;
252b5132
RH
480 }
481 ;
482
18625d54 483exclude_name_list:
765b7cbe 484 exclude_name_list wildcard_name
18625d54
CM
485 {
486 struct name_list *tmp;
487 tmp = (struct name_list *) xmalloc (sizeof *tmp);
765b7cbe 488 tmp->name = $2;
18625d54 489 tmp->next = $1;
d038301c 490 $$ = tmp;
18625d54
CM
491 }
492 |
493 wildcard_name
494 {
495 struct name_list *tmp;
496 tmp = (struct name_list *) xmalloc (sizeof *tmp);
497 tmp->name = $1;
498 tmp->next = NULL;
499 $$ = tmp;
500 }
501 ;
502
252b5132 503file_NAME_list:
b6bf44ba 504 file_NAME_list opt_comma wildcard_spec
252b5132 505 {
b6bf44ba
AM
506 struct wildcard_list *tmp;
507 tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
508 tmp->next = $1;
509 tmp->spec = $3;
510 $$ = tmp;
252b5132 511 }
b6bf44ba
AM
512 |
513 wildcard_spec
252b5132 514 {
b6bf44ba
AM
515 struct wildcard_list *tmp;
516 tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
517 tmp->next = NULL;
518 tmp->spec = $1;
519 $$ = tmp;
252b5132
RH
520 }
521 ;
522
523input_section_spec_no_keep:
524 NAME
525 {
b6bf44ba
AM
526 struct wildcard_spec tmp;
527 tmp.name = $1;
528 tmp.exclude_name_list = NULL;
bcaa7b3e 529 tmp.sorted = none;
b6bf44ba 530 lang_add_wild (&tmp, NULL, ldgram_had_keep);
252b5132 531 }
b6bf44ba 532 | '[' file_NAME_list ']'
252b5132 533 {
b6bf44ba 534 lang_add_wild (NULL, $2, ldgram_had_keep);
252b5132 535 }
b6bf44ba 536 | wildcard_spec '(' file_NAME_list ')'
252b5132 537 {
b6bf44ba 538 lang_add_wild (&$1, $3, ldgram_had_keep);
252b5132 539 }
252b5132
RH
540 ;
541
542input_section_spec:
543 input_section_spec_no_keep
544 | KEEP '('
b34976b6 545 { ldgram_had_keep = TRUE; }
252b5132 546 input_section_spec_no_keep ')'
b34976b6 547 { ldgram_had_keep = FALSE; }
252b5132
RH
548 ;
549
550statement:
551 assignment end
552 | CREATE_OBJECT_SYMBOLS
553 {
d038301c 554 lang_add_attribute(lang_object_symbols_statement_enum);
252b5132
RH
555 }
556 | ';'
557 | CONSTRUCTORS
558 {
d038301c
RM
559
560 lang_add_attribute(lang_constructors_statement_enum);
252b5132 561 }
bcaa7b3e 562 | SORT_BY_NAME '(' CONSTRUCTORS ')'
252b5132 563 {
b34976b6 564 constructors_sorted = TRUE;
252b5132
RH
565 lang_add_attribute (lang_constructors_statement_enum);
566 }
567 | input_section_spec
568 | length '(' mustbe_exp ')'
569 {
2c382fb6 570 lang_add_data ((int) $1, $3);
252b5132 571 }
d038301c 572
2c382fb6 573 | FILL '(' fill_exp ')'
252b5132 574 {
2c382fb6 575 lang_add_fill ($3);
252b5132 576 }
8545d1a9
NS
577 | ASSERT_K {ldlex_expression ();} '(' exp ',' NAME ')' end
578 { ldlex_popstate ();
579 lang_add_assignment (exp_assert ($4, $6)); }
4006703d
NS
580 | INCLUDE filename
581 { ldlex_script (); ldfile_open_command_file($2); }
582 statement_list_opt END
583 { ldlex_popstate (); }
252b5132
RH
584 ;
585
586statement_list:
587 statement_list statement
588 | statement
589 ;
d038301c 590
252b5132
RH
591statement_list_opt:
592 /* empty */
593 | statement_list
594 ;
595
596length:
597 QUAD
598 { $$ = $1; }
599 | SQUAD
600 { $$ = $1; }
601 | LONG
602 { $$ = $1; }
603 | SHORT
604 { $$ = $1; }
605 | BYTE
606 { $$ = $1; }
607 ;
608
2c382fb6
AM
609fill_exp:
610 mustbe_exp
252b5132 611 {
e9ee469a 612 $$ = exp_get_fill ($1, 0, "fill value");
252b5132 613 }
252b5132
RH
614 ;
615
2c382fb6
AM
616fill_opt:
617 '=' fill_exp
618 { $$ = $2; }
619 | { $$ = (fill_type *) 0; }
620 ;
252b5132
RH
621
622assign_op:
623 PLUSEQ
624 { $$ = '+'; }
625 | MINUSEQ
626 { $$ = '-'; }
627 | MULTEQ
628 { $$ = '*'; }
629 | DIVEQ
630 { $$ = '/'; }
631 | LSHIFTEQ
632 { $$ = LSHIFT; }
633 | RSHIFTEQ
634 { $$ = RSHIFT; }
635 | ANDEQ
636 { $$ = '&'; }
637 | OREQ
638 { $$ = '|'; }
639
640 ;
641
642end: ';' | ','
643 ;
644
645
646assignment:
647 NAME '=' mustbe_exp
648 {
649 lang_add_assignment (exp_assop ($2, $1, $3));
650 }
651 | NAME assign_op mustbe_exp
652 {
653 lang_add_assignment (exp_assop ('=', $1,
654 exp_binop ($2,
655 exp_nameop (NAME,
656 $1),
657 $3)));
658 }
659 | PROVIDE '(' NAME '=' mustbe_exp ')'
660 {
7af8e998
L
661 lang_add_assignment (exp_provide ($3, $5, FALSE));
662 }
663 | PROVIDE_HIDDEN '(' NAME '=' mustbe_exp ')'
664 {
665 lang_add_assignment (exp_provide ($3, $5, TRUE));
252b5132
RH
666 }
667 ;
668
669
670opt_comma:
671 ',' | ;
672
673
674memory:
4006703d 675 MEMORY '{' memory_spec_list_opt '}'
252b5132
RH
676 ;
677
4006703d
NS
678memory_spec_list_opt: memory_spec_list | ;
679
252b5132 680memory_spec_list:
4006703d
NS
681 memory_spec_list opt_comma memory_spec
682 | memory_spec
252b5132
RH
683 ;
684
685
2d801b0f 686memory_spec: NAME
a747ee4d 687 { region = lang_memory_region_lookup ($1, TRUE); }
252b5132
RH
688 attributes_opt ':'
689 origin_spec opt_comma length_spec
2d801b0f 690 {}
4006703d
NS
691 | INCLUDE filename
692 { ldlex_script (); ldfile_open_command_file($2); }
693 memory_spec_list_opt END
694 { ldlex_popstate (); }
74459f0e
TW
695 ;
696
697origin_spec:
252b5132 698 ORIGIN '=' mustbe_exp
e9ee469a
AM
699 {
700 region->origin = exp_get_vma ($3, 0, "origin");
701 region->current = region->origin;
702 }
252b5132
RH
703 ;
704
705length_spec:
706 LENGTH '=' mustbe_exp
e9ee469a
AM
707 {
708 region->length = exp_get_vma ($3, -1, "length");
252b5132 709 }
aa8804e4 710 ;
252b5132
RH
711
712attributes_opt:
aa8804e4
ILT
713 /* empty */
714 { /* dummy action to avoid bison 1.25 error message */ }
715 | '(' attributes_list ')'
716 ;
717
718attributes_list:
719 attributes_string
720 | attributes_list attributes_string
721 ;
722
723attributes_string:
724 NAME
725 { lang_set_flags (region, $1, 0); }
726 | '!' NAME
727 { lang_set_flags (region, $2, 1); }
252b5132
RH
728 ;
729
730startup:
731 STARTUP '(' filename ')'
732 { lang_startup($3); }
733 ;
734
735high_level_library:
736 HLL '(' high_level_library_NAME_list ')'
737 | HLL '(' ')'
738 { ldemul_hll((char *)NULL); }
739 ;
740
741high_level_library_NAME_list:
742 high_level_library_NAME_list opt_comma filename
743 { ldemul_hll($3); }
744 | filename
745 { ldemul_hll($1); }
746
747 ;
748
749low_level_library:
750 SYSLIB '(' low_level_library_NAME_list ')'
751 ; low_level_library_NAME_list:
752 low_level_library_NAME_list opt_comma filename
753 { ldemul_syslib($3); }
754 |
755 ;
756
757floating_point_support:
758 FLOAT
b34976b6 759 { lang_float(TRUE); }
252b5132 760 | NOFLOAT
b34976b6 761 { lang_float(FALSE); }
252b5132 762 ;
d038301c 763
252b5132
RH
764nocrossref_list:
765 /* empty */
766 {
767 $$ = NULL;
768 }
769 | NAME nocrossref_list
770 {
771 struct lang_nocrossref *n;
772
773 n = (struct lang_nocrossref *) xmalloc (sizeof *n);
774 n->name = $1;
775 n->next = $2;
776 $$ = n;
777 }
778 | NAME ',' nocrossref_list
779 {
780 struct lang_nocrossref *n;
781
782 n = (struct lang_nocrossref *) xmalloc (sizeof *n);
783 n->name = $1;
784 n->next = $3;
785 $$ = n;
786 }
787 ;
788
3ec57632 789mustbe_exp: { ldlex_expression (); }
252b5132 790 exp
3ec57632 791 { ldlex_popstate (); $$=$2;}
252b5132
RH
792 ;
793
794exp :
795 '-' exp %prec UNARY
3ec57632 796 { $$ = exp_unop ('-', $2); }
252b5132
RH
797 | '(' exp ')'
798 { $$ = $2; }
799 | NEXT '(' exp ')' %prec UNARY
3ec57632 800 { $$ = exp_unop ((int) $1,$3); }
252b5132 801 | '!' exp %prec UNARY
3ec57632 802 { $$ = exp_unop ('!', $2); }
252b5132
RH
803 | '+' exp %prec UNARY
804 { $$ = $2; }
805 | '~' exp %prec UNARY
3ec57632 806 { $$ = exp_unop ('~', $2);}
252b5132
RH
807
808 | exp '*' exp
3ec57632 809 { $$ = exp_binop ('*', $1, $3); }
252b5132 810 | exp '/' exp
3ec57632 811 { $$ = exp_binop ('/', $1, $3); }
252b5132 812 | exp '%' exp
3ec57632 813 { $$ = exp_binop ('%', $1, $3); }
252b5132 814 | exp '+' exp
3ec57632 815 { $$ = exp_binop ('+', $1, $3); }
252b5132 816 | exp '-' exp
3ec57632 817 { $$ = exp_binop ('-' , $1, $3); }
252b5132 818 | exp LSHIFT exp
3ec57632 819 { $$ = exp_binop (LSHIFT , $1, $3); }
252b5132 820 | exp RSHIFT exp
3ec57632 821 { $$ = exp_binop (RSHIFT , $1, $3); }
252b5132 822 | exp EQ exp
3ec57632 823 { $$ = exp_binop (EQ , $1, $3); }
252b5132 824 | exp NE exp
3ec57632 825 { $$ = exp_binop (NE , $1, $3); }
252b5132 826 | exp LE exp
3ec57632 827 { $$ = exp_binop (LE , $1, $3); }
252b5132 828 | exp GE exp
3ec57632 829 { $$ = exp_binop (GE , $1, $3); }
252b5132 830 | exp '<' exp
3ec57632 831 { $$ = exp_binop ('<' , $1, $3); }
252b5132 832 | exp '>' exp
3ec57632 833 { $$ = exp_binop ('>' , $1, $3); }
252b5132 834 | exp '&' exp
3ec57632 835 { $$ = exp_binop ('&' , $1, $3); }
252b5132 836 | exp '^' exp
3ec57632 837 { $$ = exp_binop ('^' , $1, $3); }
252b5132 838 | exp '|' exp
3ec57632 839 { $$ = exp_binop ('|' , $1, $3); }
252b5132 840 | exp '?' exp ':' exp
3ec57632 841 { $$ = exp_trinop ('?' , $1, $3, $5); }
252b5132 842 | exp ANDAND exp
3ec57632 843 { $$ = exp_binop (ANDAND , $1, $3); }
252b5132 844 | exp OROR exp
3ec57632 845 { $$ = exp_binop (OROR , $1, $3); }
252b5132 846 | DEFINED '(' NAME ')'
3ec57632 847 { $$ = exp_nameop (DEFINED, $3); }
252b5132 848 | INT
2c382fb6 849 { $$ = exp_bigintop ($1.integer, $1.str); }
252b5132 850 | SIZEOF_HEADERS
3ec57632 851 { $$ = exp_nameop (SIZEOF_HEADERS,0); }
252b5132 852
5d41b3ef
NS
853 | ALIGNOF '(' NAME ')'
854 { $$ = exp_nameop (ALIGNOF,$3); }
252b5132 855 | SIZEOF '(' NAME ')'
3ec57632 856 { $$ = exp_nameop (SIZEOF,$3); }
252b5132 857 | ADDR '(' NAME ')'
3ec57632 858 { $$ = exp_nameop (ADDR,$3); }
252b5132 859 | LOADADDR '(' NAME ')'
3ec57632 860 { $$ = exp_nameop (LOADADDR,$3); }
24718e3b
L
861 | CONSTANT '(' NAME ')'
862 { $$ = exp_nameop (CONSTANT,$3); }
252b5132 863 | ABSOLUTE '(' exp ')'
3ec57632 864 { $$ = exp_unop (ABSOLUTE, $3); }
252b5132 865 | ALIGN_K '(' exp ')'
3ec57632 866 { $$ = exp_unop (ALIGN_K,$3); }
876f4090 867 | ALIGN_K '(' exp ',' exp ')'
3ec57632 868 { $$ = exp_binop (ALIGN_K,$3,$5); }
2d20f7bf
JJ
869 | DATA_SEGMENT_ALIGN '(' exp ',' exp ')'
870 { $$ = exp_binop (DATA_SEGMENT_ALIGN, $3, $5); }
a4f5ad88
JJ
871 | DATA_SEGMENT_RELRO_END '(' exp ',' exp ')'
872 { $$ = exp_binop (DATA_SEGMENT_RELRO_END, $5, $3); }
2d20f7bf 873 | DATA_SEGMENT_END '(' exp ')'
3ec57632 874 { $$ = exp_unop (DATA_SEGMENT_END, $3); }
ba916c8a
MM
875 | SEGMENT_START '(' NAME ',' exp ')'
876 { /* The operands to the expression node are
877 placed in the opposite order from the way
878 in which they appear in the script as
879 that allows us to reuse more code in
880 fold_binary. */
881 $$ = exp_binop (SEGMENT_START,
882 $5,
883 exp_nameop (NAME, $3)); }
252b5132 884 | BLOCK '(' exp ')'
3ec57632 885 { $$ = exp_unop (ALIGN_K,$3); }
252b5132 886 | NAME
3ec57632 887 { $$ = exp_nameop (NAME,$1); }
252b5132
RH
888 | MAX_K '(' exp ',' exp ')'
889 { $$ = exp_binop (MAX_K, $3, $5 ); }
890 | MIN_K '(' exp ',' exp ')'
891 { $$ = exp_binop (MIN_K, $3, $5 ); }
892 | ASSERT_K '(' exp ',' NAME ')'
893 { $$ = exp_assert ($3, $5); }
3ec57632
NC
894 | ORIGIN '(' NAME ')'
895 { $$ = exp_nameop (ORIGIN, $3); }
896 | LENGTH '(' NAME ')'
897 { $$ = exp_nameop (LENGTH, $3); }
252b5132
RH
898 ;
899
900
562d3460
TW
901memspec_at_opt:
902 AT '>' NAME { $$ = $3; }
9f88b410 903 | { $$ = 0; }
562d3460
TW
904 ;
905
252b5132
RH
906opt_at:
907 AT '(' exp ')' { $$ = $3; }
908 | { $$ = 0; }
909 ;
910
bbf115d3
L
911opt_align:
912 ALIGN_K '(' exp ')' { $$ = $3; }
913 | { $$ = 0; }
914 ;
915
7e7d5768
AM
916opt_subalign:
917 SUBALIGN '(' exp ')' { $$ = $3; }
918 | { $$ = 0; }
919 ;
920
0841712e
JJ
921sect_constraint:
922 ONLY_IF_RO { $$ = ONLY_IF_RO; }
923 | ONLY_IF_RW { $$ = ONLY_IF_RW; }
0cf7d72c 924 | SPECIAL { $$ = SPECIAL; }
0841712e
JJ
925 | { $$ = 0; }
926 ;
927
252b5132 928section: NAME { ldlex_expression(); }
d038301c 929 opt_exp_with_type
7e7d5768 930 opt_at
bbf115d3 931 opt_align
7e7d5768 932 opt_subalign { ldlex_popstate (); ldlex_script (); }
0841712e 933 sect_constraint
252b5132
RH
934 '{'
935 {
936 lang_enter_output_section_statement($1, $3,
937 sectype,
bbf115d3 938 $5, $6, $4, $8);
252b5132 939 }
d038301c 940 statement_list_opt
252b5132 941 '}' { ldlex_popstate (); ldlex_expression (); }
562d3460 942 memspec_opt memspec_at_opt phdr_opt fill_opt
252b5132
RH
943 {
944 ldlex_popstate ();
bbf115d3 945 lang_leave_output_section_statement ($17, $14, $16, $15);
252b5132
RH
946 }
947 opt_comma
2d801b0f 948 {}
252b5132
RH
949 | OVERLAY
950 { ldlex_expression (); }
7e7d5768 951 opt_exp_without_type opt_nocrossrefs opt_at opt_subalign
252b5132 952 { ldlex_popstate (); ldlex_script (); }
d038301c 953 '{'
252b5132 954 {
7e7d5768 955 lang_enter_overlay ($3, $6);
252b5132
RH
956 }
957 overlay_section
958 '}'
959 { ldlex_popstate (); ldlex_expression (); }
562d3460 960 memspec_opt memspec_at_opt phdr_opt fill_opt
252b5132
RH
961 {
962 ldlex_popstate ();
9f88b410 963 lang_leave_overlay ($5, (int) $4,
7e7d5768 964 $16, $13, $15, $14);
252b5132
RH
965 }
966 opt_comma
967 | /* The GROUP case is just enough to support the gcc
968 svr3.ifile script. It is not intended to be full
969 support. I'm not even sure what GROUP is supposed
970 to mean. */
971 GROUP { ldlex_expression (); }
972 opt_exp_with_type
973 {
974 ldlex_popstate ();
975 lang_add_assignment (exp_assop ('=', ".", $3));
976 }
977 '{' sec_or_group_p1 '}'
4006703d
NS
978 | INCLUDE filename
979 { ldlex_script (); ldfile_open_command_file($2); }
980 sec_or_group_p1 END
981 { ldlex_popstate (); }
252b5132
RH
982 ;
983
984type:
985 NOLOAD { sectype = noload_section; }
02a38f92
AM
986 | DSECT { sectype = noalloc_section; }
987 | COPY { sectype = noalloc_section; }
988 | INFO { sectype = noalloc_section; }
989 | OVERLAY { sectype = noalloc_section; }
252b5132
RH
990 ;
991
992atype:
993 '(' type ')'
994 | /* EMPTY */ { sectype = normal_section; }
995 | '(' ')' { sectype = normal_section; }
996 ;
997
998opt_exp_with_type:
999 exp atype ':' { $$ = $1; }
1000 | atype ':' { $$ = (etree_type *)NULL; }
1001 | /* The BIND cases are to support the gcc svr3.ifile
1002 script. They aren't intended to implement full
1003 support for the BIND keyword. I'm not even sure
1004 what BIND is supposed to mean. */
1005 BIND '(' exp ')' atype ':' { $$ = $3; }
1006 | BIND '(' exp ')' BLOCK '(' exp ')' atype ':'
1007 { $$ = $3; }
1008 ;
1009
1010opt_exp_without_type:
1011 exp ':' { $$ = $1; }
1012 | ':' { $$ = (etree_type *) NULL; }
1013 ;
1014
1015opt_nocrossrefs:
1016 /* empty */
1017 { $$ = 0; }
1018 | NOCROSSREFS
1019 { $$ = 1; }
1020 ;
1021
1022memspec_opt:
1023 '>' NAME
1024 { $$ = $2; }
a747ee4d 1025 | { $$ = DEFAULT_MEMORY_REGION; }
252b5132
RH
1026 ;
1027
1028phdr_opt:
1029 /* empty */
1030 {
1031 $$ = NULL;
1032 }
1033 | phdr_opt ':' NAME
1034 {
1035 struct lang_output_section_phdr_list *n;
1036
1037 n = ((struct lang_output_section_phdr_list *)
1038 xmalloc (sizeof *n));
1039 n->name = $3;
b34976b6 1040 n->used = FALSE;
252b5132
RH
1041 n->next = $1;
1042 $$ = n;
1043 }
1044 ;
1045
1046overlay_section:
1047 /* empty */
1048 | overlay_section
1049 NAME
1050 {
1051 ldlex_script ();
1052 lang_enter_overlay_section ($2);
1053 }
1054 '{' statement_list_opt '}'
1055 { ldlex_popstate (); ldlex_expression (); }
1056 phdr_opt fill_opt
1057 {
1058 ldlex_popstate ();
1059 lang_leave_overlay_section ($9, $8);
1060 }
1061 opt_comma
1062 ;
1063
1064phdrs:
1065 PHDRS '{' phdr_list '}'
1066 ;
1067
1068phdr_list:
1069 /* empty */
1070 | phdr_list phdr
1071 ;
1072
1073phdr:
1074 NAME { ldlex_expression (); }
1075 phdr_type phdr_qualifiers { ldlex_popstate (); }
1076 ';'
1077 {
1078 lang_new_phdr ($1, $3, $4.filehdr, $4.phdrs, $4.at,
1079 $4.flags);
1080 }
1081 ;
1082
1083phdr_type:
1084 exp
1085 {
1086 $$ = $1;
1087
1088 if ($1->type.node_class == etree_name
1089 && $1->type.node_code == NAME)
1090 {
1091 const char *s;
1092 unsigned int i;
1093 static const char * const phdr_types[] =
1094 {
1095 "PT_NULL", "PT_LOAD", "PT_DYNAMIC",
1096 "PT_INTERP", "PT_NOTE", "PT_SHLIB",
d038301c 1097 "PT_PHDR", "PT_TLS"
252b5132
RH
1098 };
1099
1100 s = $1->name.name;
1101 for (i = 0;
1102 i < sizeof phdr_types / sizeof phdr_types[0];
1103 i++)
1104 if (strcmp (s, phdr_types[i]) == 0)
1105 {
1106 $$ = exp_intop (i);
1107 break;
1108 }
d038301c
RM
1109 if (i == sizeof phdr_types / sizeof phdr_types[0])
1110 {
1111 if (strcmp (s, "PT_GNU_EH_FRAME") == 0)
1112 $$ = exp_intop (0x6474e550);
9ee5e499
JJ
1113 else if (strcmp (s, "PT_GNU_STACK") == 0)
1114 $$ = exp_intop (0x6474e551);
d038301c
RM
1115 else
1116 {
1117 einfo (_("\
1118%X%P:%S: unknown phdr type `%s' (try integer literal)\n"),
1119 s);
1120 $$ = exp_intop (0);
1121 }
1122 }
252b5132
RH
1123 }
1124 }
1125 ;
1126
1127phdr_qualifiers:
1128 /* empty */
1129 {
1130 memset (&$$, 0, sizeof (struct phdr_info));
1131 }
1132 | NAME phdr_val phdr_qualifiers
1133 {
1134 $$ = $3;
1135 if (strcmp ($1, "FILEHDR") == 0 && $2 == NULL)
b34976b6 1136 $$.filehdr = TRUE;
252b5132 1137 else if (strcmp ($1, "PHDRS") == 0 && $2 == NULL)
b34976b6 1138 $$.phdrs = TRUE;
252b5132
RH
1139 else if (strcmp ($1, "FLAGS") == 0 && $2 != NULL)
1140 $$.flags = $2;
1141 else
1142 einfo (_("%X%P:%S: PHDRS syntax error at `%s'\n"), $1);
1143 }
1144 | AT '(' exp ')' phdr_qualifiers
1145 {
1146 $$ = $5;
1147 $$.at = $3;
1148 }
1149 ;
1150
1151phdr_val:
1152 /* empty */
1153 {
1154 $$ = NULL;
1155 }
1156 | '(' exp ')'
1157 {
1158 $$ = $2;
1159 }
1160 ;
1161
55255dae
L
1162dynamic_list_file:
1163 {
1164 ldlex_version_file ();
1165 PUSH_ERROR (_("dynamic list"));
1166 }
1167 dynamic_list_nodes
1168 {
1169 ldlex_popstate ();
1170 POP_ERROR ();
1171 }
1172 ;
1173
1174dynamic_list_nodes:
1175 dynamic_list_node
1176 | dynamic_list_nodes dynamic_list_node
1177 ;
1178
1179dynamic_list_node:
1180 '{' dynamic_list_tag '}' ';'
1181 ;
1182
1183dynamic_list_tag:
1184 vers_defns ';'
1185 {
1186 lang_append_dynamic_list ($1);
1187 }
1188 ;
1189
252b5132
RH
1190/* This syntax is used within an external version script file. */
1191
1192version_script_file:
1193 {
1194 ldlex_version_file ();
1195 PUSH_ERROR (_("VERSION script"));
1196 }
1197 vers_nodes
1198 {
1199 ldlex_popstate ();
1200 POP_ERROR ();
1201 }
1202 ;
1203
1204/* This is used within a normal linker script file. */
1205
1206version:
1207 {
1208 ldlex_version_script ();
1209 }
1210 VERSIONK '{' vers_nodes '}'
1211 {
1212 ldlex_popstate ();
1213 }
1214 ;
1215
1216vers_nodes:
1217 vers_node
1218 | vers_nodes vers_node
1219 ;
1220
1221vers_node:
6b9b879a
JJ
1222 '{' vers_tag '}' ';'
1223 {
1224 lang_register_vers_node (NULL, $2, NULL);
1225 }
1226 | VERS_TAG '{' vers_tag '}' ';'
252b5132
RH
1227 {
1228 lang_register_vers_node ($1, $3, NULL);
1229 }
1230 | VERS_TAG '{' vers_tag '}' verdep ';'
1231 {
1232 lang_register_vers_node ($1, $3, $5);
1233 }
1234 ;
1235
1236verdep:
1237 VERS_TAG
1238 {
1239 $$ = lang_add_vers_depend (NULL, $1);
1240 }
1241 | verdep VERS_TAG
1242 {
1243 $$ = lang_add_vers_depend ($1, $2);
1244 }
1245 ;
1246
1247vers_tag:
1248 /* empty */
1249 {
1250 $$ = lang_new_vers_node (NULL, NULL);
1251 }
1252 | vers_defns ';'
1253 {
1254 $$ = lang_new_vers_node ($1, NULL);
1255 }
1256 | GLOBAL ':' vers_defns ';'
1257 {
1258 $$ = lang_new_vers_node ($3, NULL);
1259 }
1260 | LOCAL ':' vers_defns ';'
1261 {
1262 $$ = lang_new_vers_node (NULL, $3);
1263 }
1264 | GLOBAL ':' vers_defns ';' LOCAL ':' vers_defns ';'
1265 {
1266 $$ = lang_new_vers_node ($3, $7);
1267 }
1268 ;
1269
1270vers_defns:
1271 VERS_IDENTIFIER
1272 {
86043bbb
MM
1273 $$ = lang_new_vers_pattern (NULL, $1, ldgram_vers_current_lang, FALSE);
1274 }
1275 | NAME
1276 {
1277 $$ = lang_new_vers_pattern (NULL, $1, ldgram_vers_current_lang, TRUE);
252b5132
RH
1278 }
1279 | vers_defns ';' VERS_IDENTIFIER
1280 {
86043bbb
MM
1281 $$ = lang_new_vers_pattern ($1, $3, ldgram_vers_current_lang, FALSE);
1282 }
1283 | vers_defns ';' NAME
1284 {
1285 $$ = lang_new_vers_pattern ($1, $3, ldgram_vers_current_lang, TRUE);
252b5132 1286 }
8e23b15d
AM
1287 | vers_defns ';' EXTERN NAME '{'
1288 {
1289 $<name>$ = ldgram_vers_current_lang;
1290 ldgram_vers_current_lang = $4;
1291 }
1292 vers_defns opt_semicolon '}'
1293 {
96f8ade5
JJ
1294 struct bfd_elf_version_expr *pat;
1295 for (pat = $7; pat->next != NULL; pat = pat->next);
1296 pat->next = $1;
8e23b15d
AM
1297 $$ = $7;
1298 ldgram_vers_current_lang = $<name>6;
1299 }
252b5132
RH
1300 | EXTERN NAME '{'
1301 {
1302 $<name>$ = ldgram_vers_current_lang;
1303 ldgram_vers_current_lang = $2;
1304 }
8e23b15d 1305 vers_defns opt_semicolon '}'
252b5132 1306 {
e06cae36 1307 $$ = $5;
252b5132
RH
1308 ldgram_vers_current_lang = $<name>4;
1309 }
96f8ade5
JJ
1310 | GLOBAL
1311 {
86043bbb 1312 $$ = lang_new_vers_pattern (NULL, "global", ldgram_vers_current_lang, FALSE);
96f8ade5
JJ
1313 }
1314 | vers_defns ';' GLOBAL
1315 {
86043bbb 1316 $$ = lang_new_vers_pattern ($1, "global", ldgram_vers_current_lang, FALSE);
96f8ade5
JJ
1317 }
1318 | LOCAL
1319 {
86043bbb 1320 $$ = lang_new_vers_pattern (NULL, "local", ldgram_vers_current_lang, FALSE);
96f8ade5
JJ
1321 }
1322 | vers_defns ';' LOCAL
1323 {
86043bbb 1324 $$ = lang_new_vers_pattern ($1, "local", ldgram_vers_current_lang, FALSE);
96f8ade5
JJ
1325 }
1326 | EXTERN
1327 {
86043bbb 1328 $$ = lang_new_vers_pattern (NULL, "extern", ldgram_vers_current_lang, FALSE);
96f8ade5
JJ
1329 }
1330 | vers_defns ';' EXTERN
1331 {
86043bbb 1332 $$ = lang_new_vers_pattern ($1, "extern", ldgram_vers_current_lang, FALSE);
96f8ade5 1333 }
252b5132
RH
1334 ;
1335
8e23b15d
AM
1336opt_semicolon:
1337 /* empty */
1338 | ';'
1339 ;
1340
252b5132
RH
1341%%
1342void
d038301c 1343yyerror(arg)
252b5132 1344 const char *arg;
d038301c 1345{
252b5132
RH
1346 if (ldfile_assumed_script)
1347 einfo (_("%P:%s: file format not recognized; treating as linker script\n"),
1348 ldfile_input_filename);
1349 if (error_index > 0 && error_index < ERROR_NAME_MAX)
1350 einfo ("%P%F:%S: %s in %s\n", arg, error_names[error_index-1]);
1351 else
1352 einfo ("%P%F:%S: %s\n", arg);
1353}
This page took 0.467358 seconds and 4 git commands to generate.