]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - ld/ldgram.y
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / ld / ldgram.y
CommitLineData
8e5a525c 1/* A YACC grammar to parse a superset of the AT&T linker scripting language.
a2c58332 2 Copyright (C) 1991-2022 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
283extern_name_list:
34a7af0f 284 NAME
f38a2680 285 { ldlang_add_undef ($1, false); }
34a7af0f 286 | extern_name_list NAME
f38a2680 287 { ldlang_add_undef ($2, false); }
34a7af0f 288 | extern_name_list ',' NAME
f38a2680 289 { ldlang_add_undef ($3, false); }
252b5132
RH
290 ;
291
292script_file:
af29a8ab 293 { ldlex_script (); }
8545d1a9 294 ifile_list
af29a8ab 295 { ldlex_popstate (); }
6c19b93b 296 ;
252b5132 297
252b5132 298ifile_list:
8545d1a9 299 ifile_list ifile_p1
6c19b93b 300 |
252b5132
RH
301 ;
302
303
252b5132
RH
304ifile_p1:
305 memory
306 | sections
307 | phdrs
308 | startup
309 | high_level_library
310 | low_level_library
311 | floating_point_support
312 | statement_anywhere
313 | version
6c19b93b 314 | ';'
252b5132
RH
315 | TARGET_K '(' NAME ')'
316 { lang_add_target($3); }
317 | SEARCH_DIR '(' filename ')'
f38a2680 318 { ldfile_add_library_path ($3, false); }
252b5132
RH
319 | OUTPUT '(' filename ')'
320 { lang_add_output($3, 1); }
6c19b93b 321 | OUTPUT_FORMAT '(' NAME ')'
252b5132
RH
322 { lang_add_output_format ($3, (char *) NULL,
323 (char *) NULL, 1); }
324 | OUTPUT_FORMAT '(' NAME ',' NAME ',' NAME ')'
325 { lang_add_output_format ($3, $5, $7, 1); }
6c19b93b 326 | OUTPUT_ARCH '(' NAME ')'
5e2f1575 327 { ldfile_set_output_arch ($3, bfd_arch_unknown); }
252b5132 328 | FORCE_COMMON_ALLOCATION
f38a2680 329 { command_line.force_common_definition = true ; }
7bdf4127 330 | FORCE_GROUP_ALLOCATION
f38a2680 331 { command_line.force_group_allocation = true ; }
4818e05f 332 | INHIBIT_COMMON_ALLOCATION
f38a2680 333 { link_info.inhibit_common_definition = true ; }
252b5132
RH
334 | INPUT '(' input_list ')'
335 | GROUP
336 { lang_enter_group (); }
337 '(' input_list ')'
338 { lang_leave_group (); }
6c19b93b 339 | MAP '(' filename ')'
252b5132 340 { lang_add_map($3); }
d038301c 341 | INCLUDE filename
3bb17dfb 342 { ldfile_open_command_file ($2); }
b47c4208 343 ifile_list END
252b5132
RH
344 | NOCROSSREFS '(' nocrossref_list ')'
345 {
346 lang_add_nocrossref ($3);
347 }
cdf96953
MF
348 | NOCROSSREFS_TO '(' nocrossref_list ')'
349 {
350 lang_add_nocrossref_to ($3);
351 }
34a7af0f
AM
352 | EXTERN '(' { ldlex_expression (); } extern_name_list ')'
353 { ldlex_popstate (); }
53d25da6
AM
354 | INSERT_K AFTER NAME
355 { lang_add_insert ($3, 0); }
356 | INSERT_K BEFORE NAME
357 { lang_add_insert ($3, 1); }
4a93e180
NC
358 | REGION_ALIAS '(' NAME ',' NAME ')'
359 { lang_memory_region_alias ($3, $5); }
01554a74
AM
360 | LD_FEATURE '(' NAME ')'
361 { lang_ld_feature ($3); }
252b5132
RH
362 ;
363
364input_list:
eeed9cc7
HPN
365 { ldlex_inputlist(); }
366 input_list1
367 { ldlex_popstate(); }
368
369input_list1:
252b5132
RH
370 NAME
371 { lang_add_input_file($1,lang_input_file_is_search_file_enum,
372 (char *)NULL); }
eeed9cc7 373 | input_list1 ',' NAME
252b5132
RH
374 { lang_add_input_file($3,lang_input_file_is_search_file_enum,
375 (char *)NULL); }
eeed9cc7 376 | input_list1 NAME
252b5132
RH
377 { lang_add_input_file($2,lang_input_file_is_search_file_enum,
378 (char *)NULL); }
379 | LNAME
380 { lang_add_input_file($1,lang_input_file_is_l_enum,
381 (char *)NULL); }
eeed9cc7 382 | input_list1 ',' LNAME
252b5132
RH
383 { lang_add_input_file($3,lang_input_file_is_l_enum,
384 (char *)NULL); }
eeed9cc7 385 | input_list1 LNAME
252b5132
RH
386 { lang_add_input_file($2,lang_input_file_is_l_enum,
387 (char *)NULL); }
b717d30e 388 | AS_NEEDED '('
66be1055 389 { $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
f38a2680 390 input_flags.add_DT_NEEDED_for_regular = true; }
eeed9cc7 391 input_list1 ')'
66be1055 392 { input_flags.add_DT_NEEDED_for_regular = $<integer>3; }
eeed9cc7 393 | input_list1 ',' 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>5; }
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>4; }
252b5132
RH
403 ;
404
405sections:
406 SECTIONS '{' sec_or_group_p1 '}'
407 ;
408
409sec_or_group_p1:
410 sec_or_group_p1 section
411 | sec_or_group_p1 statement_anywhere
412 |
413 ;
414
415statement_anywhere:
416 ENTRY '(' NAME ')'
f38a2680 417 { lang_add_entry ($3, false); }
6c93cebf 418 | assignment separator
b6ca8815
NS
419 | ASSERT_K {ldlex_expression ();} '(' exp ',' NAME ')'
420 { ldlex_popstate ();
421 lang_add_assignment (exp_assert ($4, $6)); }
252b5132
RH
422 ;
423
252b5132
RH
424wildcard_name:
425 NAME
426 {
427 $$ = $1;
428 }
252b5132
RH
429 ;
430
2b94abd4 431wildcard_maybe_exclude:
252b5132
RH
432 wildcard_name
433 {
434 $$.name = $1;
bcaa7b3e 435 $$.sorted = none;
18625d54 436 $$.exclude_name_list = NULL;
ae17ab41 437 $$.section_flag_list = NULL;
252b5132 438 }
6c19b93b 439 | EXCLUDE_FILE '(' exclude_name_list ')' wildcard_name
252b5132
RH
440 {
441 $$.name = $5;
bcaa7b3e 442 $$.sorted = none;
18625d54 443 $$.exclude_name_list = $3;
ae17ab41 444 $$.section_flag_list = NULL;
252b5132 445 }
2b94abd4
AB
446 ;
447
448filename_spec:
449 wildcard_maybe_exclude
450 | SORT_BY_NAME '(' wildcard_maybe_exclude ')'
252b5132 451 {
2b94abd4 452 $$ = $3;
bcaa7b3e 453 $$.sorted = by_name;
252b5132 454 }
2b94abd4
AB
455 | SORT_NONE '(' wildcard_maybe_exclude ')'
456 {
457 $$ = $3;
458 $$.sorted = by_none;
459 }
460 ;
461
462section_name_spec:
463 wildcard_maybe_exclude
464 | SORT_BY_NAME '(' wildcard_maybe_exclude ')'
bcaa7b3e 465 {
2b94abd4
AB
466 $$ = $3;
467 $$.sorted = by_name;
468 }
469 | SORT_BY_ALIGNMENT '(' wildcard_maybe_exclude ')'
470 {
471 $$ = $3;
bcaa7b3e 472 $$.sorted = by_alignment;
bcaa7b3e 473 }
2b94abd4 474 | SORT_NONE '(' wildcard_maybe_exclude ')'
eda680f8 475 {
2b94abd4 476 $$ = $3;
eda680f8 477 $$.sorted = by_none;
eda680f8 478 }
2b94abd4 479 | SORT_BY_NAME '(' SORT_BY_ALIGNMENT '(' wildcard_maybe_exclude ')' ')'
bcaa7b3e 480 {
2b94abd4 481 $$ = $5;
bcaa7b3e 482 $$.sorted = by_name_alignment;
bcaa7b3e 483 }
2b94abd4 484 | SORT_BY_NAME '(' SORT_BY_NAME '(' wildcard_maybe_exclude ')' ')'
bcaa7b3e 485 {
2b94abd4 486 $$ = $5;
bcaa7b3e 487 $$.sorted = by_name;
bcaa7b3e 488 }
2b94abd4 489 | SORT_BY_ALIGNMENT '(' SORT_BY_NAME '(' wildcard_maybe_exclude ')' ')'
bcaa7b3e 490 {
2b94abd4 491 $$ = $5;
bcaa7b3e 492 $$.sorted = by_alignment_name;
bcaa7b3e 493 }
2b94abd4 494 | SORT_BY_ALIGNMENT '(' SORT_BY_ALIGNMENT '(' wildcard_maybe_exclude ')' ')'
bcaa7b3e 495 {
2b94abd4 496 $$ = $5;
bcaa7b3e 497 $$.sorted = by_alignment;
252b5132 498 }
2b94abd4 499 | SORT_BY_INIT_PRIORITY '(' wildcard_maybe_exclude ')'
02ecc8e9 500 {
2b94abd4 501 $$ = $3;
02ecc8e9 502 $$.sorted = by_init_priority;
ae17ab41
CM
503 }
504 ;
505
506sect_flag_list: NAME
507 {
508 struct flag_info_list *n;
509 n = ((struct flag_info_list *) xmalloc (sizeof *n));
510 if ($1[0] == '!')
511 {
512 n->with = without_flags;
513 n->name = &$1[1];
514 }
515 else
516 {
517 n->with = with_flags;
518 n->name = $1;
519 }
f38a2680 520 n->valid = false;
ae17ab41
CM
521 n->next = NULL;
522 $$ = n;
523 }
524 | sect_flag_list '&' NAME
525 {
526 struct flag_info_list *n;
527 n = ((struct flag_info_list *) xmalloc (sizeof *n));
528 if ($3[0] == '!')
529 {
530 n->with = without_flags;
531 n->name = &$3[1];
532 }
533 else
534 {
535 n->with = with_flags;
536 n->name = $3;
537 }
f38a2680 538 n->valid = false;
ae17ab41
CM
539 n->next = $1;
540 $$ = n;
541 }
542 ;
543
544sect_flags:
545 INPUT_SECTION_FLAGS '(' sect_flag_list ')'
546 {
547 struct flag_info *n;
548 n = ((struct flag_info *) xmalloc (sizeof *n));
549 n->flag_list = $3;
f38a2680 550 n->flags_initialized = false;
ae17ab41
CM
551 n->not_with_flags = 0;
552 n->only_with_flags = 0;
553 $$ = n;
02ecc8e9 554 }
252b5132
RH
555 ;
556
18625d54 557exclude_name_list:
765b7cbe 558 exclude_name_list wildcard_name
18625d54
CM
559 {
560 struct name_list *tmp;
561 tmp = (struct name_list *) xmalloc (sizeof *tmp);
765b7cbe 562 tmp->name = $2;
18625d54 563 tmp->next = $1;
d038301c 564 $$ = tmp;
18625d54
CM
565 }
566 |
567 wildcard_name
568 {
569 struct name_list *tmp;
570 tmp = (struct name_list *) xmalloc (sizeof *tmp);
571 tmp->name = $1;
572 tmp->next = NULL;
573 $$ = tmp;
574 }
575 ;
576
2b94abd4
AB
577section_name_list:
578 section_name_list opt_comma section_name_spec
252b5132 579 {
b6bf44ba
AM
580 struct wildcard_list *tmp;
581 tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
582 tmp->next = $1;
583 tmp->spec = $3;
584 $$ = tmp;
252b5132 585 }
b6bf44ba 586 |
2b94abd4 587 section_name_spec
252b5132 588 {
b6bf44ba
AM
589 struct wildcard_list *tmp;
590 tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
591 tmp->next = NULL;
592 tmp->spec = $1;
593 $$ = tmp;
252b5132
RH
594 }
595 ;
596
597input_section_spec_no_keep:
598 NAME
599 {
b6bf44ba
AM
600 struct wildcard_spec tmp;
601 tmp.name = $1;
602 tmp.exclude_name_list = NULL;
bcaa7b3e 603 tmp.sorted = none;
ae17ab41
CM
604 tmp.section_flag_list = NULL;
605 lang_add_wild (&tmp, NULL, ldgram_had_keep);
606 }
607 | sect_flags NAME
608 {
609 struct wildcard_spec tmp;
610 tmp.name = $2;
611 tmp.exclude_name_list = NULL;
612 tmp.sorted = none;
613 tmp.section_flag_list = $1;
b6bf44ba 614 lang_add_wild (&tmp, NULL, ldgram_had_keep);
252b5132 615 }
6c19b93b 616 | '[' section_name_list ']'
252b5132 617 {
b6bf44ba 618 lang_add_wild (NULL, $2, ldgram_had_keep);
252b5132 619 }
6c19b93b 620 | sect_flags '[' section_name_list ']'
ae17ab41
CM
621 {
622 struct wildcard_spec tmp;
623 tmp.name = NULL;
624 tmp.exclude_name_list = NULL;
625 tmp.sorted = none;
626 tmp.section_flag_list = $1;
09f6ed34 627 lang_add_wild (&tmp, $3, ldgram_had_keep);
ae17ab41 628 }
2b94abd4 629 | filename_spec '(' section_name_list ')'
252b5132 630 {
b6bf44ba 631 lang_add_wild (&$1, $3, ldgram_had_keep);
252b5132 632 }
2b94abd4 633 | sect_flags filename_spec '(' section_name_list ')'
ae17ab41
CM
634 {
635 $2.section_flag_list = $1;
636 lang_add_wild (&$2, $4, ldgram_had_keep);
637 }
252b5132
RH
638 ;
639
640input_section_spec:
641 input_section_spec_no_keep
642 | KEEP '('
f38a2680 643 { ldgram_had_keep = true; }
252b5132 644 input_section_spec_no_keep ')'
f38a2680 645 { ldgram_had_keep = false; }
252b5132
RH
646 ;
647
648statement:
6c93cebf
AM
649 ';'
650 | assignment separator
651 | CREATE_OBJECT_SYMBOLS
252b5132 652 {
6c93cebf 653 lang_add_attribute (lang_object_symbols_statement_enum);
6c19b93b 654 }
6c93cebf 655 | CONSTRUCTORS
252b5132 656 {
6c93cebf 657 lang_add_attribute (lang_constructors_statement_enum);
252b5132 658 }
bcaa7b3e 659 | SORT_BY_NAME '(' CONSTRUCTORS ')'
252b5132 660 {
f38a2680 661 constructors_sorted = true;
252b5132
RH
662 lang_add_attribute (lang_constructors_statement_enum);
663 }
664 | input_section_spec
6c19b93b
AM
665 | length '(' mustbe_exp ')'
666 {
667 lang_add_data ((int) $1, $3);
668 }
d038301c 669
2c382fb6 670 | FILL '(' fill_exp ')'
6c19b93b
AM
671 {
672 lang_add_fill ($3);
673 }
6c93cebf
AM
674 | ASSERT_K
675 { ldlex_expression (); }
676 '(' exp ',' NAME ')' separator
677 {
678 ldlex_popstate ();
679 lang_add_assignment (exp_assert ($4, $6));
680 }
4006703d 681 | INCLUDE filename
6c93cebf 682 {
6c93cebf
AM
683 ldfile_open_command_file ($2);
684 }
685 statement_list_opt END
252b5132
RH
686 ;
687
688statement_list:
689 statement_list statement
6c19b93b 690 | statement
252b5132 691 ;
d038301c 692
252b5132
RH
693statement_list_opt:
694 /* empty */
695 | statement_list
696 ;
697
698length:
699 QUAD
700 { $$ = $1; }
701 | SQUAD
702 { $$ = $1; }
703 | LONG
704 { $$ = $1; }
6c19b93b 705 | SHORT
252b5132
RH
706 { $$ = $1; }
707 | BYTE
708 { $$ = $1; }
709 ;
710
2c382fb6
AM
711fill_exp:
712 mustbe_exp
252b5132 713 {
e9ee469a 714 $$ = exp_get_fill ($1, 0, "fill value");
252b5132 715 }
252b5132
RH
716 ;
717
2c382fb6
AM
718fill_opt:
719 '=' fill_exp
720 { $$ = $2; }
6c19b93b 721 | { $$ = (fill_type *) 0; }
2c382fb6 722 ;
252b5132
RH
723
724assign_op:
725 PLUSEQ
726 { $$ = '+'; }
727 | MINUSEQ
728 { $$ = '-'; }
6c19b93b 729 | MULTEQ
252b5132 730 { $$ = '*'; }
6c19b93b 731 | DIVEQ
252b5132 732 { $$ = '/'; }
6c19b93b 733 | LSHIFTEQ
252b5132 734 { $$ = LSHIFT; }
6c19b93b 735 | RSHIFTEQ
252b5132 736 { $$ = RSHIFT; }
6c19b93b 737 | ANDEQ
252b5132 738 { $$ = '&'; }
6c19b93b 739 | OREQ
252b5132
RH
740 { $$ = '|'; }
741
742 ;
743
6c93cebf 744separator: ';' | ','
252b5132
RH
745 ;
746
747
748assignment:
749 NAME '=' mustbe_exp
750 {
f38a2680 751 lang_add_assignment (exp_assign ($1, $3, false));
252b5132
RH
752 }
753 | NAME assign_op mustbe_exp
754 {
2e57b2af
AM
755 lang_add_assignment (exp_assign ($1,
756 exp_binop ($2,
757 exp_nameop (NAME,
758 $1),
f38a2680 759 $3), false));
eb8476a6
MR
760 }
761 | HIDDEN '(' NAME '=' mustbe_exp ')'
762 {
f38a2680 763 lang_add_assignment (exp_assign ($3, $5, true));
252b5132
RH
764 }
765 | PROVIDE '(' NAME '=' mustbe_exp ')'
766 {
f38a2680 767 lang_add_assignment (exp_provide ($3, $5, false));
7af8e998
L
768 }
769 | PROVIDE_HIDDEN '(' NAME '=' mustbe_exp ')'
770 {
f38a2680 771 lang_add_assignment (exp_provide ($3, $5, true));
252b5132
RH
772 }
773 ;
774
775
776opt_comma:
777 ',' | ;
778
779
780memory:
4006703d 781 MEMORY '{' memory_spec_list_opt '}'
252b5132
RH
782 ;
783
4006703d
NS
784memory_spec_list_opt: memory_spec_list | ;
785
252b5132 786memory_spec_list:
4006703d
NS
787 memory_spec_list opt_comma memory_spec
788 | memory_spec
252b5132
RH
789 ;
790
791
6c19b93b 792memory_spec: NAME
f38a2680 793 { region = lang_memory_region_lookup ($1, true); }
252b5132
RH
794 attributes_opt ':'
795 origin_spec opt_comma length_spec
2d801b0f 796 {}
4006703d 797 | INCLUDE filename
3bb17dfb 798 { ldfile_open_command_file ($2); }
4006703d 799 memory_spec_list_opt END
74459f0e
TW
800 ;
801
802origin_spec:
252b5132 803 ORIGIN '=' mustbe_exp
e9ee469a 804 {
cc9ad334 805 region->origin_exp = $3;
e9ee469a 806 }
252b5132
RH
807 ;
808
809length_spec:
6c19b93b 810 LENGTH '=' mustbe_exp
e9ee469a 811 {
a3e8dd2a
AM
812 if (yychar == NAME)
813 {
814 yyclearin;
815 ldlex_backup ();
816 }
cc9ad334 817 region->length_exp = $3;
252b5132 818 }
aa8804e4 819 ;
252b5132
RH
820
821attributes_opt:
aa8804e4
ILT
822 /* empty */
823 { /* dummy action to avoid bison 1.25 error message */ }
824 | '(' attributes_list ')'
825 ;
826
827attributes_list:
828 attributes_string
829 | attributes_list attributes_string
830 ;
831
832attributes_string:
833 NAME
834 { lang_set_flags (region, $1, 0); }
835 | '!' NAME
836 { lang_set_flags (region, $2, 1); }
252b5132
RH
837 ;
838
839startup:
840 STARTUP '(' filename ')'
841 { lang_startup($3); }
842 ;
843
844high_level_library:
845 HLL '(' high_level_library_NAME_list ')'
846 | HLL '(' ')'
847 { ldemul_hll((char *)NULL); }
848 ;
849
850high_level_library_NAME_list:
851 high_level_library_NAME_list opt_comma filename
852 { ldemul_hll($3); }
853 | filename
854 { ldemul_hll($1); }
252b5132
RH
855 ;
856
857low_level_library:
858 SYSLIB '(' low_level_library_NAME_list ')'
a5f92c67
AM
859 ;
860
861low_level_library_NAME_list:
252b5132
RH
862 low_level_library_NAME_list opt_comma filename
863 { ldemul_syslib($3); }
864 |
865 ;
866
867floating_point_support:
868 FLOAT
f38a2680 869 { lang_float(true); }
252b5132 870 | NOFLOAT
f38a2680 871 { lang_float(false); }
252b5132 872 ;
d038301c 873
252b5132
RH
874nocrossref_list:
875 /* empty */
876 {
877 $$ = NULL;
878 }
879 | NAME nocrossref_list
880 {
881 struct lang_nocrossref *n;
882
883 n = (struct lang_nocrossref *) xmalloc (sizeof *n);
884 n->name = $1;
885 n->next = $2;
886 $$ = n;
887 }
888 | NAME ',' nocrossref_list
889 {
890 struct lang_nocrossref *n;
891
892 n = (struct lang_nocrossref *) xmalloc (sizeof *n);
893 n->name = $1;
894 n->next = $3;
895 $$ = n;
896 }
897 ;
898
6c93cebf
AM
899paren_script_name: { ldlex_script (); }
900 '(' NAME ')'
901 { ldlex_popstate (); $$ = $3; }
553dd76c 902
6c93cebf 903mustbe_exp: { ldlex_expression (); }
252b5132 904 exp
6c93cebf 905 { ldlex_popstate (); $$ = $2; }
252b5132
RH
906 ;
907
908exp :
909 '-' exp %prec UNARY
3ec57632 910 { $$ = exp_unop ('-', $2); }
252b5132
RH
911 | '(' exp ')'
912 { $$ = $2; }
913 | NEXT '(' exp ')' %prec UNARY
3ec57632 914 { $$ = exp_unop ((int) $1,$3); }
252b5132 915 | '!' exp %prec UNARY
3ec57632 916 { $$ = exp_unop ('!', $2); }
252b5132
RH
917 | '+' exp %prec UNARY
918 { $$ = $2; }
919 | '~' exp %prec UNARY
3ec57632 920 { $$ = exp_unop ('~', $2);}
252b5132
RH
921
922 | exp '*' exp
3ec57632 923 { $$ = exp_binop ('*', $1, $3); }
252b5132 924 | exp '/' exp
3ec57632 925 { $$ = exp_binop ('/', $1, $3); }
252b5132 926 | exp '%' exp
3ec57632 927 { $$ = exp_binop ('%', $1, $3); }
252b5132 928 | exp '+' exp
3ec57632 929 { $$ = exp_binop ('+', $1, $3); }
252b5132 930 | exp '-' exp
3ec57632 931 { $$ = exp_binop ('-' , $1, $3); }
252b5132 932 | exp LSHIFT exp
3ec57632 933 { $$ = exp_binop (LSHIFT , $1, $3); }
252b5132 934 | exp RSHIFT exp
3ec57632 935 { $$ = exp_binop (RSHIFT , $1, $3); }
252b5132 936 | exp EQ exp
3ec57632 937 { $$ = exp_binop (EQ , $1, $3); }
252b5132 938 | exp NE exp
3ec57632 939 { $$ = exp_binop (NE , $1, $3); }
252b5132 940 | exp LE exp
3ec57632 941 { $$ = exp_binop (LE , $1, $3); }
6c19b93b 942 | exp GE exp
3ec57632 943 { $$ = exp_binop (GE , $1, $3); }
252b5132 944 | exp '<' exp
3ec57632 945 { $$ = exp_binop ('<' , $1, $3); }
252b5132 946 | exp '>' exp
3ec57632 947 { $$ = exp_binop ('>' , $1, $3); }
252b5132 948 | exp '&' exp
3ec57632 949 { $$ = exp_binop ('&' , $1, $3); }
252b5132 950 | exp '^' exp
3ec57632 951 { $$ = exp_binop ('^' , $1, $3); }
252b5132 952 | exp '|' exp
3ec57632 953 { $$ = exp_binop ('|' , $1, $3); }
252b5132 954 | exp '?' exp ':' exp
3ec57632 955 { $$ = exp_trinop ('?' , $1, $3, $5); }
252b5132 956 | exp ANDAND exp
3ec57632 957 { $$ = exp_binop (ANDAND , $1, $3); }
252b5132 958 | exp OROR exp
3ec57632 959 { $$ = exp_binop (OROR , $1, $3); }
252b5132 960 | DEFINED '(' NAME ')'
3ec57632 961 { $$ = exp_nameop (DEFINED, $3); }
252b5132 962 | INT
2c382fb6 963 { $$ = exp_bigintop ($1.integer, $1.str); }
6c19b93b 964 | SIZEOF_HEADERS
3ec57632 965 { $$ = exp_nameop (SIZEOF_HEADERS,0); }
252b5132 966
553dd76c
AM
967 | ALIGNOF paren_script_name
968 { $$ = exp_nameop (ALIGNOF, $2); }
969 | SIZEOF paren_script_name
970 { $$ = exp_nameop (SIZEOF, $2); }
971 | ADDR paren_script_name
972 { $$ = exp_nameop (ADDR, $2); }
973 | LOADADDR paren_script_name
974 { $$ = exp_nameop (LOADADDR, $2); }
24718e3b
L
975 | CONSTANT '(' NAME ')'
976 { $$ = exp_nameop (CONSTANT,$3); }
252b5132 977 | ABSOLUTE '(' exp ')'
3ec57632 978 { $$ = exp_unop (ABSOLUTE, $3); }
252b5132 979 | ALIGN_K '(' exp ')'
3ec57632 980 { $$ = exp_unop (ALIGN_K,$3); }
876f4090 981 | ALIGN_K '(' exp ',' exp ')'
3ec57632 982 { $$ = exp_binop (ALIGN_K,$3,$5); }
2d20f7bf
JJ
983 | DATA_SEGMENT_ALIGN '(' exp ',' exp ')'
984 { $$ = exp_binop (DATA_SEGMENT_ALIGN, $3, $5); }
a4f5ad88
JJ
985 | DATA_SEGMENT_RELRO_END '(' exp ',' exp ')'
986 { $$ = exp_binop (DATA_SEGMENT_RELRO_END, $5, $3); }
2d20f7bf 987 | DATA_SEGMENT_END '(' exp ')'
3ec57632 988 { $$ = exp_unop (DATA_SEGMENT_END, $3); }
553dd76c
AM
989 | SEGMENT_START { ldlex_script (); } '(' NAME
990 { ldlex_popstate (); } ',' exp ')'
6c19b93b 991 { /* The operands to the expression node are
ba916c8a
MM
992 placed in the opposite order from the way
993 in which they appear in the script as
994 that allows us to reuse more code in
995 fold_binary. */
996 $$ = exp_binop (SEGMENT_START,
553dd76c
AM
997 $7,
998 exp_nameop (NAME, $4)); }
252b5132 999 | BLOCK '(' exp ')'
3ec57632 1000 { $$ = exp_unop (ALIGN_K,$3); }
252b5132 1001 | NAME
3ec57632 1002 { $$ = exp_nameop (NAME,$1); }
252b5132
RH
1003 | MAX_K '(' exp ',' exp ')'
1004 { $$ = exp_binop (MAX_K, $3, $5 ); }
1005 | MIN_K '(' exp ',' exp ')'
1006 { $$ = exp_binop (MIN_K, $3, $5 ); }
1007 | ASSERT_K '(' exp ',' NAME ')'
1008 { $$ = exp_assert ($3, $5); }
af29a8ab
AM
1009 | ORIGIN paren_script_name
1010 { $$ = exp_nameop (ORIGIN, $2); }
1011 | LENGTH paren_script_name
1012 { $$ = exp_nameop (LENGTH, $2); }
2e53f7d6
NC
1013 | LOG2CEIL '(' exp ')'
1014 { $$ = exp_unop (LOG2CEIL, $3); }
252b5132
RH
1015 ;
1016
1017
562d3460 1018memspec_at_opt:
6c19b93b
AM
1019 AT '>' NAME { $$ = $3; }
1020 | { $$ = 0; }
1021 ;
562d3460 1022
252b5132
RH
1023opt_at:
1024 AT '(' exp ')' { $$ = $3; }
1025 | { $$ = 0; }
1026 ;
1027
bbf115d3
L
1028opt_align:
1029 ALIGN_K '(' exp ')' { $$ = $3; }
1030 | { $$ = 0; }
1031 ;
1032
1eec346e
NC
1033opt_align_with_input:
1034 ALIGN_WITH_INPUT { $$ = ALIGN_WITH_INPUT; }
1035 | { $$ = 0; }
1036 ;
1037
7e7d5768
AM
1038opt_subalign:
1039 SUBALIGN '(' exp ')' { $$ = $3; }
1040 | { $$ = 0; }
1041 ;
1042
0841712e
JJ
1043sect_constraint:
1044 ONLY_IF_RO { $$ = ONLY_IF_RO; }
1045 | ONLY_IF_RW { $$ = ONLY_IF_RW; }
0cf7d72c 1046 | SPECIAL { $$ = SPECIAL; }
0841712e
JJ
1047 | { $$ = 0; }
1048 ;
1049
6c93cebf
AM
1050section: NAME
1051 { ldlex_expression(); }
d038301c 1052 opt_exp_with_type
7e7d5768 1053 opt_at
bbf115d3 1054 opt_align
1eec346e 1055 opt_align_with_input
6c93cebf 1056 opt_subalign
0841712e 1057 sect_constraint
252b5132 1058 {
af29a8ab
AM
1059 ldlex_popstate ();
1060 ldlex_wild ();
6c93cebf
AM
1061 lang_enter_output_section_statement($1, $3, sectype,
1062 $5, $7, $4,
af29a8ab 1063 $8, $6);
252b5132 1064 }
af29a8ab 1065 '{'
d038301c 1066 statement_list_opt
6c93cebf 1067 '}'
af29a8ab 1068 { ldlex_popstate (); }
562d3460 1069 memspec_opt memspec_at_opt phdr_opt fill_opt
6c93cebf 1070 {
4ffb22ec
AM
1071 /* fill_opt may have switched the lexer into
1072 expression state, and back again, but in
1073 order to find the end of the fill
1074 expression the parser must look ahead one
1075 token. If it is a NAME, throw it away as
1076 it will have been lexed in the wrong
1077 state. */
1078 if (yychar == NAME)
1079 {
1080 yyclearin;
1081 ldlex_backup ();
1082 }
af29a8ab
AM
1083 lang_leave_output_section_statement ($17, $14,
1084 $16, $15);
6c93cebf 1085 }
252b5132
RH
1086 opt_comma
1087 | OVERLAY
1088 { ldlex_expression (); }
7e7d5768 1089 opt_exp_without_type opt_nocrossrefs opt_at opt_subalign
af29a8ab 1090 { ldlex_popstate (); }
d038301c 1091 '{'
252b5132 1092 {
7e7d5768 1093 lang_enter_overlay ($3, $6);
252b5132
RH
1094 }
1095 overlay_section
1096 '}'
562d3460 1097 memspec_opt memspec_at_opt phdr_opt fill_opt
252b5132 1098 {
4ffb22ec
AM
1099 if (yychar == NAME)
1100 {
1101 yyclearin;
1102 ldlex_backup ();
1103 }
9f88b410 1104 lang_leave_overlay ($5, (int) $4,
af29a8ab 1105 $15, $12, $14, $13);
252b5132
RH
1106 }
1107 opt_comma
1108 | /* The GROUP case is just enough to support the gcc
1109 svr3.ifile script. It is not intended to be full
1110 support. I'm not even sure what GROUP is supposed
1111 to mean. */
6c93cebf
AM
1112 GROUP
1113 { ldlex_expression (); }
252b5132 1114 opt_exp_with_type
6c93cebf
AM
1115 {
1116 ldlex_popstate ();
1117 lang_add_assignment (exp_assign (".", $3, false));
1118 }
252b5132 1119 '{' sec_or_group_p1 '}'
4006703d 1120 | INCLUDE filename
6c93cebf 1121 {
6c93cebf
AM
1122 ldfile_open_command_file ($2);
1123 }
4006703d 1124 sec_or_group_p1 END
252b5132
RH
1125 ;
1126
1127type:
1128 NOLOAD { sectype = noload_section; }
02a38f92
AM
1129 | DSECT { sectype = noalloc_section; }
1130 | COPY { sectype = noalloc_section; }
1131 | INFO { sectype = noalloc_section; }
1132 | OVERLAY { sectype = noalloc_section; }
6b86da53 1133 | READONLY { sectype = readonly_section; }
252b5132
RH
1134 ;
1135
1136atype:
6c19b93b
AM
1137 '(' type ')'
1138 | /* EMPTY */ { sectype = normal_section; }
1139 | '(' ')' { sectype = normal_section; }
252b5132
RH
1140 ;
1141
1142opt_exp_with_type:
1143 exp atype ':' { $$ = $1; }
1144 | atype ':' { $$ = (etree_type *)NULL; }
1145 | /* The BIND cases are to support the gcc svr3.ifile
1146 script. They aren't intended to implement full
1147 support for the BIND keyword. I'm not even sure
1148 what BIND is supposed to mean. */
1149 BIND '(' exp ')' atype ':' { $$ = $3; }
1150 | BIND '(' exp ')' BLOCK '(' exp ')' atype ':'
1151 { $$ = $3; }
1152 ;
1153
1154opt_exp_without_type:
1155 exp ':' { $$ = $1; }
1156 | ':' { $$ = (etree_type *) NULL; }
1157 ;
1158
1159opt_nocrossrefs:
1160 /* empty */
1161 { $$ = 0; }
1162 | NOCROSSREFS
1163 { $$ = 1; }
1164 ;
1165
1166memspec_opt:
1167 '>' NAME
1168 { $$ = $2; }
a747ee4d 1169 | { $$ = DEFAULT_MEMORY_REGION; }
252b5132
RH
1170 ;
1171
1172phdr_opt:
1173 /* empty */
1174 {
1175 $$ = NULL;
1176 }
1177 | phdr_opt ':' NAME
1178 {
1179 struct lang_output_section_phdr_list *n;
1180
1181 n = ((struct lang_output_section_phdr_list *)
1182 xmalloc (sizeof *n));
1183 n->name = $3;
f38a2680 1184 n->used = false;
252b5132
RH
1185 n->next = $1;
1186 $$ = n;
1187 }
1188 ;
1189
1190overlay_section:
1191 /* empty */
1192 | overlay_section
1193 NAME
1194 {
af29a8ab 1195 ldlex_wild ();
252b5132
RH
1196 lang_enter_overlay_section ($2);
1197 }
af29a8ab
AM
1198 '{'
1199 statement_list_opt
1200 '}'
1201 { ldlex_popstate (); }
252b5132
RH
1202 phdr_opt fill_opt
1203 {
4ffb22ec
AM
1204 if (yychar == NAME)
1205 {
1206 yyclearin;
1207 ldlex_backup ();
1208 }
252b5132
RH
1209 lang_leave_overlay_section ($9, $8);
1210 }
1211 opt_comma
1212 ;
1213
1214phdrs:
1215 PHDRS '{' phdr_list '}'
1216 ;
1217
1218phdr_list:
1219 /* empty */
1220 | phdr_list phdr
1221 ;
1222
1223phdr:
1224 NAME { ldlex_expression (); }
1225 phdr_type phdr_qualifiers { ldlex_popstate (); }
1226 ';'
1227 {
1228 lang_new_phdr ($1, $3, $4.filehdr, $4.phdrs, $4.at,
1229 $4.flags);
1230 }
1231 ;
1232
1233phdr_type:
1234 exp
1235 {
1236 $$ = $1;
1237
1238 if ($1->type.node_class == etree_name
1239 && $1->type.node_code == NAME)
1240 {
1241 const char *s;
1242 unsigned int i;
1243 static const char * const phdr_types[] =
1244 {
1245 "PT_NULL", "PT_LOAD", "PT_DYNAMIC",
1246 "PT_INTERP", "PT_NOTE", "PT_SHLIB",
d038301c 1247 "PT_PHDR", "PT_TLS"
252b5132
RH
1248 };
1249
1250 s = $1->name.name;
1251 for (i = 0;
1252 i < sizeof phdr_types / sizeof phdr_types[0];
1253 i++)
1254 if (strcmp (s, phdr_types[i]) == 0)
1255 {
1256 $$ = exp_intop (i);
1257 break;
1258 }
d038301c
RM
1259 if (i == sizeof phdr_types / sizeof phdr_types[0])
1260 {
1261 if (strcmp (s, "PT_GNU_EH_FRAME") == 0)
1262 $$ = exp_intop (0x6474e550);
9ee5e499
JJ
1263 else if (strcmp (s, "PT_GNU_STACK") == 0)
1264 $$ = exp_intop (0x6474e551);
ee9e412f
NC
1265 else if (strcmp (s, "PT_GNU_RELRO") == 0)
1266 $$ = exp_intop (0x6474e552);
1267 else if (strcmp (s, "PT_GNU_PROPERTY") == 0)
1268 $$ = exp_intop (0x6474e553);
d038301c
RM
1269 else
1270 {
1271 einfo (_("\
c1c8c1ef 1272%X%P:%pS: unknown phdr type `%s' (try integer literal)\n"),
dab69f68 1273 NULL, s);
d038301c
RM
1274 $$ = exp_intop (0);
1275 }
1276 }
252b5132
RH
1277 }
1278 }
1279 ;
1280
1281phdr_qualifiers:
1282 /* empty */
1283 {
1284 memset (&$$, 0, sizeof (struct phdr_info));
1285 }
1286 | NAME phdr_val phdr_qualifiers
1287 {
1288 $$ = $3;
1289 if (strcmp ($1, "FILEHDR") == 0 && $2 == NULL)
f38a2680 1290 $$.filehdr = true;
252b5132 1291 else if (strcmp ($1, "PHDRS") == 0 && $2 == NULL)
f38a2680 1292 $$.phdrs = true;
252b5132
RH
1293 else if (strcmp ($1, "FLAGS") == 0 && $2 != NULL)
1294 $$.flags = $2;
1295 else
c1c8c1ef 1296 einfo (_("%X%P:%pS: PHDRS syntax error at `%s'\n"),
dab69f68 1297 NULL, $1);
252b5132
RH
1298 }
1299 | AT '(' exp ')' phdr_qualifiers
1300 {
1301 $$ = $5;
1302 $$.at = $3;
1303 }
1304 ;
1305
1306phdr_val:
1307 /* empty */
1308 {
1309 $$ = NULL;
1310 }
1311 | '(' exp ')'
1312 {
1313 $$ = $2;
1314 }
1315 ;
1316
55255dae
L
1317dynamic_list_file:
1318 {
1319 ldlex_version_file ();
1320 PUSH_ERROR (_("dynamic list"));
1321 }
1322 dynamic_list_nodes
1323 {
1324 ldlex_popstate ();
1325 POP_ERROR ();
1326 }
1327 ;
1328
1329dynamic_list_nodes:
1330 dynamic_list_node
1331 | dynamic_list_nodes dynamic_list_node
1332 ;
1333
1334dynamic_list_node:
1335 '{' dynamic_list_tag '}' ';'
1336 ;
1337
1338dynamic_list_tag:
1339 vers_defns ';'
1340 {
37a141bf 1341 lang_append_dynamic_list (current_dynamic_list_p, $1);
55255dae
L
1342 }
1343 ;
1344
252b5132
RH
1345/* This syntax is used within an external version script file. */
1346
1347version_script_file:
1348 {
1349 ldlex_version_file ();
1350 PUSH_ERROR (_("VERSION script"));
1351 }
1352 vers_nodes
1353 {
1354 ldlex_popstate ();
1355 POP_ERROR ();
1356 }
1357 ;
1358
1359/* This is used within a normal linker script file. */
1360
1361version:
1362 {
1363 ldlex_version_script ();
1364 }
1365 VERSIONK '{' vers_nodes '}'
1366 {
1367 ldlex_popstate ();
1368 }
1369 ;
1370
1371vers_nodes:
1372 vers_node
1373 | vers_nodes vers_node
1374 ;
1375
1376vers_node:
6b9b879a
JJ
1377 '{' vers_tag '}' ';'
1378 {
1379 lang_register_vers_node (NULL, $2, NULL);
1380 }
1381 | VERS_TAG '{' vers_tag '}' ';'
252b5132
RH
1382 {
1383 lang_register_vers_node ($1, $3, NULL);
1384 }
1385 | VERS_TAG '{' vers_tag '}' verdep ';'
1386 {
1387 lang_register_vers_node ($1, $3, $5);
1388 }
1389 ;
1390
1391verdep:
1392 VERS_TAG
1393 {
1394 $$ = lang_add_vers_depend (NULL, $1);
1395 }
1396 | verdep VERS_TAG
1397 {
1398 $$ = lang_add_vers_depend ($1, $2);
1399 }
1400 ;
1401
1402vers_tag:
1403 /* empty */
1404 {
1405 $$ = lang_new_vers_node (NULL, NULL);
1406 }
1407 | vers_defns ';'
1408 {
1409 $$ = lang_new_vers_node ($1, NULL);
1410 }
1411 | GLOBAL ':' vers_defns ';'
1412 {
1413 $$ = lang_new_vers_node ($3, NULL);
1414 }
1415 | LOCAL ':' vers_defns ';'
1416 {
1417 $$ = lang_new_vers_node (NULL, $3);
1418 }
1419 | GLOBAL ':' vers_defns ';' LOCAL ':' vers_defns ';'
1420 {
1421 $$ = lang_new_vers_node ($3, $7);
1422 }
1423 ;
1424
1425vers_defns:
1426 VERS_IDENTIFIER
1427 {
f38a2680 1428 $$ = lang_new_vers_pattern (NULL, $1, ldgram_vers_current_lang, false);
86043bbb 1429 }
6c19b93b 1430 | NAME
86043bbb 1431 {
f38a2680 1432 $$ = lang_new_vers_pattern (NULL, $1, ldgram_vers_current_lang, true);
252b5132
RH
1433 }
1434 | vers_defns ';' VERS_IDENTIFIER
1435 {
f38a2680 1436 $$ = lang_new_vers_pattern ($1, $3, ldgram_vers_current_lang, false);
86043bbb
MM
1437 }
1438 | vers_defns ';' NAME
1439 {
f38a2680 1440 $$ = lang_new_vers_pattern ($1, $3, ldgram_vers_current_lang, true);
252b5132 1441 }
8e23b15d
AM
1442 | vers_defns ';' EXTERN NAME '{'
1443 {
1444 $<name>$ = ldgram_vers_current_lang;
1445 ldgram_vers_current_lang = $4;
1446 }
1447 vers_defns opt_semicolon '}'
1448 {
96f8ade5
JJ
1449 struct bfd_elf_version_expr *pat;
1450 for (pat = $7; pat->next != NULL; pat = pat->next);
1451 pat->next = $1;
8e23b15d
AM
1452 $$ = $7;
1453 ldgram_vers_current_lang = $<name>6;
1454 }
252b5132
RH
1455 | EXTERN NAME '{'
1456 {
1457 $<name>$ = ldgram_vers_current_lang;
1458 ldgram_vers_current_lang = $2;
1459 }
8e23b15d 1460 vers_defns opt_semicolon '}'
252b5132 1461 {
e06cae36 1462 $$ = $5;
252b5132
RH
1463 ldgram_vers_current_lang = $<name>4;
1464 }
96f8ade5
JJ
1465 | GLOBAL
1466 {
f38a2680 1467 $$ = lang_new_vers_pattern (NULL, "global", ldgram_vers_current_lang, false);
96f8ade5
JJ
1468 }
1469 | vers_defns ';' GLOBAL
1470 {
f38a2680 1471 $$ = lang_new_vers_pattern ($1, "global", ldgram_vers_current_lang, false);
96f8ade5
JJ
1472 }
1473 | LOCAL
1474 {
f38a2680 1475 $$ = lang_new_vers_pattern (NULL, "local", ldgram_vers_current_lang, false);
96f8ade5
JJ
1476 }
1477 | vers_defns ';' LOCAL
1478 {
f38a2680 1479 $$ = lang_new_vers_pattern ($1, "local", ldgram_vers_current_lang, false);
96f8ade5
JJ
1480 }
1481 | EXTERN
1482 {
f38a2680 1483 $$ = lang_new_vers_pattern (NULL, "extern", ldgram_vers_current_lang, false);
96f8ade5
JJ
1484 }
1485 | vers_defns ';' EXTERN
1486 {
f38a2680 1487 $$ = lang_new_vers_pattern ($1, "extern", ldgram_vers_current_lang, false);
96f8ade5 1488 }
252b5132
RH
1489 ;
1490
8e23b15d
AM
1491opt_semicolon:
1492 /* empty */
1493 | ';'
1494 ;
1495
252b5132
RH
1496%%
1497void
d038301c 1498yyerror(arg)
252b5132 1499 const char *arg;
d038301c 1500{
252b5132
RH
1501 if (ldfile_assumed_script)
1502 einfo (_("%P:%s: file format not recognized; treating as linker script\n"),
dab69f68 1503 ldlex_filename ());
252b5132 1504 if (error_index > 0 && error_index < ERROR_NAME_MAX)
df5f2391 1505 einfo ("%F%P:%pS: %s in %s\n", NULL, arg, error_names[error_index - 1]);
252b5132 1506 else
df5f2391 1507 einfo ("%F%P:%pS: %s\n", NULL, arg);
252b5132 1508}