update from FSF
[deliverable/binutils-gdb.git] / ld / ldgram.y
CommitLineData
c611e285
SC
1/* A YACC grammer to parse a superset of the AT&T linker scripting languaue.
2 Copyright (C) 1991 Free Software Foundation, Inc.
3 Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com).
2fa0b342 4
c611e285 5This file is part of GNU ld.
2fa0b342 6
c611e285
SC
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
2fa0b342 11
c611e285
SC
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
2fa0b342 16
c611e285
SC
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
20
21%{
22/*
2e2bf962 23
c611e285 24 */
2fa0b342 25
f177a611 26#define DONTDECLARE_MALLOC
2fa0b342 27
2fa0b342 28#include "bfd.h"
f177a611 29#include "sysdep.h"
2fa0b342
DHW
30#include "ld.h"
31#include "ldexp.h"
7cb9aa50 32#include "ldver.h"
2fa0b342 33#include "ldlang.h"
f177a611 34#include "ldemul.h"
2fa0b342
DHW
35#include "ldfile.h"
36#include "ldmisc.h"
3d2b83ea 37#include "mri.h"
f177a611 38
2fa0b342
DHW
39#define YYDEBUG 1
40
2fa0b342 41extern unsigned int lineno;
bbd2521f 42extern boolean trace_file_tries;
2fa0b342
DHW
43extern boolean trace_files;
44extern boolean write_map;
8ddef552 45extern int g_switch_value;
2fa0b342 46boolean hex_mode;
dadd414a 47static int typebits;
d646b568
SC
48strip_symbols_type strip_symbols=STRIP_NONE;
49discard_locals_type discard_locals=DISCARD_NONE;
2fa0b342
DHW
50
51
52lang_memory_region_type *region;
53
54
55lang_memory_region_type *lang_memory_region_lookup();
56lang_output_section_statement_type *lang_output_section_statement_lookup();
9fce28ed 57etree_type *lang_atin();
2fa0b342
DHW
58#ifdef __STDC__
59
60void lang_add_data(int type, union etree_union *exp);
9fce28ed 61void lang_enter_output_section_statement(char *output_section_statement_name, etree_type *address_exp, int flags, bfd_vma block_value,etree_type*,etree_type*, etree_type*);
2fa0b342
DHW
62
63#else
64
65void lang_add_data();
66void lang_enter_output_section_statement();
67
68#endif /* __STDC__ */
69
70extern args_type command_line;
71char *current_file;
72boolean ldgram_want_filename = true;
73boolean had_script = false;
74boolean force_make_executable = false;
1d45ccb3 75
1418c83b 76boolean ldgram_in_script = false;
1d45ccb3 77boolean ldgram_had_equals = false;
2fa0b342
DHW
78/* LOCALS */
79
80
3d2b83ea
SC
81#define ERROR_NAME_MAX 20
82static char *error_names[ERROR_NAME_MAX];
83static int error_index;
84#define PUSH_ERROR(x) if (error_index < ERROR_NAME_MAX) error_names[error_index] = x; error_index++;
85#define POP_ERROR() error_index--;
2fa0b342
DHW
86%}
87%union {
88 bfd_vma integer;
89 int voidval;
90 char *name;
91 int token;
92 union etree_union *etree;
8ddef552 93 struct sec *section;
2fa0b342
DHW
94 struct lang_output_section_statement_struct *output_section_statement;
95 union lang_statement_union **statement_ptr;
96 int lineno;
97 struct {
98 FILE *file;
99 char *name;
100 unsigned int lineno;
101 } state;
102
103
104}
105
9fce28ed 106%type <etree> exp opt_exp_with_type mustbe_exp opt_at
dadd414a 107%type <integer> fill_opt
2fa0b342 108%type <name> memspec_opt
6812f0e8 109%token <integer> INT
2fa0b342
DHW
110%token <name> NAME
111%type <integer> length
112
a37cc0c0 113%right <token> PLUSEQ MINUSEQ MULTEQ DIVEQ '=' LSHIFTEQ RSHIFTEQ ANDEQ OREQ
2fa0b342
DHW
114%right <token> '?' ':'
115%left <token> OROR
116%left <token> ANDAND
117%left <token> '|'
118%left <token> '^'
119%left <token> '&'
120%left <token> EQ NE
121%left <token> '<' '>' LE GE
122%left <token> LSHIFT RSHIFT
6812f0e8 123
2fa0b342
DHW
124%left <token> '+' '-'
125%left <token> '*' '/' '%'
6812f0e8
SC
126
127/*%token <token> '+' '-' '*' '/' '%'*/
2fa0b342 128%right UNARY
2e38b71d 129%token END
2fa0b342
DHW
130%left <token> '('
131%token <token> ALIGN_K BLOCK LONG SHORT BYTE
132%token SECTIONS
133%token '{' '}'
6812f0e8
SC
134%token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH
135%token SIZEOF_HEADERS
dadd414a 136%token INCLUDE
e14a43bf 137%token MEMORY DEFSYMEND
f177a611 138%token NOLOAD DSECT COPY INFO OVERLAY
2fa0b342 139%token NAME DEFINED TARGET_K SEARCH_DIR MAP ENTRY
b6316534 140%token OPTION_e OPTION_c OPTION_noinhibit_exec OPTION_s OPTION_S OPTION_sort_common
de87cdb4
DM
141%token OPTION_EB OPTION_EL OPTION_G OPTION_Gval OPTION_help
142%token OPTION_format OPTION_oformat OPTION_F OPTION_u OPTION_Bstatic OPTION_N
6812f0e8 143%token <integer> SIZEOF NEXT ADDR
a37cc0c0 144%token OPTION_d OPTION_dc OPTION_dp OPTION_x OPTION_X OPTION_defsym
8ddef552 145%token OPTION_v OPTION_V OPTION_m OPTION_memul OPTION_M OPTION_t STARTUP HLL SYSLIB FLOAT NOFLOAT
fe619ced 146%token OPTION_L OPTION_Map
de87cdb4 147%token OPTION_n OPTION_r OPTION_o OPTION_b OPTION_R OPTION_relax OPTION_version
fe619ced
ILT
148%token <name> OPTION_l OPTION_Lfile OPTION_T OPTION_Aarch OPTION_Tfile
149%token <name> OPTION_Texp OPTION_y
2fa0b342
DHW
150%token OPTION_Ur
151%token ORIGIN FILL OPTION_g
dadd414a 152%token LENGTH CREATE_OBJECT_SYMBOLS INPUT OUTPUT CONSTRUCTORS
9fce28ed 153%token OPTION_RETAIN_SYMBOLS_FILE ALIGNMOD AT
dadd414a 154
6812f0e8
SC
155%type <token> assign_op
156
2fa0b342
DHW
157%type <name> filename
158
3d2b83ea 159
e14a43bf 160%token CHIP LIST SECT ABSOLUTE LOAD NEWLINE ENDWORD ORDER NAMEWORD
dadd414a 161%token FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE
3d2b83ea 162
2fa0b342
DHW
163%{
164ld_config_type config;
165%}
166
167%%
168
2fa0b342
DHW
169file: command_line { lang_final(); };
170
9d1fe8a4
SC
171
172filename: NAME;
2fa0b342 173
76971f0d 174
2fa0b342
DHW
175command_line:
176 command_line command_line_option
177 |
178 ;
179
180command_line_option:
9d1fe8a4 181 OPTION_Bstatic { }
de87cdb4
DM
182 | OPTION_help
183 {
184 help ();
185 exit (0);
186 }
1418c83b 187 | OPTION_v
2fa0b342 188 {
76971f0d 189 ldversion(0);
2fa0b342 190 }
c611e285
SC
191 | OPTION_V
192 {
76971f0d 193 ldversion(1);
bbd2521f 194 trace_file_tries = true;
c611e285 195 }
de87cdb4
DM
196 | OPTION_version
197 {
198 ldversion(0);
199 exit(0);
200 }
2fa0b342
DHW
201 | OPTION_t {
202 trace_files = true;
203 }
2e2bf962
SC
204 | OPTION_Map NAME
205 {
206 write_map = true;
207 config.map_filename = $2;
208 }
8ddef552
DM
209 | OPTION_m NAME
210 {
211 /* Ignore. */
212 }
213 | OPTION_memul
214 {
215 /* Ignore. */
216 }
9fce28ed
SC
217 | OPTION_M
218 {
219 config.map_filename = "-";
220 }
2fa0b342
DHW
221 | OPTION_n {
222 config.magic_demand_paged = false;
2fa0b342 223 }
f177a611 224 | OPTION_N {
c611e285 225 config.text_read_only = false;
f177a611
JG
226 config.magic_demand_paged = false;
227 }
2fa0b342
DHW
228 | OPTION_s {
229 strip_symbols = STRIP_ALL;
230 }
231 | OPTION_S {
232 strip_symbols = STRIP_DEBUGGER;
233 }
1418c83b
SC
234 | OPTION_u NAME {
235 ldlang_add_undef($2);
236 }
237
2fa0b342
DHW
238 | OPTION_r {
239 config.relocateable_output = true;
240 config.build_constructors = false;
241 config.magic_demand_paged = false;
c611e285 242 config.text_read_only = false;
2fa0b342
DHW
243 }
244 | OPTION_Ur {
245 config.relocateable_output = true;
246 config.build_constructors = true;
247 config.magic_demand_paged = false;
c611e285 248 config.text_read_only = false;
2fa0b342
DHW
249 }
250 | OPTION_o filename
251 {
252 lang_add_output($2);
253 }
254 | OPTION_e NAME
255 { lang_add_entry($2);
256 }
257 | OPTION_X {
258 discard_locals = DISCARD_L;
259 }
260 | OPTION_x {
261 discard_locals = DISCARD_ALL;
262 }
263
264 | OPTION_noinhibit_exec
265 {
266 force_make_executable = true;
267 }
de87cdb4
DM
268 | OPTION_sort_common
269 {
270 config.sort_common = true;
271 }
1418c83b 272 | OPTION_d {
2fa0b342
DHW
273 command_line.force_common_definition = true;
274 }
c611e285
SC
275
276 | OPTION_relax {
277 command_line.relax = true;
278 }
1418c83b 279 | OPTION_dc
2fa0b342
DHW
280 {
281 command_line.force_common_definition = true;
282 }
283 | OPTION_g
284 {
285 /* Ignored */
286 }
1418c83b 287 | OPTION_dp
2fa0b342
DHW
288 {
289 command_line.force_common_definition = true;
290 }
1418c83b 291 | OPTION_format NAME
7ca04d28
SC
292 {
293 lang_add_target($2);
294 }
de87cdb4
DM
295 | OPTION_oformat NAME
296 {
297 lang_add_output_format($2, 0);
298 }
de7c1ff6 299 | OPTION_Texp
e14a43bf 300 { ldlex_expression();
9d1fe8a4 301 hex_mode = 16;
1418c83b
SC
302 }
303 INT
e14a43bf 304 { ldlex_popstate();
1418c83b 305 lang_section_start($1,exp_intop($3));
9d1fe8a4 306 hex_mode = 0;
1418c83b 307 }
dadd414a
SC
308 | OPTION_y
309 {
310 add_ysym($1);
311 }
7ca04d28 312 | OPTION_Aarch
1418c83b
SC
313 {
314 ldfile_add_arch($1);
315 }
7ca04d28 316 | OPTION_b NAME
2fa0b342
DHW
317 {
318 lang_add_target($2);
319 }
fe619ced
ILT
320 | OPTION_L NAME
321 {
322 ldfile_add_library_path($2);
323 }
324 | OPTION_Lfile
2fa0b342
DHW
325 {
326 ldfile_add_library_path($1);
1418c83b 327 }
7ca04d28
SC
328 | OPTION_F
329 {
330 /* Ignore */
331 }
f177a611 332 | OPTION_c filename
de87cdb4
DM
333 {ldfile_open_command_file($2); }
334 mri_script_file END { ldlex_command();}
9d1fe8a4 335
1418c83b
SC
336 | OPTION_Tfile
337 { ldfile_open_command_file($1); } script_file
3d2b83ea 338 END { ldlex_command();}
2fa0b342 339
1418c83b
SC
340 | OPTION_T filename
341 { ldfile_open_command_file($2); } script_file
dadd414a 342 END { ldlex_command();}
2fa0b342
DHW
343
344 | OPTION_l
345 {
346 lang_add_input_file($1,
347 lang_input_file_is_l_enum,
348 (char *)NULL);
349 }
1418c83b 350 | OPTION_R filename
2fa0b342
DHW
351 {
352 lang_add_input_file($2,
353 lang_input_file_is_symbols_only_enum,
354 (char *)NULL);
355 }
e14a43bf
SC
356
357 | OPTION_defsym { ldlex_defsym(); }
358 NAME '=' exp DEFSYMEND { ldlex_popstate();
1d45ccb3 359 lang_add_assignment(exp_assop($4,$3,$5));
dadd414a
SC
360 }
361 | OPTION_RETAIN_SYMBOLS_FILE filename
362 { lang_add_keepsyms_file ($2); }
9fce28ed
SC
363 | OPTION_EB
364 {
365 /* FIXME: This is currently ignored. It means
366 ``produce a big-endian object file''. It could
367 be used to select an output format. */
368 }
369 | OPTION_EL
370 {
371 /* FIXME: This is currently ignored. It means
372 ``produce a little-endian object file''. It could
373 be used to select an output format. */
374 }
8ddef552
DM
375 | OPTION_G NAME
376 {
377 g_switch_value = atoi ($2);
378 }
379 | OPTION_Gval
380 {
381 g_switch_value = yylval.integer;
382 }
8ddef552 383 | NAME
2de8edce
DM
384 {
385 if (*$1 == '-')
386 einfo("%P%F: illegal option -- %s\n", $1);
387 else
388 lang_add_input_file($1,lang_input_file_is_file_enum,
389 (char *)NULL);
390 }
2fa0b342
DHW
391 ;
392
393
3d2b83ea
SC
394/* SYNTAX WITHIN AN MRI SCRIPT FILE */
395mri_script_file:
396 { ldlex_mri_script();
397 PUSH_ERROR("MRI style script");
398 }
399 mri_script_lines
400 { ldlex_popstate();
401 POP_ERROR();
402 }
403 ;
2fa0b342 404
3d2b83ea 405mri_script_lines:
2e38b71d
SC
406 mri_script_lines mri_script_command NEWLINE
407 |
3d2b83ea 408 ;
2fa0b342 409
2e38b71d 410mri_script_command:
3d2b83ea
SC
411 CHIP exp
412 | CHIP exp ',' exp
413 | NAME {
2e38b71d 414 einfo("%P%F: unrecognised keyword in MRI style script '%s'\n",$1);
3d2b83ea
SC
415 }
416 | LIST {
417 write_map = true;
418 config.map_filename = "-";
419 }
2e38b71d
SC
420 | ORDER ordernamelist
421 | ENDWORD
e14a43bf
SC
422 | PUBLIC NAME '=' exp
423 { mri_public($2, $4); }
424 | PUBLIC NAME ',' exp
425 { mri_public($2, $4); }
426 | PUBLIC NAME exp
427 { mri_public($2, $3); }
2e38b71d
SC
428 | FORMAT NAME
429 { mri_format($2); }
430 | SECT NAME ',' exp
3d2b83ea
SC
431 { mri_output_section($2, $4);}
432 | SECT NAME exp
433 { mri_output_section($2, $3);}
434 | SECT NAME '=' exp
435 { mri_output_section($2, $4);}
dadd414a
SC
436 | ALIGN_K NAME '=' exp
437 { mri_align($2,$4); }
438 | ALIGNMOD NAME '=' exp
439 { mri_alignmod($2,$4); }
3d2b83ea
SC
440 | ABSOLUTE mri_abs_name_list
441 | LOAD mri_load_name_list
2e38b71d
SC
442 | NAMEWORD NAME
443 { mri_name($2); }
e14a43bf
SC
444 | ALIAS NAME ',' NAME
445 { mri_alias($2,$4,0);}
446 | ALIAS NAME ',' INT
447 { mri_alias($2,0,$4);}
448 | BASE exp
449 { mri_base($2); }
dadd414a
SC
450 | TRUNCATE INT
451 { mri_truncate($2); }
2e38b71d
SC
452 |
453 ;
454
455ordernamelist:
456 ordernamelist ',' NAME { mri_order($3); }
457 | ordernamelist NAME { mri_order($2); }
458 |
3d2b83ea 459 ;
2fa0b342 460
3d2b83ea
SC
461mri_load_name_list:
462 NAME
463 { mri_load($1); }
464 | mri_load_name_list ',' NAME { mri_load($3); }
465 ;
1418c83b 466
3d2b83ea
SC
467mri_abs_name_list:
468 NAME
469 { mri_only_load($1); }
470 | mri_abs_name_list ',' NAME
471 { mri_only_load($3); }
472 ;
1418c83b 473
3d2b83ea 474script_file:
9d1fe8a4
SC
475 {
476 ldlex_both();
477 }
3d2b83ea 478 ifile_list
9d1fe8a4
SC
479 {
480 ldlex_popstate();
481 }
1418c83b
SC
482 ;
483
484
485ifile_list:
3d2b83ea 486 ifile_list ifile_p1
13a0e8d7 487 |
2fa0b342
DHW
488 ;
489
490
491
492ifile_p1:
493 memory
494 | sections
495 | startup
496 | high_level_library
497 | low_level_library
498 | floating_point_support
ac004870 499 | statement_anywhere
9d1fe8a4 500 | ';'
2fa0b342
DHW
501 | TARGET_K '(' NAME ')'
502 { lang_add_target($3); }
503 | SEARCH_DIR '(' filename ')'
504 { ldfile_add_library_path($3); }
505 | OUTPUT '(' filename ')'
506 { lang_add_output($3); }
3d2b83ea 507 | OUTPUT_FORMAT '(' NAME ')'
de87cdb4 508 { lang_add_output_format($3, 1); }
3d2b83ea 509 | OUTPUT_ARCH '(' NAME ')'
a37cc0c0 510 { ldfile_set_output_arch($3); }
13a0e8d7
SC
511 | FORCE_COMMON_ALLOCATION
512 { command_line.force_common_definition = true ; }
2fa0b342
DHW
513 | INPUT '(' input_list ')'
514 | MAP '(' filename ')'
515 { lang_add_map($3); }
dadd414a
SC
516 | INCLUDE filename
517 { ldfile_open_command_file($2); } ifile_list END
2fa0b342
DHW
518 ;
519
520input_list:
521 NAME
522 { lang_add_input_file($1,lang_input_file_is_file_enum,
523 (char *)NULL); }
524 | input_list ',' NAME
525 { lang_add_input_file($3,lang_input_file_is_file_enum,
526 (char *)NULL); }
3d2b83ea
SC
527 | input_list NAME
528 { lang_add_input_file($2,
529lang_input_file_is_file_enum,
2fa0b342
DHW
530 (char *)NULL); }
531 ;
532
533sections:
3d2b83ea 534 SECTIONS '{' sec_or_group_p1 '}'
2fa0b342
DHW
535 ;
536
537sec_or_group_p1:
538 sec_or_group_p1 section
539 | sec_or_group_p1 statement_anywhere
540 |
541 ;
542
543statement_anywhere:
544 ENTRY '(' NAME ')'
545 { lang_add_entry($3); }
546 | assignment end
547 ;
548
1418c83b
SC
549file_NAME_list:
550 NAME
551 { lang_add_wild($1, current_file); }
3d2b83ea 552 | file_NAME_list opt_comma NAME
1418c83b
SC
553 { lang_add_wild($3, current_file); }
554 ;
555
556input_section_spec:
557 NAME
558 {
559 lang_add_wild((char *)NULL, $1);
560 }
3d2b83ea 561 | '['
1418c83b
SC
562 {
563 current_file = (char *)NULL;
564 }
3d2b83ea
SC
565 file_NAME_list
566 ']'
1418c83b
SC
567 | NAME
568 {
3d2b83ea
SC
569 current_file =$1;
570 }
1418c83b 571 '(' file_NAME_list ')'
3d2b83ea
SC
572 | '*'
573 {
1418c83b 574 current_file = (char *)NULL;
3d2b83ea 575 }
1418c83b
SC
576 '(' file_NAME_list ')'
577 ;
578
2fa0b342 579statement:
9fce28ed
SC
580 assignment end
581 | CREATE_OBJECT_SYMBOLS
13a0e8d7 582 {
9fce28ed
SC
583 lang_add_attribute(lang_object_symbols_statement_enum);
584 }
585 | ';'
586 | CONSTRUCTORS
f177a611 587 {
3d2b83ea 588
9fce28ed
SC
589 lang_add_attribute(lang_constructors_statement_enum);
590 }
591 | input_section_spec
592 | length '(' exp ')'
2fa0b342 593 {
9fce28ed 594 lang_add_data($1,$3);
2fa0b342
DHW
595 }
596
9fce28ed 597 | FILL '(' exp ')'
2fa0b342
DHW
598 {
599 lang_add_fill
9fce28ed 600 (exp_get_value_int($3,
2fa0b342
DHW
601 0,
602 "fill value",
9fce28ed 603 lang_first_phase_enum));
2fa0b342 604 }
2fa0b342
DHW
605 ;
606
9fce28ed
SC
607statement_list:
608 statement_list statement
609 | statement
610 ;
611
8ddef552
DM
612statement_list_opt:
613 /* empty */
614 | statement_list
615 ;
616
2fa0b342 617length:
3d2b83ea 618 LONG
2fa0b342 619 { $$ = $1; }
3d2b83ea 620 | SHORT
2fa0b342 621 { $$ = $1; }
3d2b83ea 622 | BYTE
2fa0b342
DHW
623 { $$ = $1; }
624 ;
625
626fill_opt:
9d1fe8a4 627 '=' mustbe_exp
2fa0b342
DHW
628 {
629 $$ = exp_get_value_int($2,
630 0,
631 "fill value",
3d2b83ea 632 lang_first_phase_enum);
2fa0b342 633 }
3d2b83ea 634 | { $$ = 0; }
2fa0b342
DHW
635 ;
636
637
638
639assign_op:
640 PLUSEQ
641 { $$ = '+'; }
3d2b83ea 642 | MINUSEQ
2fa0b342
DHW
643 { $$ = '-'; }
644 | MULTEQ
645 { $$ = '*'; }
646 | DIVEQ
647 { $$ = '/'; }
648 | LSHIFTEQ
649 { $$ = LSHIFT; }
650 | RSHIFTEQ
651 { $$ = RSHIFT; }
652 | ANDEQ
653 { $$ = '&'; }
654 | OREQ
655 { $$ = '|'; }
656
657 ;
658
9d1fe8a4 659end: ';' | ','
2fa0b342
DHW
660 ;
661
2fa0b342
DHW
662
663assignment:
3d2b83ea 664 NAME '=' mustbe_exp
2fa0b342
DHW
665 {
666 lang_add_assignment(exp_assop($2,$1,$3));
667 }
3d2b83ea 668 | NAME assign_op mustbe_exp
2fa0b342 669 {
3d2b83ea
SC
670
671lang_add_assignment(exp_assop('=',$1,exp_binop($2,exp_nameop(NAME,$1),$3)));
2fa0b342
DHW
672 }
673
674 ;
675
676
677opt_comma:
678 ',' | ;
679
680
681memory:
3d2b83ea 682 MEMORY '{' memory_spec memory_spec_list '}'
2fa0b342
DHW
683 ;
684
685memory_spec_list:
3d2b83ea 686 memory_spec_list memory_spec
2fa0b342
DHW
687 | memory_spec_list ',' memory_spec
688 |
689 ;
690
691
3d2b83ea 692memory_spec: NAME
2fa0b342 693 { region = lang_memory_region_lookup($1); }
3d2b83ea 694 attributes_opt ':'
9d1fe8a4 695 origin_spec opt_comma length_spec
2fa0b342 696
3d2b83ea 697 ; origin_spec:
9d1fe8a4 698 ORIGIN '=' mustbe_exp
2fa0b342
DHW
699 { region->current =
700 region->origin =
3d2b83ea
SC
701 exp_get_vma($3, 0L,"origin", lang_first_phase_enum);
702}
703 ; length_spec:
704 LENGTH '=' mustbe_exp
705 { region->length = exp_get_vma($3,
2fa0b342
DHW
706 ~((bfd_vma)0),
707 "length",
708 lang_first_phase_enum);
709 }
710
711
712attributes_opt:
713 '(' NAME ')'
714 {
715 lang_set_flags(&region->flags, $2);
716 }
717 |
718
719 ;
720
721startup:
722 STARTUP '(' filename ')'
723 { lang_startup($3); }
724 ;
725
726high_level_library:
3d2b83ea
SC
727 HLL '(' high_level_library_NAME_list ')'
728 | HLL '(' ')'
2fa0b342
DHW
729 { ldemul_hll((char *)NULL); }
730 ;
731
732high_level_library_NAME_list:
3d2b83ea 733 high_level_library_NAME_list opt_comma filename
2fa0b342
DHW
734 { ldemul_hll($3); }
735 | filename
736 { ldemul_hll($1); }
737
738 ;
739
740low_level_library:
741 SYSLIB '(' low_level_library_NAME_list ')'
3d2b83ea 742 ; low_level_library_NAME_list:
2fa0b342 743 low_level_library_NAME_list opt_comma filename
3d2b83ea 744 { ldemul_syslib($3); }
2fa0b342
DHW
745 |
746 ;
747
748floating_point_support:
749 FLOAT
750 { lang_float(true); }
751 | NOFLOAT
3d2b83ea 752 { lang_float(false); }
2fa0b342
DHW
753 ;
754
755
3d2b83ea 756mustbe_exp: { ldlex_expression(); }
9d1fe8a4
SC
757 exp
758 { ldlex_popstate(); $$=$2;}
759 ;
2fa0b342
DHW
760
761exp :
3d2b83ea 762 '-' exp %prec UNARY
2fa0b342 763 { $$ = exp_unop('-', $2); }
9d1fe8a4 764 | '(' exp ')'
2fa0b342
DHW
765 { $$ = $2; }
766 | NEXT '(' exp ')' %prec UNARY
767 { $$ = exp_unop($1,$3); }
3d2b83ea 768 | '!' exp %prec UNARY
2fa0b342 769 { $$ = exp_unop('!', $2); }
3d2b83ea 770 | '+' exp %prec UNARY
2fa0b342 771 { $$ = $2; }
3d2b83ea 772 | '~' exp %prec UNARY
2fa0b342
DHW
773 { $$ = exp_unop('~', $2);}
774
775 | exp '*' exp
776 { $$ = exp_binop('*', $1, $3); }
777 | exp '/' exp
778 { $$ = exp_binop('/', $1, $3); }
779 | exp '%' exp
780 { $$ = exp_binop('%', $1, $3); }
781 | exp '+' exp
782 { $$ = exp_binop('+', $1, $3); }
783 | exp '-' exp
3d2b83ea 784 { $$ = exp_binop('-' , $1, $3); }
2fa0b342
DHW
785 | exp LSHIFT exp
786 { $$ = exp_binop(LSHIFT , $1, $3); }
787 | exp RSHIFT exp
788 { $$ = exp_binop(RSHIFT , $1, $3); }
789 | exp EQ exp
790 { $$ = exp_binop(EQ , $1, $3); }
791 | exp NE exp
792 { $$ = exp_binop(NE , $1, $3); }
793 | exp LE exp
794 { $$ = exp_binop(LE , $1, $3); }
3d2b83ea 795 | exp GE exp
2fa0b342
DHW
796 { $$ = exp_binop(GE , $1, $3); }
797 | exp '<' exp
798 { $$ = exp_binop('<' , $1, $3); }
799 | exp '>' exp
800 { $$ = exp_binop('>' , $1, $3); }
801 | exp '&' exp
802 { $$ = exp_binop('&' , $1, $3); }
803 | exp '^' exp
804 { $$ = exp_binop('^' , $1, $3); }
805 | exp '|' exp
806 { $$ = exp_binop('|' , $1, $3); }
807 | exp '?' exp ':' exp
808 { $$ = exp_trinop('?' , $1, $3, $5); }
809 | exp ANDAND exp
810 { $$ = exp_binop(ANDAND , $1, $3); }
811 | exp OROR exp
812 { $$ = exp_binop(OROR , $1, $3); }
813 | DEFINED '(' NAME ')'
814 { $$ = exp_nameop(DEFINED, $3); }
815 | INT
816 { $$ = exp_intop($1); }
3d2b83ea 817 | SIZEOF_HEADERS
65c552e3 818 { $$ = exp_nameop(SIZEOF_HEADERS,0); }
2fa0b342 819
3d2b83ea 820 | SIZEOF '(' NAME ')'
f177a611 821 { $$ = exp_nameop(SIZEOF,$3); }
2fa0b342 822 | ADDR '(' NAME ')'
f177a611 823 { $$ = exp_nameop(ADDR,$3); }
ae475b39
SC
824 | ABSOLUTE '(' exp ')'
825 { $$ = exp_unop(ABSOLUTE, $3); }
2fa0b342 826 | ALIGN_K '(' exp ')'
f177a611 827 { $$ = exp_unop(ALIGN_K,$3); }
2fa0b342
DHW
828 | NAME
829 { $$ = exp_nameop(NAME,$1); }
830 ;
831
832
9fce28ed
SC
833opt_at:
834 AT '(' exp ')' { $$ = $3; }
835 | { $$ = 0; }
836 ;
2fa0b342 837
3d2b83ea 838section: NAME { ldlex_expression(); }
9fce28ed
SC
839 opt_exp_with_type
840 opt_at { ldlex_popstate(); }
dadd414a 841 '{'
9fce28ed
SC
842 {
843 lang_enter_output_section_statement($1,$3,typebits,0,0,0,$4);
844 }
8ddef552 845 statement_list_opt
dadd414a 846 '}' {ldlex_expression();} fill_opt memspec_opt
2fa0b342 847 {
e14a43bf 848 ldlex_popstate();
9fce28ed 849 lang_leave_output_section_statement($11, $12);
2fa0b342 850 }
e14a43bf 851opt_comma
2fa0b342
DHW
852
853 ;
854
dadd414a
SC
855type:
856 NOLOAD { typebits = SEC_NEVER_LOAD; }
857 | DSECT { typebits = 0; }
858 | COPY { typebits = 0; }
859 | INFO { typebits = 0; }
860 | OVERLAY { typebits = 0; }
861 | { typebits = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS; }
f177a611
JG
862 ;
863
6812f0e8 864
dadd414a 865opt_exp_with_type:
9fce28ed
SC
866 exp ':' { $$ = $1; typebits =0;}
867 | exp '(' type ')' ':' { $$ = $1; }
868 | ':' { $$= (etree_type *)NULL; typebits = 0; }
869 | '(' type ')' ':' { $$= (etree_type *)NULL; }
2fa0b342
DHW
870 ;
871
2fa0b342 872memspec_opt:
9d1fe8a4 873 '>' NAME
2fa0b342
DHW
874 { $$ = $2; }
875 | { $$ = "*default*"; }
876 ;
3d2b83ea
SC
877%%
878void
879yyerror(arg)
880char *arg;
881{
882 if (error_index> 0 && error_index < ERROR_NAME_MAX)
883 einfo("%P%F: %S syntax error in %s\n",error_names[error_index-1]);
884 else
885 einfo("%P%F: %S syntax error\n");
886}
This page took 0.123003 seconds and 4 git commands to generate.