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