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