X-Git-Url: https://repo.jachan.dev/binutils.git/blobdiff_plain/dadd414a8917bf3d2e813d7ff0706fa7aaa8958c..0373062441e6151860971ebd6e70b955f72e0b33:/ld/ldgram.y diff --git a/ld/ldgram.y b/ld/ldgram.y index eb9000a94a..3e6ca0aed4 100644 --- a/ld/ldgram.y +++ b/ld/ldgram.y @@ -1,5 +1,5 @@ /* A YACC grammer to parse a superset of the AT&T linker scripting languaue. - Copyright (C) 1991 Free Software Foundation, Inc. + Copyright (C) 1991, 1993 Free Software Foundation, Inc. Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com). This file is part of GNU ld. @@ -27,6 +27,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "bfd.h" #include "sysdep.h" +#include "bfdlink.h" #include "ld.h" #include "ldexp.h" #include "ldver.h" @@ -34,40 +35,15 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "ldemul.h" #include "ldfile.h" #include "ldmisc.h" +#include "ldmain.h" #include "mri.h" +#include "ldlex.h" -#define YYDEBUG 1 - -boolean option_v; -extern unsigned int lineno; -extern boolean trace_files; -extern boolean write_map; -extern boolean option_longmap; -boolean hex_mode; static int typebits; -strip_symbols_type strip_symbols=STRIP_NONE; -discard_locals_type discard_locals=DISCARD_NONE; - lang_memory_region_type *region; -lang_memory_region_type *lang_memory_region_lookup(); -lang_output_section_statement_type *lang_output_section_statement_lookup(); - -#ifdef __STDC__ - -void lang_add_data(int type, union etree_union *exp); -void lang_enter_output_section_statement(char *output_section_statement_name, etree_type *address_exp, int flags, bfd_vma block_value,etree_type*,etree_type*); - -#else - -void lang_add_data(); -void lang_enter_output_section_statement(); - -#endif /* __STDC__ */ - -extern args_type command_line; char *current_file; boolean ldgram_want_filename = true; boolean had_script = false; @@ -75,7 +51,6 @@ boolean force_make_executable = false; boolean ldgram_in_script = false; boolean ldgram_had_equals = false; -/* LOCALS */ #define ERROR_NAME_MAX 20 @@ -86,24 +61,12 @@ static int error_index; %} %union { bfd_vma integer; - int voidval; char *name; int token; union etree_union *etree; -struct sec *section; - struct lang_output_section_statement_struct *output_section_statement; - union lang_statement_union **statement_ptr; - int lineno; - struct { - FILE *file; - char *name; - unsigned int lineno; - } state; - - } -%type exp opt_exp_with_type mustbe_exp +%type exp opt_exp_with_type mustbe_exp opt_at %type fill_opt %type memspec_opt %token INT @@ -124,223 +87,48 @@ struct sec *section; %left '+' '-' %left '*' '/' '%' -/*%token '+' '-' '*' '/' '%'*/ %right UNARY %token END %left '(' -%token ALIGN_K BLOCK LONG SHORT BYTE -%token SECTIONS +%token ALIGN_K BLOCK QUAD LONG SHORT BYTE +%token SECTIONS %token '{' '}' %token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH %token SIZEOF_HEADERS %token INCLUDE -%token MEMORY DEFSYMEND +%token MEMORY DEFSYMEND %token NOLOAD DSECT COPY INFO OVERLAY -%token NAME DEFINED TARGET_K SEARCH_DIR MAP ENTRY -%token OPTION_e OPTION_c OPTION_noinhibit_exec OPTION_s OPTION_S OPTION_sort_common -%token OPTION_format OPTION_F OPTION_u OPTION_Bstatic OPTION_N -%token SIZEOF NEXT ADDR -%token OPTION_d OPTION_dc OPTION_dp OPTION_x OPTION_X OPTION_defsym -%token OPTION_v OPTION_V OPTION_M OPTION_t STARTUP HLL SYSLIB FLOAT NOFLOAT -%token OPTION_Map -%token OPTION_n OPTION_r OPTION_o OPTION_b OPTION_R OPTION_relax -%token OPTION_l OPTION_L OPTION_T OPTION_Aarch OPTION_Tfile OPTION_Texp -%token OPTION_y -%token OPTION_Ur -%token ORIGIN FILL OPTION_g -%token LENGTH CREATE_OBJECT_SYMBOLS INPUT OUTPUT CONSTRUCTORS -%token OPTION_RETAIN_SYMBOLS_FILE ALIGNMOD - +%token NAME DEFINED TARGET_K SEARCH_DIR MAP ENTRY +%token SIZEOF NEXT ADDR +%token STARTUP HLL SYSLIB FLOAT NOFLOAT +%token ORIGIN FILL +%token LENGTH CREATE_OBJECT_SYMBOLS INPUT OUTPUT CONSTRUCTORS +%token ALIGNMOD AT %type assign_op - %type filename - - %token CHIP LIST SECT ABSOLUTE LOAD NEWLINE ENDWORD ORDER NAMEWORD -%token FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE - -%{ -ld_config_type config; -%} +%token FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE REL +%token INPUT_SCRIPT INPUT_MRI_SCRIPT INPUT_DEFSYM %% -file: command_line { lang_final(); }; +file: + INPUT_SCRIPT script_file + | INPUT_MRI_SCRIPT mri_script_file + | INPUT_DEFSYM defsym_expr + ; filename: NAME; -command_line: - command_line command_line_option - | - ; - -command_line_option: - OPTION_Bstatic { } - | OPTION_v - { - ldversion(0); - option_v = true; - } - | OPTION_V - { - ldversion(1); - option_v = true; - } - | OPTION_t { - trace_files = true; - } - | OPTION_Map NAME +defsym_expr: + { ldlex_defsym(); } + NAME '=' exp { - write_map = true; - config.map_filename = $2; - } - | OPTION_M { - config.map_filename = "-"; - - } - | OPTION_n { - config.magic_demand_paged = false; - } - | OPTION_N { - config.text_read_only = false; - config.magic_demand_paged = false; - } - | OPTION_s { - strip_symbols = STRIP_ALL; - } - | OPTION_S { - strip_symbols = STRIP_DEBUGGER; - } - | OPTION_u NAME { - ldlang_add_undef($2); - } - - | OPTION_r { - config.relocateable_output = true; - config.build_constructors = false; - config.magic_demand_paged = false; - config.text_read_only = false; - } - | OPTION_Ur { - config.relocateable_output = true; - config.build_constructors = true; - config.magic_demand_paged = false; - config.text_read_only = false; - } - | OPTION_o filename - { - lang_add_output($2); - } - | OPTION_e NAME - { lang_add_entry($2); - } - | OPTION_X { - discard_locals = DISCARD_L; - } - | OPTION_x { - discard_locals = DISCARD_ALL; - } - - | OPTION_noinhibit_exec - { - force_make_executable = true; - } - | OPTION_sort_common { - config.sort_common = true; - } - | OPTION_d { - command_line.force_common_definition = true; - } - - | OPTION_relax { - command_line.relax = true; - } - | OPTION_dc - { - command_line.force_common_definition = true; - } - | OPTION_g - { - /* Ignored */ - } - | OPTION_dp - { - command_line.force_common_definition = true; - } - | OPTION_format NAME - { - lang_add_target($2); - } - | OPTION_Texp - { ldlex_expression(); - hex_mode = 16; - } - INT - { ldlex_popstate(); - lang_section_start($1,exp_intop($3)); - hex_mode = 0; - } - | OPTION_y - { - add_ysym($1); - } - | OPTION_Aarch - { - ldfile_add_arch($1); - } - | OPTION_b NAME - { - lang_add_target($2); - } - | OPTION_L - { - ldfile_add_library_path($1); - } - | OPTION_F - { - /* Ignore */ + ldlex_popstate(); + lang_add_assignment(exp_assop($3,$2,$4)); } - | NAME - { lang_add_input_file($1,lang_input_file_is_file_enum, - (char *)NULL); } - | OPTION_c filename - { ldfile_open_command_file($2); } mri_script_file END { ldlex_command();} - - | OPTION_Tfile - { ldfile_open_command_file($1); } script_file - END { ldlex_command();} - - | OPTION_T filename - { ldfile_open_command_file($2); } script_file - END { ldlex_command();} - - | OPTION_l - { - lang_add_input_file($1, - lang_input_file_is_l_enum, - (char *)NULL); - } - | OPTION_R filename - { - lang_add_input_file($2, - lang_input_file_is_symbols_only_enum, - (char *)NULL); - } - - | OPTION_defsym { ldlex_defsym(); } - NAME '=' exp DEFSYMEND { ldlex_popstate(); - lang_add_assignment(exp_assop($4,$3,$5)); - } - | OPTION_RETAIN_SYMBOLS_FILE filename - { lang_add_keepsyms_file ($2); } - | '-' NAME - { info("%P%F Unrecognized option -%s\n", $2); } - - | '{' script_file '}' - ; - /* SYNTAX WITHIN AN MRI SCRIPT FILE */ mri_script_file: @@ -365,7 +153,6 @@ mri_script_command: einfo("%P%F: unrecognised keyword in MRI style script '%s'\n",$1); } | LIST { - write_map = true; config.map_filename = "-"; } | ORDER ordernamelist @@ -395,11 +182,11 @@ mri_script_command: | ALIAS NAME ',' NAME { mri_alias($2,$4,0);} | ALIAS NAME ',' INT - { mri_alias($2,0,$4);} + { mri_alias($2,0,(int) $4);} | BASE exp { mri_base($2); } | TRUNCATE INT - { mri_truncate($2); } + { mri_truncate((unsigned int) $2); } | ; @@ -452,12 +239,12 @@ ifile_p1: | TARGET_K '(' NAME ')' { lang_add_target($3); } | SEARCH_DIR '(' filename ')' - { ldfile_add_library_path($3); } + { ldfile_add_library_path ($3, false); } | OUTPUT '(' filename ')' - { lang_add_output($3); } - | OUTPUT_FORMAT '(' NAME ')' - { lang_add_output_format($3); } - | OUTPUT_ARCH '(' NAME ')' + { lang_add_output($3, 1); } + | OUTPUT_FORMAT '(' NAME ')' + { lang_add_output_format($3, 1); } + | OUTPUT_ARCH '(' NAME ')' { ldfile_set_output_arch($3); } | FORCE_COMMON_ALLOCATION { command_line.force_common_definition = true ; } @@ -470,14 +257,13 @@ ifile_p1: input_list: NAME - { lang_add_input_file($1,lang_input_file_is_file_enum, + { lang_add_input_file($1,lang_input_file_is_search_file_enum, (char *)NULL); } | input_list ',' NAME - { lang_add_input_file($3,lang_input_file_is_file_enum, + { lang_add_input_file($3,lang_input_file_is_search_file_enum, (char *)NULL); } | input_list NAME - { lang_add_input_file($2, -lang_input_file_is_file_enum, + { lang_add_input_file($2,lang_input_file_is_search_file_enum, (char *)NULL); } ; @@ -493,7 +279,7 @@ sec_or_group_p1: statement_anywhere: ENTRY '(' NAME ')' - { lang_add_entry($3); } + { lang_add_entry ($3, 0); } | assignment end ; @@ -528,37 +314,47 @@ input_section_spec: ; statement: - statement assignment end - | statement CREATE_OBJECT_SYMBOLS + assignment end + | CREATE_OBJECT_SYMBOLS { - -lang_add_attribute(lang_object_symbols_statement_enum); } - | statement ';' - | statement CONSTRUCTORS + lang_add_attribute(lang_object_symbols_statement_enum); + } + | ';' + | CONSTRUCTORS { -lang_add_attribute(lang_constructors_statement_enum); } - - | statement input_section_spec - | statement length '(' exp ')' + lang_add_attribute(lang_constructors_statement_enum); + } + | input_section_spec + | length '(' exp ')' { - lang_add_data($2,$4); + lang_add_data((int) $1,$3); } - | statement FILL '(' exp ')' + | FILL '(' exp ')' { lang_add_fill - (exp_get_value_int($4, + (exp_get_value_int($3, 0, "fill value", - -lang_first_phase_enum)); + lang_first_phase_enum)); } - | + ; + +statement_list: + statement_list statement + | statement + ; + +statement_list_opt: + /* empty */ + | statement_list ; length: - LONG + QUAD + { $$ = $1; } + | LONG { $$ = $1; } | SHORT { $$ = $1; } @@ -707,7 +503,7 @@ exp : | '(' exp ')' { $$ = $2; } | NEXT '(' exp ')' %prec UNARY - { $$ = exp_unop($1,$3); } + { $$ = exp_unop((int) $1,$3); } | '!' exp %prec UNARY { $$ = exp_unop('!', $2); } | '+' exp %prec UNARY @@ -773,19 +569,23 @@ exp : ; - +opt_at: + AT '(' exp ')' { $$ = $3; } + | { $$ = 0; } + ; section: NAME { ldlex_expression(); } - opt_exp_with_type { ldlex_popstate(); } + opt_exp_with_type + opt_at { ldlex_popstate(); } '{' - { - lang_enter_output_section_statement($1,$3,typebits,0,0,0); - } - statement - '}' {ldlex_expression();} fill_opt memspec_opt + { + lang_enter_output_section_statement($1,$3,typebits,0,0,0,$4); + } + statement_list_opt + '}' {ldlex_expression();} memspec_opt fill_opt { ldlex_popstate(); - lang_leave_output_section_statement($10, $11); + lang_leave_output_section_statement($12, $11); } opt_comma @@ -802,9 +602,10 @@ type: opt_exp_with_type: - exp ':' { $$ = $1; typebits =0;} - | exp '(' type ')' ':' { $$ = $1; } - | ':' { $$= (etree_type *)NULL; typebits = 0} + exp ':' { $$ = $1; typebits =0;} + | exp '(' type ')' ':' { $$ = $1; } + | ':' { $$= (etree_type *)NULL; typebits = 0; } + | '(' type ')' ':' { $$= (etree_type *)NULL; } ; memspec_opt: @@ -815,10 +616,10 @@ memspec_opt: %% void yyerror(arg) -char *arg; + const char *arg; { - if (error_index> 0 && error_index < ERROR_NAME_MAX) - einfo("%P%F: %S syntax error in %s\n",error_names[error_index-1]); + if (error_index > 0 && error_index < ERROR_NAME_MAX) + einfo("%P%F: %S %s in %s\n", arg, error_names[error_index-1]); else - einfo("%P%F: %S syntax error\n"); + einfo("%P%F: %S %s\n", arg); }