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