Changeset 609 for branches/GNU/src/binutils/ld/ldgram.y
- Timestamp:
- Aug 16, 2003, 6:59:22 PM (22 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/GNU/src/binutils/ld/ldgram.y
-
Property cvs2svn:cvs-rev
changed from
1.1
to1.1.1.2
r608 r609 1 1 /* A YACC grammar to parse a superset of the AT&T linker scripting language. 2 2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 3 2001 Free Software Foundation, Inc.3 2001, 2002 Free Software Foundation, Inc. 4 4 Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com). 5 5 … … 30 30 #include "sysdep.h" 31 31 #include "bfdlink.h" 32 #include "ld.h" 32 #include "ld.h" 33 33 #include "ldexp.h" 34 34 #include "ldver.h" … … 50 50 lang_memory_region_type *region; 51 51 52 struct wildcard_spec current_file; 53 boolean ldgram_want_filename = true; 54 boolean had_script = false; 55 boolean force_make_executable = false; 56 57 boolean ldgram_in_script = false; 58 boolean ldgram_had_equals = false; 59 boolean ldgram_had_keep = false; 52 bfd_boolean ldgram_want_filename = TRUE; 53 FILE *saved_script_handle = NULL; 54 bfd_boolean force_make_executable = FALSE; 55 56 bfd_boolean ldgram_in_script = FALSE; 57 bfd_boolean ldgram_had_equals = FALSE; 58 bfd_boolean ldgram_had_keep = FALSE; 60 59 char *ldgram_vers_current_lang = NULL; 61 60 … … 68 67 %union { 69 68 bfd_vma integer; 69 struct big_int 70 { 71 bfd_vma integer; 72 char *str; 73 } bigint; 74 fill_type *fill; 70 75 char *name; 71 76 const char *cname; 72 77 struct wildcard_spec wildcard; 78 struct wildcard_list *wildcard_list; 73 79 struct name_list *name_list; 74 80 int token; … … 76 82 struct phdr_info 77 83 { 78 b oolean filehdr;79 b oolean phdrs;84 bfd_boolean filehdr; 85 bfd_boolean phdrs; 80 86 union etree_union *at; 81 87 union etree_union *flags; … … 90 96 %type <etree> exp opt_exp_with_type mustbe_exp opt_at phdr_type phdr_val 91 97 %type <etree> opt_exp_without_type 92 %type < integer> fill_opt98 %type <fill> fill_opt fill_exp 93 99 %type <name_list> exclude_name_list 100 %type <wildcard_list> file_NAME_list 94 101 %type <name> memspec_opt casesymlist 95 102 %type <name> memspec_at_opt 96 103 %type <cname> wildcard_name 97 104 %type <wildcard> wildcard_spec 98 %token < integer> INT105 %token <bigint> INT 99 106 %token <name> NAME LNAME 100 107 %type <integer> length … … 104 111 %type <integer> opt_nocrossrefs 105 112 106 %right <token> PLUSEQ MINUSEQ MULTEQ DIVEQ '=' LSHIFTEQ RSHIFTEQ ANDEQ OREQ 113 %right <token> PLUSEQ MINUSEQ MULTEQ DIVEQ '=' LSHIFTEQ RSHIFTEQ ANDEQ OREQ 107 114 %right <token> '?' ':' 108 115 %left <token> OROR … … 119 126 120 127 %right UNARY 121 %token END 128 %token END 122 129 %left <token> '(' 123 130 %token <token> ALIGN_K BLOCK BIND QUAD SQUAD LONG SHORT BYTE 124 %token SECTIONS PHDRS SORT 131 %token SECTIONS PHDRS SORT DATA_SEGMENT_ALIGN DATA_SEGMENT_END 125 132 %token '{' '}' 126 133 %token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH 134 %token INHIBIT_COMMON_ALLOCATION 127 135 %token SIZEOF_HEADERS 128 136 %token INCLUDE … … 151 159 %% 152 160 153 file: 161 file: 154 162 INPUT_SCRIPT script_file 155 163 | INPUT_MRI_SCRIPT mri_script_file … … 169 177 lang_add_assignment(exp_assop($3,$2,$4)); 170 178 } 171 172 /* SYNTAX WITHIN AN MRI SCRIPT FILE */ 179 ; 180 181 /* SYNTAX WITHIN AN MRI SCRIPT FILE */ 173 182 mri_script_file: 174 183 { … … 190 199 191 200 mri_script_command: 192 CHIP exp 201 CHIP exp 193 202 | CHIP exp ',' exp 194 203 | NAME { … … 199 208 } 200 209 | ORDER ordernamelist 201 | ENDWORD 210 | ENDWORD 202 211 | PUBLIC NAME '=' exp 203 212 { mri_public($2, $4); } 204 213 | PUBLIC NAME ',' exp 205 214 { mri_public($2, $4); } 206 | PUBLIC NAME exp 215 | PUBLIC NAME exp 207 216 { mri_public($2, $3); } 208 217 | FORMAT NAME … … 224 233 | ABSOLUTE mri_abs_name_list 225 234 | LOAD mri_load_name_list 226 | NAMEWORD NAME 227 { mri_name($2); } 235 | NAMEWORD NAME 236 { mri_name($2); } 228 237 | ALIAS NAME ',' NAME 229 238 { mri_alias($2,$4,0);} 230 239 | ALIAS NAME ',' INT 231 { mri_alias ($2,0,(int) $4);}240 { mri_alias ($2, 0, (int) $4.integer); } 232 241 | BASE exp 233 242 { mri_base($2); } 234 |TRUNCATE INT235 { mri_truncate((unsigned int) $2); }243 | TRUNCATE INT 244 { mri_truncate ((unsigned int) $2.integer); } 236 245 | CASE casesymlist 237 246 | EXTERN extern_name_list 238 247 | INCLUDE filename 239 { ldfile_open_command_file ($2); } mri_script_lines END 248 { ldlex_script (); ldfile_open_command_file($2); } 249 mri_script_lines END 250 { ldlex_popstate (); } 240 251 | START NAME 241 { lang_add_entry ($2, false); }252 { lang_add_entry ($2, FALSE); } 242 253 | 243 254 ; … … 309 320 { lang_add_target($3); } 310 321 | SEARCH_DIR '(' filename ')' 311 { ldfile_add_library_path ($3, false); }322 { ldfile_add_library_path ($3, FALSE); } 312 323 | OUTPUT '(' filename ')' 313 324 { lang_add_output($3, 1); } … … 320 331 { ldfile_set_output_arch($3); } 321 332 | FORCE_COMMON_ALLOCATION 322 { command_line.force_common_definition = true ; } 333 { command_line.force_common_definition = TRUE ; } 334 | INHIBIT_COMMON_ALLOCATION 335 { command_line.inhibit_common_definition = TRUE ; } 323 336 | INPUT '(' input_list ')' 324 337 | GROUP … … 328 341 | MAP '(' filename ')' 329 342 { lang_add_map($3); } 330 | INCLUDE filename 331 { ldfile_open_command_file($2); } ifile_list END 343 | INCLUDE filename 344 { ldlex_script (); ldfile_open_command_file($2); } 345 ifile_list END 346 { ldlex_popstate (); } 332 347 | NOCROSSREFS '(' nocrossref_list ')' 333 348 { … … 370 385 statement_anywhere: 371 386 ENTRY '(' NAME ')' 372 { lang_add_entry ($3, false); }387 { lang_add_entry ($3, FALSE); } 373 388 | assignment end 374 389 ; … … 395 410 { 396 411 $$.name = $1; 397 $$.sorted = false;412 $$.sorted = FALSE; 398 413 $$.exclude_name_list = NULL; 399 414 } … … 401 416 { 402 417 $$.name = $5; 403 $$.sorted = false;418 $$.sorted = FALSE; 404 419 $$.exclude_name_list = $3; 405 420 } … … 407 422 { 408 423 $$.name = $3; 409 $$.sorted = true;424 $$.sorted = TRUE; 410 425 $$.exclude_name_list = NULL; 411 426 } … … 413 428 { 414 429 $$.name = $7; 415 $$.sorted = true;430 $$.sorted = TRUE; 416 431 $$.exclude_name_list = $5; 417 432 } 418 433 ; 419 420 421 434 422 435 exclude_name_list: … … 427 440 tmp->name = $2; 428 441 tmp->next = $1; 429 $$ = tmp; 442 $$ = tmp; 430 443 } 431 444 | … … 441 454 442 455 file_NAME_list: 456 file_NAME_list opt_comma wildcard_spec 457 { 458 struct wildcard_list *tmp; 459 tmp = (struct wildcard_list *) xmalloc (sizeof *tmp); 460 tmp->next = $1; 461 tmp->spec = $3; 462 $$ = tmp; 463 } 464 | 443 465 wildcard_spec 444 466 { 445 lang_add_wild ($1.name, $1.sorted, 446 current_file.name, 447 current_file.sorted, 448 ldgram_had_keep, $1.exclude_name_list); 449 } 450 | file_NAME_list opt_comma wildcard_spec 451 { 452 lang_add_wild ($3.name, $3.sorted, 453 current_file.name, 454 current_file.sorted, 455 ldgram_had_keep, $3.exclude_name_list); 467 struct wildcard_list *tmp; 468 tmp = (struct wildcard_list *) xmalloc (sizeof *tmp); 469 tmp->next = NULL; 470 tmp->spec = $1; 471 $$ = tmp; 456 472 } 457 473 ; … … 460 476 NAME 461 477 { 462 lang_add_wild (NULL, false, $1, false, 463 ldgram_had_keep, NULL); 464 } 465 | '[' 466 { 467 current_file.name = NULL; 468 current_file.sorted = false; 469 } 470 file_NAME_list ']' 471 | wildcard_spec 472 { 473 current_file = $1; 474 /* '*' matches any file name. */ 475 if (strcmp (current_file.name, "*") == 0) 476 current_file.name = NULL; 477 } 478 '(' file_NAME_list ')' 478 struct wildcard_spec tmp; 479 tmp.name = $1; 480 tmp.exclude_name_list = NULL; 481 tmp.sorted = FALSE; 482 lang_add_wild (&tmp, NULL, ldgram_had_keep); 483 } 484 | '[' file_NAME_list ']' 485 { 486 lang_add_wild (NULL, $2, ldgram_had_keep); 487 } 488 | wildcard_spec '(' file_NAME_list ')' 489 { 490 lang_add_wild (&$1, $3, ldgram_had_keep); 491 } 479 492 ; 480 493 … … 482 495 input_section_spec_no_keep 483 496 | KEEP '(' 484 { ldgram_had_keep = true; }497 { ldgram_had_keep = TRUE; } 485 498 input_section_spec_no_keep ')' 486 { ldgram_had_keep = false; }499 { ldgram_had_keep = FALSE; } 487 500 ; 488 501 … … 491 504 | CREATE_OBJECT_SYMBOLS 492 505 { 493 lang_add_attribute(lang_object_symbols_statement_enum); 506 lang_add_attribute(lang_object_symbols_statement_enum); 494 507 } 495 508 | ';' 496 509 | CONSTRUCTORS 497 510 { 498 499 lang_add_attribute(lang_constructors_statement_enum); 511 512 lang_add_attribute(lang_constructors_statement_enum); 500 513 } 501 514 | SORT '(' CONSTRUCTORS ')' 502 515 { 503 constructors_sorted = true;516 constructors_sorted = TRUE; 504 517 lang_add_attribute (lang_constructors_statement_enum); 505 518 } … … 507 520 | length '(' mustbe_exp ')' 508 521 { 509 lang_add_data((int) $1,$3); 510 } 511 512 | FILL '(' mustbe_exp ')' 513 { 514 lang_add_fill 515 (exp_get_value_int($3, 516 0, 517 "fill value", 518 lang_first_phase_enum)); 522 lang_add_data ((int) $1, $3); 523 } 524 525 | FILL '(' fill_exp ')' 526 { 527 lang_add_fill ($3); 519 528 } 520 529 ; … … 524 533 | statement 525 534 ; 526 535 527 536 statement_list_opt: 528 537 /* empty */ … … 543 552 ; 544 553 554 fill_exp: 555 mustbe_exp 556 { 557 $$ = exp_get_fill ($1, 558 0, 559 "fill value", 560 lang_first_phase_enum); 561 } 562 ; 563 545 564 fill_opt: 546 '=' mustbe_exp 547 { 548 $$ = exp_get_value_int($2, 549 0, 550 "fill value", 551 lang_first_phase_enum); 552 } 553 | { $$ = 0; } 554 ; 555 556 565 '=' fill_exp 566 { $$ = $2; } 567 | { $$ = (fill_type *) 0; } 568 ; 557 569 558 570 assign_op: … … 615 627 616 628 617 memory_spec: 618 629 memory_spec: NAME 630 { region = lang_memory_region_lookup($1); } 619 631 attributes_opt ':' 620 632 origin_spec opt_comma length_spec 621 633 {} 622 634 ; 623 635 … … 686 698 floating_point_support: 687 699 FLOAT 688 { lang_float( true); }700 { lang_float(TRUE); } 689 701 | NOFLOAT 690 { lang_float( false); }691 ; 692 702 { lang_float(FALSE); } 703 ; 704 693 705 nocrossref_list: 694 706 /* empty */ … … 776 788 { $$ = exp_nameop(DEFINED, $3); } 777 789 | INT 778 { $$ = exp_ intop($1); }790 { $$ = exp_bigintop ($1.integer, $1.str); } 779 791 | SIZEOF_HEADERS 780 792 { $$ = exp_nameop(SIZEOF_HEADERS,0); } … … 790 802 | ALIGN_K '(' exp ')' 791 803 { $$ = exp_unop(ALIGN_K,$3); } 804 | DATA_SEGMENT_ALIGN '(' exp ',' exp ')' 805 { $$ = exp_binop (DATA_SEGMENT_ALIGN, $3, $5); } 806 | DATA_SEGMENT_END '(' exp ')' 807 { $$ = exp_unop(DATA_SEGMENT_END, $3); } 792 808 | BLOCK '(' exp ')' 793 809 { $$ = exp_unop(ALIGN_K,$3); } … … 805 821 memspec_at_opt: 806 822 AT '>' NAME { $$ = $3; } 807 | { $$ = "*default*"; }823 | { $$ = 0; } 808 824 ; 809 825 … … 814 830 815 831 section: NAME { ldlex_expression(); } 816 opt_exp_with_type 832 opt_exp_with_type 817 833 opt_at { ldlex_popstate (); ldlex_script (); } 818 834 '{' … … 822 838 0, 0, 0, $4); 823 839 } 824 statement_list_opt 840 statement_list_opt 825 841 '}' { ldlex_popstate (); ldlex_expression (); } 826 842 memspec_opt memspec_at_opt phdr_opt fill_opt … … 830 846 } 831 847 opt_comma 848 {} 832 849 | OVERLAY 833 850 { ldlex_expression (); } 834 851 opt_exp_without_type opt_nocrossrefs opt_at 835 852 { ldlex_popstate (); ldlex_script (); } 836 '{' 837 { 838 lang_enter_overlay ($3 , $5, (int) $4);853 '{' 854 { 855 lang_enter_overlay ($3); 839 856 } 840 857 overlay_section … … 844 861 { 845 862 ldlex_popstate (); 846 lang_leave_overlay ($15, $12, $14, $13); 863 lang_leave_overlay ($5, (int) $4, 864 $15, $12, $14, $13); 847 865 } 848 866 opt_comma … … 916 934 xmalloc (sizeof *n)); 917 935 n->name = $3; 918 n->used = false;936 n->used = FALSE; 919 937 n->next = $1; 920 938 $$ = n; … … 973 991 "PT_NULL", "PT_LOAD", "PT_DYNAMIC", 974 992 "PT_INTERP", "PT_NOTE", "PT_SHLIB", 975 "PT_PHDR" 993 "PT_PHDR", "PT_TLS" 976 994 }; 977 995 … … 985 1003 break; 986 1004 } 1005 if (i == sizeof phdr_types / sizeof phdr_types[0]) 1006 { 1007 if (strcmp (s, "PT_GNU_EH_FRAME") == 0) 1008 $$ = exp_intop (0x6474e550); 1009 else 1010 { 1011 einfo (_("\ 1012 %X%P:%S: unknown phdr type `%s' (try integer literal)\n"), 1013 s); 1014 $$ = exp_intop (0); 1015 } 1016 } 987 1017 } 988 1018 } … … 998 1028 $$ = $3; 999 1029 if (strcmp ($1, "FILEHDR") == 0 && $2 == NULL) 1000 $$.filehdr = true;1030 $$.filehdr = TRUE; 1001 1031 else if (strcmp ($1, "PHDRS") == 0 && $2 == NULL) 1002 $$.phdrs = true;1032 $$.phdrs = TRUE; 1003 1033 else if (strcmp ($1, "FLAGS") == 0 && $2 != NULL) 1004 1034 $$.flags = $2; … … 1056 1086 1057 1087 vers_node: 1058 VERS_TAG '{' vers_tag '}' ';' 1088 '{' vers_tag '}' ';' 1089 { 1090 lang_register_vers_node (NULL, $2, NULL); 1091 } 1092 | VERS_TAG '{' vers_tag '}' ';' 1059 1093 { 1060 1094 lang_register_vers_node ($1, $3, NULL); … … 1103 1137 VERS_IDENTIFIER 1104 1138 { 1105 $$ = lang_new_vers_ regex(NULL, $1, ldgram_vers_current_lang);1139 $$ = lang_new_vers_pattern (NULL, $1, ldgram_vers_current_lang); 1106 1140 } 1107 1141 | vers_defns ';' VERS_IDENTIFIER 1108 1142 { 1109 $$ = lang_new_vers_regex ($1, $3, ldgram_vers_current_lang); 1110 } 1143 $$ = lang_new_vers_pattern ($1, $3, ldgram_vers_current_lang); 1144 } 1145 | vers_defns ';' EXTERN NAME '{' 1146 { 1147 $<name>$ = ldgram_vers_current_lang; 1148 ldgram_vers_current_lang = $4; 1149 } 1150 vers_defns opt_semicolon '}' 1151 { 1152 $$ = $7; 1153 ldgram_vers_current_lang = $<name>6; 1154 } 1111 1155 | EXTERN NAME '{' 1112 1156 { … … 1114 1158 ldgram_vers_current_lang = $2; 1115 1159 } 1116 vers_defns '}'1160 vers_defns opt_semicolon '}' 1117 1161 { 1118 1162 $$ = $5; … … 1121 1165 ; 1122 1166 1167 opt_semicolon: 1168 /* empty */ 1169 | ';' 1170 ; 1171 1123 1172 %% 1124 1173 void 1125 yyerror(arg) 1174 yyerror(arg) 1126 1175 const char *arg; 1127 { 1176 { 1128 1177 if (ldfile_assumed_script) 1129 1178 einfo (_("%P:%s: file format not recognized; treating as linker script\n"), -
Property cvs2svn:cvs-rev
changed from
Note:
See TracChangeset
for help on using the changeset viewer.