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