]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - ld/ldgram.y
* emulparams/elf_x86_64.sh: Revert last change.
[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,
b717d30e 3 2001, 2002, 2003, 2004, 2005 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
7e7d5768 95%type <etree> opt_exp_without_type opt_subalign
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
b717d30e 145%token ALIGNMOD AT SUBALIGN PROVIDE 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
RH
154%token EXCLUDE_FILE
155%type <versyms> vers_defns
156%type <versnode> vers_tag
157%type <deflist> verdep
158
159%%
160
d038301c 161file:
252b5132
RH
162 INPUT_SCRIPT script_file
163 | INPUT_MRI_SCRIPT mri_script_file
164 | INPUT_VERSION_SCRIPT version_script_file
165 | INPUT_DEFSYM defsym_expr
166 ;
167
168
169filename: NAME;
170
171
172defsym_expr:
173 { ldlex_defsym(); }
174 NAME '=' exp
175 {
176 ldlex_popstate();
177 lang_add_assignment(exp_assop($3,$2,$4));
178 }
944cd72c 179 ;
252b5132 180
d038301c 181/* SYNTAX WITHIN AN MRI SCRIPT FILE */
252b5132
RH
182mri_script_file:
183 {
184 ldlex_mri_script ();
185 PUSH_ERROR (_("MRI style script"));
186 }
187 mri_script_lines
188 {
189 ldlex_popstate ();
190 mri_draw_tree ();
191 POP_ERROR ();
192 }
193 ;
194
195mri_script_lines:
196 mri_script_lines mri_script_command NEWLINE
197 |
198 ;
199
200mri_script_command:
d038301c 201 CHIP exp
252b5132
RH
202 | CHIP exp ',' exp
203 | NAME {
204 einfo(_("%P%F: unrecognised keyword in MRI style script '%s'\n"),$1);
205 }
206 | LIST {
207 config.map_filename = "-";
208 }
209 | ORDER ordernamelist
d038301c 210 | ENDWORD
252b5132
RH
211 | PUBLIC NAME '=' exp
212 { mri_public($2, $4); }
213 | PUBLIC NAME ',' exp
214 { mri_public($2, $4); }
d038301c 215 | PUBLIC NAME exp
252b5132
RH
216 { mri_public($2, $3); }
217 | FORMAT NAME
218 { mri_format($2); }
219 | SECT NAME ',' exp
220 { mri_output_section($2, $4);}
221 | SECT NAME exp
222 { mri_output_section($2, $3);}
223 | SECT NAME '=' exp
224 { mri_output_section($2, $4);}
225 | ALIGN_K NAME '=' exp
226 { mri_align($2,$4); }
227 | ALIGN_K NAME ',' exp
228 { mri_align($2,$4); }
229 | ALIGNMOD NAME '=' exp
230 { mri_alignmod($2,$4); }
231 | ALIGNMOD NAME ',' exp
232 { mri_alignmod($2,$4); }
233 | ABSOLUTE mri_abs_name_list
234 | LOAD mri_load_name_list
d038301c
RM
235 | NAMEWORD NAME
236 { mri_name($2); }
252b5132
RH
237 | ALIAS NAME ',' NAME
238 { mri_alias($2,$4,0);}
239 | ALIAS NAME ',' INT
2c382fb6 240 { mri_alias ($2, 0, (int) $4.integer); }
252b5132
RH
241 | BASE exp
242 { mri_base($2); }
2c382fb6
AM
243 | TRUNCATE INT
244 { mri_truncate ((unsigned int) $2.integer); }
252b5132
RH
245 | CASE casesymlist
246 | EXTERN extern_name_list
247 | INCLUDE filename
b47c4208
AM
248 { ldlex_script (); ldfile_open_command_file($2); }
249 mri_script_lines END
250 { ldlex_popstate (); }
252b5132 251 | START NAME
b34976b6 252 { lang_add_entry ($2, FALSE); }
252b5132
RH
253 |
254 ;
255
256ordernamelist:
257 ordernamelist ',' NAME { mri_order($3); }
258 | ordernamelist NAME { mri_order($2); }
259 |
260 ;
261
262mri_load_name_list:
263 NAME
264 { mri_load($1); }
265 | mri_load_name_list ',' NAME { mri_load($3); }
266 ;
267
268mri_abs_name_list:
269 NAME
270 { mri_only_load($1); }
271 | mri_abs_name_list ',' NAME
272 { mri_only_load($3); }
273 ;
274
275casesymlist:
276 /* empty */ { $$ = NULL; }
277 | NAME
278 | casesymlist ',' NAME
279 ;
280
281extern_name_list:
282 NAME
283 { ldlang_add_undef ($1); }
284 | extern_name_list NAME
285 { ldlang_add_undef ($2); }
286 | extern_name_list ',' NAME
287 { ldlang_add_undef ($3); }
288 ;
289
290script_file:
291 {
292 ldlex_both();
293 }
294 ifile_list
295 {
296 ldlex_popstate();
297 }
298 ;
299
300
301ifile_list:
302 ifile_list ifile_p1
303 |
304 ;
305
306
307
308ifile_p1:
309 memory
310 | sections
311 | phdrs
312 | startup
313 | high_level_library
314 | low_level_library
315 | floating_point_support
316 | statement_anywhere
317 | version
318 | ';'
319 | TARGET_K '(' NAME ')'
320 { lang_add_target($3); }
321 | SEARCH_DIR '(' filename ')'
b34976b6 322 { ldfile_add_library_path ($3, FALSE); }
252b5132
RH
323 | OUTPUT '(' filename ')'
324 { lang_add_output($3, 1); }
325 | OUTPUT_FORMAT '(' NAME ')'
326 { lang_add_output_format ($3, (char *) NULL,
327 (char *) NULL, 1); }
328 | OUTPUT_FORMAT '(' NAME ',' NAME ',' NAME ')'
329 { lang_add_output_format ($3, $5, $7, 1); }
330 | OUTPUT_ARCH '(' NAME ')'
5e2f1575 331 { ldfile_set_output_arch ($3, bfd_arch_unknown); }
252b5132 332 | FORCE_COMMON_ALLOCATION
b34976b6 333 { command_line.force_common_definition = TRUE ; }
4818e05f 334 | INHIBIT_COMMON_ALLOCATION
b34976b6 335 { command_line.inhibit_common_definition = TRUE ; }
252b5132
RH
336 | INPUT '(' input_list ')'
337 | GROUP
338 { lang_enter_group (); }
339 '(' input_list ')'
340 { lang_leave_group (); }
341 | MAP '(' filename ')'
342 { lang_add_map($3); }
d038301c 343 | INCLUDE filename
b47c4208
AM
344 { ldlex_script (); ldfile_open_command_file($2); }
345 ifile_list END
346 { ldlex_popstate (); }
252b5132
RH
347 | NOCROSSREFS '(' nocrossref_list ')'
348 {
349 lang_add_nocrossref ($3);
350 }
351 | EXTERN '(' extern_name_list ')'
352 ;
353
354input_list:
355 NAME
356 { lang_add_input_file($1,lang_input_file_is_search_file_enum,
357 (char *)NULL); }
358 | input_list ',' NAME
359 { lang_add_input_file($3,lang_input_file_is_search_file_enum,
360 (char *)NULL); }
361 | input_list NAME
362 { lang_add_input_file($2,lang_input_file_is_search_file_enum,
363 (char *)NULL); }
364 | LNAME
365 { lang_add_input_file($1,lang_input_file_is_l_enum,
366 (char *)NULL); }
367 | input_list ',' LNAME
368 { lang_add_input_file($3,lang_input_file_is_l_enum,
369 (char *)NULL); }
370 | input_list LNAME
371 { lang_add_input_file($2,lang_input_file_is_l_enum,
372 (char *)NULL); }
b717d30e
JJ
373 | AS_NEEDED '('
374 { $<integer>$ = as_needed; as_needed = TRUE; }
375 input_list ')'
376 { as_needed = $<integer>3; }
377 | input_list ',' AS_NEEDED '('
378 { $<integer>$ = as_needed; as_needed = TRUE; }
379 input_list ')'
380 { as_needed = $<integer>5; }
381 | input_list AS_NEEDED '('
382 { $<integer>$ = as_needed; as_needed = TRUE; }
383 input_list ')'
384 { as_needed = $<integer>4; }
252b5132
RH
385 ;
386
387sections:
388 SECTIONS '{' sec_or_group_p1 '}'
389 ;
390
391sec_or_group_p1:
392 sec_or_group_p1 section
393 | sec_or_group_p1 statement_anywhere
394 |
395 ;
396
397statement_anywhere:
398 ENTRY '(' NAME ')'
b34976b6 399 { lang_add_entry ($3, FALSE); }
252b5132 400 | assignment end
b6ca8815
NS
401 | ASSERT_K {ldlex_expression ();} '(' exp ',' NAME ')'
402 { ldlex_popstate ();
403 lang_add_assignment (exp_assert ($4, $6)); }
252b5132
RH
404 ;
405
406/* The '*' and '?' cases are there because the lexer returns them as
407 separate tokens rather than as NAME. */
408wildcard_name:
409 NAME
410 {
411 $$ = $1;
412 }
413 | '*'
414 {
415 $$ = "*";
416 }
417 | '?'
418 {
419 $$ = "?";
420 }
421 ;
422
423wildcard_spec:
424 wildcard_name
425 {
426 $$.name = $1;
bcaa7b3e 427 $$.sorted = none;
18625d54 428 $$.exclude_name_list = NULL;
252b5132 429 }
18625d54 430 | EXCLUDE_FILE '(' exclude_name_list ')' wildcard_name
252b5132
RH
431 {
432 $$.name = $5;
bcaa7b3e 433 $$.sorted = none;
18625d54 434 $$.exclude_name_list = $3;
252b5132 435 }
bcaa7b3e 436 | SORT_BY_NAME '(' wildcard_name ')'
252b5132
RH
437 {
438 $$.name = $3;
bcaa7b3e 439 $$.sorted = by_name;
18625d54 440 $$.exclude_name_list = NULL;
252b5132 441 }
bcaa7b3e
L
442 | SORT_BY_ALIGNMENT '(' wildcard_name ')'
443 {
444 $$.name = $3;
445 $$.sorted = by_alignment;
446 $$.exclude_name_list = NULL;
447 }
448 | SORT_BY_NAME '(' SORT_BY_ALIGNMENT '(' wildcard_name ')' ')'
449 {
450 $$.name = $5;
451 $$.sorted = by_name_alignment;
452 $$.exclude_name_list = NULL;
453 }
454 | SORT_BY_NAME '(' SORT_BY_NAME '(' wildcard_name ')' ')'
455 {
456 $$.name = $5;
457 $$.sorted = by_name;
458 $$.exclude_name_list = NULL;
459 }
460 | SORT_BY_ALIGNMENT '(' SORT_BY_NAME '(' wildcard_name ')' ')'
461 {
462 $$.name = $5;
463 $$.sorted = by_alignment_name;
464 $$.exclude_name_list = NULL;
465 }
466 | SORT_BY_ALIGNMENT '(' SORT_BY_ALIGNMENT '(' wildcard_name ')' ')'
467 {
468 $$.name = $5;
469 $$.sorted = by_alignment;
470 $$.exclude_name_list = NULL;
471 }
472 | SORT_BY_NAME '(' EXCLUDE_FILE '(' exclude_name_list ')' wildcard_name ')'
252b5132
RH
473 {
474 $$.name = $7;
bcaa7b3e 475 $$.sorted = by_name;
18625d54 476 $$.exclude_name_list = $5;
252b5132
RH
477 }
478 ;
479
18625d54 480exclude_name_list:
765b7cbe 481 exclude_name_list wildcard_name
18625d54
CM
482 {
483 struct name_list *tmp;
484 tmp = (struct name_list *) xmalloc (sizeof *tmp);
765b7cbe 485 tmp->name = $2;
18625d54 486 tmp->next = $1;
d038301c 487 $$ = tmp;
18625d54
CM
488 }
489 |
490 wildcard_name
491 {
492 struct name_list *tmp;
493 tmp = (struct name_list *) xmalloc (sizeof *tmp);
494 tmp->name = $1;
495 tmp->next = NULL;
496 $$ = tmp;
497 }
498 ;
499
252b5132 500file_NAME_list:
b6bf44ba 501 file_NAME_list opt_comma wildcard_spec
252b5132 502 {
b6bf44ba
AM
503 struct wildcard_list *tmp;
504 tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
505 tmp->next = $1;
506 tmp->spec = $3;
507 $$ = tmp;
252b5132 508 }
b6bf44ba
AM
509 |
510 wildcard_spec
252b5132 511 {
b6bf44ba
AM
512 struct wildcard_list *tmp;
513 tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
514 tmp->next = NULL;
515 tmp->spec = $1;
516 $$ = tmp;
252b5132
RH
517 }
518 ;
519
520input_section_spec_no_keep:
521 NAME
522 {
b6bf44ba
AM
523 struct wildcard_spec tmp;
524 tmp.name = $1;
525 tmp.exclude_name_list = NULL;
bcaa7b3e 526 tmp.sorted = none;
b6bf44ba 527 lang_add_wild (&tmp, NULL, ldgram_had_keep);
252b5132 528 }
b6bf44ba 529 | '[' file_NAME_list ']'
252b5132 530 {
b6bf44ba 531 lang_add_wild (NULL, $2, ldgram_had_keep);
252b5132 532 }
b6bf44ba 533 | wildcard_spec '(' file_NAME_list ')'
252b5132 534 {
b6bf44ba 535 lang_add_wild (&$1, $3, ldgram_had_keep);
252b5132 536 }
252b5132
RH
537 ;
538
539input_section_spec:
540 input_section_spec_no_keep
541 | KEEP '('
b34976b6 542 { ldgram_had_keep = TRUE; }
252b5132 543 input_section_spec_no_keep ')'
b34976b6 544 { ldgram_had_keep = FALSE; }
252b5132
RH
545 ;
546
547statement:
548 assignment end
549 | CREATE_OBJECT_SYMBOLS
550 {
d038301c 551 lang_add_attribute(lang_object_symbols_statement_enum);
252b5132
RH
552 }
553 | ';'
554 | CONSTRUCTORS
555 {
d038301c
RM
556
557 lang_add_attribute(lang_constructors_statement_enum);
252b5132 558 }
bcaa7b3e 559 | SORT_BY_NAME '(' CONSTRUCTORS ')'
252b5132 560 {
b34976b6 561 constructors_sorted = TRUE;
252b5132
RH
562 lang_add_attribute (lang_constructors_statement_enum);
563 }
564 | input_section_spec
565 | length '(' mustbe_exp ')'
566 {
2c382fb6 567 lang_add_data ((int) $1, $3);
252b5132 568 }
d038301c 569
2c382fb6 570 | FILL '(' fill_exp ')'
252b5132 571 {
2c382fb6 572 lang_add_fill ($3);
252b5132
RH
573 }
574 ;
575
576statement_list:
577 statement_list statement
578 | statement
579 ;
d038301c 580
252b5132
RH
581statement_list_opt:
582 /* empty */
583 | statement_list
584 ;
585
586length:
587 QUAD
588 { $$ = $1; }
589 | SQUAD
590 { $$ = $1; }
591 | LONG
592 { $$ = $1; }
593 | SHORT
594 { $$ = $1; }
595 | BYTE
596 { $$ = $1; }
597 ;
598
2c382fb6
AM
599fill_exp:
600 mustbe_exp
252b5132 601 {
e9ee469a 602 $$ = exp_get_fill ($1, 0, "fill value");
252b5132 603 }
252b5132
RH
604 ;
605
2c382fb6
AM
606fill_opt:
607 '=' fill_exp
608 { $$ = $2; }
609 | { $$ = (fill_type *) 0; }
610 ;
252b5132
RH
611
612assign_op:
613 PLUSEQ
614 { $$ = '+'; }
615 | MINUSEQ
616 { $$ = '-'; }
617 | MULTEQ
618 { $$ = '*'; }
619 | DIVEQ
620 { $$ = '/'; }
621 | LSHIFTEQ
622 { $$ = LSHIFT; }
623 | RSHIFTEQ
624 { $$ = RSHIFT; }
625 | ANDEQ
626 { $$ = '&'; }
627 | OREQ
628 { $$ = '|'; }
629
630 ;
631
632end: ';' | ','
633 ;
634
635
636assignment:
637 NAME '=' mustbe_exp
638 {
639 lang_add_assignment (exp_assop ($2, $1, $3));
640 }
641 | NAME assign_op mustbe_exp
642 {
643 lang_add_assignment (exp_assop ('=', $1,
644 exp_binop ($2,
645 exp_nameop (NAME,
646 $1),
647 $3)));
648 }
649 | PROVIDE '(' NAME '=' mustbe_exp ')'
650 {
651 lang_add_assignment (exp_provide ($3, $5));
652 }
653 ;
654
655
656opt_comma:
657 ',' | ;
658
659
660memory:
661 MEMORY '{' memory_spec memory_spec_list '}'
662 ;
663
664memory_spec_list:
665 memory_spec_list memory_spec
666 | memory_spec_list ',' memory_spec
667 |
668 ;
669
670
2d801b0f 671memory_spec: NAME
a747ee4d 672 { region = lang_memory_region_lookup ($1, TRUE); }
252b5132
RH
673 attributes_opt ':'
674 origin_spec opt_comma length_spec
2d801b0f 675 {}
74459f0e
TW
676 ;
677
678origin_spec:
252b5132 679 ORIGIN '=' mustbe_exp
e9ee469a
AM
680 {
681 region->origin = exp_get_vma ($3, 0, "origin");
682 region->current = region->origin;
683 }
252b5132
RH
684 ;
685
686length_spec:
687 LENGTH '=' mustbe_exp
e9ee469a
AM
688 {
689 region->length = exp_get_vma ($3, -1, "length");
252b5132 690 }
aa8804e4 691 ;
252b5132
RH
692
693attributes_opt:
aa8804e4
ILT
694 /* empty */
695 { /* dummy action to avoid bison 1.25 error message */ }
696 | '(' attributes_list ')'
697 ;
698
699attributes_list:
700 attributes_string
701 | attributes_list attributes_string
702 ;
703
704attributes_string:
705 NAME
706 { lang_set_flags (region, $1, 0); }
707 | '!' NAME
708 { lang_set_flags (region, $2, 1); }
252b5132
RH
709 ;
710
711startup:
712 STARTUP '(' filename ')'
713 { lang_startup($3); }
714 ;
715
716high_level_library:
717 HLL '(' high_level_library_NAME_list ')'
718 | HLL '(' ')'
719 { ldemul_hll((char *)NULL); }
720 ;
721
722high_level_library_NAME_list:
723 high_level_library_NAME_list opt_comma filename
724 { ldemul_hll($3); }
725 | filename
726 { ldemul_hll($1); }
727
728 ;
729
730low_level_library:
731 SYSLIB '(' low_level_library_NAME_list ')'
732 ; low_level_library_NAME_list:
733 low_level_library_NAME_list opt_comma filename
734 { ldemul_syslib($3); }
735 |
736 ;
737
738floating_point_support:
739 FLOAT
b34976b6 740 { lang_float(TRUE); }
252b5132 741 | NOFLOAT
b34976b6 742 { lang_float(FALSE); }
252b5132 743 ;
d038301c 744
252b5132
RH
745nocrossref_list:
746 /* empty */
747 {
748 $$ = NULL;
749 }
750 | NAME nocrossref_list
751 {
752 struct lang_nocrossref *n;
753
754 n = (struct lang_nocrossref *) xmalloc (sizeof *n);
755 n->name = $1;
756 n->next = $2;
757 $$ = n;
758 }
759 | NAME ',' nocrossref_list
760 {
761 struct lang_nocrossref *n;
762
763 n = (struct lang_nocrossref *) xmalloc (sizeof *n);
764 n->name = $1;
765 n->next = $3;
766 $$ = n;
767 }
768 ;
769
3ec57632 770mustbe_exp: { ldlex_expression (); }
252b5132 771 exp
3ec57632 772 { ldlex_popstate (); $$=$2;}
252b5132
RH
773 ;
774
775exp :
776 '-' exp %prec UNARY
3ec57632 777 { $$ = exp_unop ('-', $2); }
252b5132
RH
778 | '(' exp ')'
779 { $$ = $2; }
780 | NEXT '(' exp ')' %prec UNARY
3ec57632 781 { $$ = exp_unop ((int) $1,$3); }
252b5132 782 | '!' exp %prec UNARY
3ec57632 783 { $$ = exp_unop ('!', $2); }
252b5132
RH
784 | '+' exp %prec UNARY
785 { $$ = $2; }
786 | '~' exp %prec UNARY
3ec57632 787 { $$ = exp_unop ('~', $2);}
252b5132
RH
788
789 | exp '*' exp
3ec57632 790 { $$ = exp_binop ('*', $1, $3); }
252b5132 791 | exp '/' exp
3ec57632 792 { $$ = exp_binop ('/', $1, $3); }
252b5132 793 | exp '%' exp
3ec57632 794 { $$ = exp_binop ('%', $1, $3); }
252b5132 795 | exp '+' exp
3ec57632 796 { $$ = exp_binop ('+', $1, $3); }
252b5132 797 | exp '-' exp
3ec57632 798 { $$ = exp_binop ('-' , $1, $3); }
252b5132 799 | exp LSHIFT exp
3ec57632 800 { $$ = exp_binop (LSHIFT , $1, $3); }
252b5132 801 | exp RSHIFT exp
3ec57632 802 { $$ = exp_binop (RSHIFT , $1, $3); }
252b5132 803 | exp EQ exp
3ec57632 804 { $$ = exp_binop (EQ , $1, $3); }
252b5132 805 | exp NE exp
3ec57632 806 { $$ = exp_binop (NE , $1, $3); }
252b5132 807 | exp LE exp
3ec57632 808 { $$ = exp_binop (LE , $1, $3); }
252b5132 809 | exp GE exp
3ec57632 810 { $$ = exp_binop (GE , $1, $3); }
252b5132 811 | exp '<' exp
3ec57632 812 { $$ = exp_binop ('<' , $1, $3); }
252b5132 813 | exp '>' exp
3ec57632 814 { $$ = exp_binop ('>' , $1, $3); }
252b5132 815 | exp '&' exp
3ec57632 816 { $$ = exp_binop ('&' , $1, $3); }
252b5132 817 | exp '^' exp
3ec57632 818 { $$ = exp_binop ('^' , $1, $3); }
252b5132 819 | exp '|' exp
3ec57632 820 { $$ = exp_binop ('|' , $1, $3); }
252b5132 821 | exp '?' exp ':' exp
3ec57632 822 { $$ = exp_trinop ('?' , $1, $3, $5); }
252b5132 823 | exp ANDAND exp
3ec57632 824 { $$ = exp_binop (ANDAND , $1, $3); }
252b5132 825 | exp OROR exp
3ec57632 826 { $$ = exp_binop (OROR , $1, $3); }
252b5132 827 | DEFINED '(' NAME ')'
3ec57632 828 { $$ = exp_nameop (DEFINED, $3); }
252b5132 829 | INT
2c382fb6 830 { $$ = exp_bigintop ($1.integer, $1.str); }
252b5132 831 | SIZEOF_HEADERS
3ec57632 832 { $$ = exp_nameop (SIZEOF_HEADERS,0); }
252b5132
RH
833
834 | SIZEOF '(' NAME ')'
3ec57632 835 { $$ = exp_nameop (SIZEOF,$3); }
252b5132 836 | ADDR '(' NAME ')'
3ec57632 837 { $$ = exp_nameop (ADDR,$3); }
252b5132 838 | LOADADDR '(' NAME ')'
3ec57632 839 { $$ = exp_nameop (LOADADDR,$3); }
252b5132 840 | ABSOLUTE '(' exp ')'
3ec57632 841 { $$ = exp_unop (ABSOLUTE, $3); }
252b5132 842 | ALIGN_K '(' exp ')'
3ec57632 843 { $$ = exp_unop (ALIGN_K,$3); }
876f4090 844 | ALIGN_K '(' exp ',' exp ')'
3ec57632 845 { $$ = exp_binop (ALIGN_K,$3,$5); }
2d20f7bf
JJ
846 | DATA_SEGMENT_ALIGN '(' exp ',' exp ')'
847 { $$ = exp_binop (DATA_SEGMENT_ALIGN, $3, $5); }
a4f5ad88
JJ
848 | DATA_SEGMENT_RELRO_END '(' exp ',' exp ')'
849 { $$ = exp_binop (DATA_SEGMENT_RELRO_END, $5, $3); }
2d20f7bf 850 | DATA_SEGMENT_END '(' exp ')'
3ec57632 851 { $$ = exp_unop (DATA_SEGMENT_END, $3); }
ba916c8a
MM
852 | SEGMENT_START '(' NAME ',' exp ')'
853 { /* The operands to the expression node are
854 placed in the opposite order from the way
855 in which they appear in the script as
856 that allows us to reuse more code in
857 fold_binary. */
858 $$ = exp_binop (SEGMENT_START,
859 $5,
860 exp_nameop (NAME, $3)); }
252b5132 861 | BLOCK '(' exp ')'
3ec57632 862 { $$ = exp_unop (ALIGN_K,$3); }
252b5132 863 | NAME
3ec57632 864 { $$ = exp_nameop (NAME,$1); }
252b5132
RH
865 | MAX_K '(' exp ',' exp ')'
866 { $$ = exp_binop (MAX_K, $3, $5 ); }
867 | MIN_K '(' exp ',' exp ')'
868 { $$ = exp_binop (MIN_K, $3, $5 ); }
869 | ASSERT_K '(' exp ',' NAME ')'
870 { $$ = exp_assert ($3, $5); }
3ec57632
NC
871 | ORIGIN '(' NAME ')'
872 { $$ = exp_nameop (ORIGIN, $3); }
873 | LENGTH '(' NAME ')'
874 { $$ = exp_nameop (LENGTH, $3); }
252b5132
RH
875 ;
876
877
562d3460
TW
878memspec_at_opt:
879 AT '>' NAME { $$ = $3; }
9f88b410 880 | { $$ = 0; }
562d3460
TW
881 ;
882
252b5132
RH
883opt_at:
884 AT '(' exp ')' { $$ = $3; }
885 | { $$ = 0; }
886 ;
887
7e7d5768
AM
888opt_subalign:
889 SUBALIGN '(' exp ')' { $$ = $3; }
890 | { $$ = 0; }
891 ;
892
0841712e
JJ
893sect_constraint:
894 ONLY_IF_RO { $$ = ONLY_IF_RO; }
895 | ONLY_IF_RW { $$ = ONLY_IF_RW; }
0cf7d72c 896 | SPECIAL { $$ = SPECIAL; }
0841712e
JJ
897 | { $$ = 0; }
898 ;
899
252b5132 900section: NAME { ldlex_expression(); }
d038301c 901 opt_exp_with_type
7e7d5768
AM
902 opt_at
903 opt_subalign { ldlex_popstate (); ldlex_script (); }
0841712e 904 sect_constraint
252b5132
RH
905 '{'
906 {
907 lang_enter_output_section_statement($1, $3,
908 sectype,
0841712e 909 0, $5, $4, $7);
252b5132 910 }
d038301c 911 statement_list_opt
252b5132 912 '}' { ldlex_popstate (); ldlex_expression (); }
562d3460 913 memspec_opt memspec_at_opt phdr_opt fill_opt
252b5132
RH
914 {
915 ldlex_popstate ();
0841712e 916 lang_leave_output_section_statement ($16, $13, $15, $14);
252b5132
RH
917 }
918 opt_comma
2d801b0f 919 {}
252b5132
RH
920 | OVERLAY
921 { ldlex_expression (); }
7e7d5768 922 opt_exp_without_type opt_nocrossrefs opt_at opt_subalign
252b5132 923 { ldlex_popstate (); ldlex_script (); }
d038301c 924 '{'
252b5132 925 {
7e7d5768 926 lang_enter_overlay ($3, $6);
252b5132
RH
927 }
928 overlay_section
929 '}'
930 { ldlex_popstate (); ldlex_expression (); }
562d3460 931 memspec_opt memspec_at_opt phdr_opt fill_opt
252b5132
RH
932 {
933 ldlex_popstate ();
9f88b410 934 lang_leave_overlay ($5, (int) $4,
7e7d5768 935 $16, $13, $15, $14);
252b5132
RH
936 }
937 opt_comma
938 | /* The GROUP case is just enough to support the gcc
939 svr3.ifile script. It is not intended to be full
940 support. I'm not even sure what GROUP is supposed
941 to mean. */
942 GROUP { ldlex_expression (); }
943 opt_exp_with_type
944 {
945 ldlex_popstate ();
946 lang_add_assignment (exp_assop ('=', ".", $3));
947 }
948 '{' sec_or_group_p1 '}'
949 ;
950
951type:
952 NOLOAD { sectype = noload_section; }
953 | DSECT { sectype = dsect_section; }
954 | COPY { sectype = copy_section; }
955 | INFO { sectype = info_section; }
956 | OVERLAY { sectype = overlay_section; }
957 ;
958
959atype:
960 '(' type ')'
961 | /* EMPTY */ { sectype = normal_section; }
962 | '(' ')' { sectype = normal_section; }
963 ;
964
965opt_exp_with_type:
966 exp atype ':' { $$ = $1; }
967 | atype ':' { $$ = (etree_type *)NULL; }
968 | /* The BIND cases are to support the gcc svr3.ifile
969 script. They aren't intended to implement full
970 support for the BIND keyword. I'm not even sure
971 what BIND is supposed to mean. */
972 BIND '(' exp ')' atype ':' { $$ = $3; }
973 | BIND '(' exp ')' BLOCK '(' exp ')' atype ':'
974 { $$ = $3; }
975 ;
976
977opt_exp_without_type:
978 exp ':' { $$ = $1; }
979 | ':' { $$ = (etree_type *) NULL; }
980 ;
981
982opt_nocrossrefs:
983 /* empty */
984 { $$ = 0; }
985 | NOCROSSREFS
986 { $$ = 1; }
987 ;
988
989memspec_opt:
990 '>' NAME
991 { $$ = $2; }
a747ee4d 992 | { $$ = DEFAULT_MEMORY_REGION; }
252b5132
RH
993 ;
994
995phdr_opt:
996 /* empty */
997 {
998 $$ = NULL;
999 }
1000 | phdr_opt ':' NAME
1001 {
1002 struct lang_output_section_phdr_list *n;
1003
1004 n = ((struct lang_output_section_phdr_list *)
1005 xmalloc (sizeof *n));
1006 n->name = $3;
b34976b6 1007 n->used = FALSE;
252b5132
RH
1008 n->next = $1;
1009 $$ = n;
1010 }
1011 ;
1012
1013overlay_section:
1014 /* empty */
1015 | overlay_section
1016 NAME
1017 {
1018 ldlex_script ();
1019 lang_enter_overlay_section ($2);
1020 }
1021 '{' statement_list_opt '}'
1022 { ldlex_popstate (); ldlex_expression (); }
1023 phdr_opt fill_opt
1024 {
1025 ldlex_popstate ();
1026 lang_leave_overlay_section ($9, $8);
1027 }
1028 opt_comma
1029 ;
1030
1031phdrs:
1032 PHDRS '{' phdr_list '}'
1033 ;
1034
1035phdr_list:
1036 /* empty */
1037 | phdr_list phdr
1038 ;
1039
1040phdr:
1041 NAME { ldlex_expression (); }
1042 phdr_type phdr_qualifiers { ldlex_popstate (); }
1043 ';'
1044 {
1045 lang_new_phdr ($1, $3, $4.filehdr, $4.phdrs, $4.at,
1046 $4.flags);
1047 }
1048 ;
1049
1050phdr_type:
1051 exp
1052 {
1053 $$ = $1;
1054
1055 if ($1->type.node_class == etree_name
1056 && $1->type.node_code == NAME)
1057 {
1058 const char *s;
1059 unsigned int i;
1060 static const char * const phdr_types[] =
1061 {
1062 "PT_NULL", "PT_LOAD", "PT_DYNAMIC",
1063 "PT_INTERP", "PT_NOTE", "PT_SHLIB",
d038301c 1064 "PT_PHDR", "PT_TLS"
252b5132
RH
1065 };
1066
1067 s = $1->name.name;
1068 for (i = 0;
1069 i < sizeof phdr_types / sizeof phdr_types[0];
1070 i++)
1071 if (strcmp (s, phdr_types[i]) == 0)
1072 {
1073 $$ = exp_intop (i);
1074 break;
1075 }
d038301c
RM
1076 if (i == sizeof phdr_types / sizeof phdr_types[0])
1077 {
1078 if (strcmp (s, "PT_GNU_EH_FRAME") == 0)
1079 $$ = exp_intop (0x6474e550);
9ee5e499
JJ
1080 else if (strcmp (s, "PT_GNU_STACK") == 0)
1081 $$ = exp_intop (0x6474e551);
d038301c
RM
1082 else
1083 {
1084 einfo (_("\
1085%X%P:%S: unknown phdr type `%s' (try integer literal)\n"),
1086 s);
1087 $$ = exp_intop (0);
1088 }
1089 }
252b5132
RH
1090 }
1091 }
1092 ;
1093
1094phdr_qualifiers:
1095 /* empty */
1096 {
1097 memset (&$$, 0, sizeof (struct phdr_info));
1098 }
1099 | NAME phdr_val phdr_qualifiers
1100 {
1101 $$ = $3;
1102 if (strcmp ($1, "FILEHDR") == 0 && $2 == NULL)
b34976b6 1103 $$.filehdr = TRUE;
252b5132 1104 else if (strcmp ($1, "PHDRS") == 0 && $2 == NULL)
b34976b6 1105 $$.phdrs = TRUE;
252b5132
RH
1106 else if (strcmp ($1, "FLAGS") == 0 && $2 != NULL)
1107 $$.flags = $2;
1108 else
1109 einfo (_("%X%P:%S: PHDRS syntax error at `%s'\n"), $1);
1110 }
1111 | AT '(' exp ')' phdr_qualifiers
1112 {
1113 $$ = $5;
1114 $$.at = $3;
1115 }
1116 ;
1117
1118phdr_val:
1119 /* empty */
1120 {
1121 $$ = NULL;
1122 }
1123 | '(' exp ')'
1124 {
1125 $$ = $2;
1126 }
1127 ;
1128
1129/* This syntax is used within an external version script file. */
1130
1131version_script_file:
1132 {
1133 ldlex_version_file ();
1134 PUSH_ERROR (_("VERSION script"));
1135 }
1136 vers_nodes
1137 {
1138 ldlex_popstate ();
1139 POP_ERROR ();
1140 }
1141 ;
1142
1143/* This is used within a normal linker script file. */
1144
1145version:
1146 {
1147 ldlex_version_script ();
1148 }
1149 VERSIONK '{' vers_nodes '}'
1150 {
1151 ldlex_popstate ();
1152 }
1153 ;
1154
1155vers_nodes:
1156 vers_node
1157 | vers_nodes vers_node
1158 ;
1159
1160vers_node:
6b9b879a
JJ
1161 '{' vers_tag '}' ';'
1162 {
1163 lang_register_vers_node (NULL, $2, NULL);
1164 }
1165 | VERS_TAG '{' vers_tag '}' ';'
252b5132
RH
1166 {
1167 lang_register_vers_node ($1, $3, NULL);
1168 }
1169 | VERS_TAG '{' vers_tag '}' verdep ';'
1170 {
1171 lang_register_vers_node ($1, $3, $5);
1172 }
1173 ;
1174
1175verdep:
1176 VERS_TAG
1177 {
1178 $$ = lang_add_vers_depend (NULL, $1);
1179 }
1180 | verdep VERS_TAG
1181 {
1182 $$ = lang_add_vers_depend ($1, $2);
1183 }
1184 ;
1185
1186vers_tag:
1187 /* empty */
1188 {
1189 $$ = lang_new_vers_node (NULL, NULL);
1190 }
1191 | vers_defns ';'
1192 {
1193 $$ = lang_new_vers_node ($1, NULL);
1194 }
1195 | GLOBAL ':' vers_defns ';'
1196 {
1197 $$ = lang_new_vers_node ($3, NULL);
1198 }
1199 | LOCAL ':' vers_defns ';'
1200 {
1201 $$ = lang_new_vers_node (NULL, $3);
1202 }
1203 | GLOBAL ':' vers_defns ';' LOCAL ':' vers_defns ';'
1204 {
1205 $$ = lang_new_vers_node ($3, $7);
1206 }
1207 ;
1208
1209vers_defns:
1210 VERS_IDENTIFIER
1211 {
313e35ee 1212 $$ = lang_new_vers_pattern (NULL, $1, ldgram_vers_current_lang);
252b5132
RH
1213 }
1214 | vers_defns ';' VERS_IDENTIFIER
1215 {
313e35ee 1216 $$ = lang_new_vers_pattern ($1, $3, ldgram_vers_current_lang);
252b5132 1217 }
8e23b15d
AM
1218 | vers_defns ';' EXTERN NAME '{'
1219 {
1220 $<name>$ = ldgram_vers_current_lang;
1221 ldgram_vers_current_lang = $4;
1222 }
1223 vers_defns opt_semicolon '}'
1224 {
1225 $$ = $7;
1226 ldgram_vers_current_lang = $<name>6;
1227 }
252b5132
RH
1228 | EXTERN NAME '{'
1229 {
1230 $<name>$ = ldgram_vers_current_lang;
1231 ldgram_vers_current_lang = $2;
1232 }
8e23b15d 1233 vers_defns opt_semicolon '}'
252b5132 1234 {
e06cae36 1235 $$ = $5;
252b5132
RH
1236 ldgram_vers_current_lang = $<name>4;
1237 }
1238 ;
1239
8e23b15d
AM
1240opt_semicolon:
1241 /* empty */
1242 | ';'
1243 ;
1244
252b5132
RH
1245%%
1246void
d038301c 1247yyerror(arg)
252b5132 1248 const char *arg;
d038301c 1249{
252b5132
RH
1250 if (ldfile_assumed_script)
1251 einfo (_("%P:%s: file format not recognized; treating as linker script\n"),
1252 ldfile_input_filename);
1253 if (error_index > 0 && error_index < ERROR_NAME_MAX)
1254 einfo ("%P%F:%S: %s in %s\n", arg, error_names[error_index-1]);
1255 else
1256 einfo ("%P%F:%S: %s\n", arg);
1257}