X-Git-Url: https://repo.jachan.dev/binutils.git/blobdiff_plain/fcf276c4958f7cc906ec389f003aa2a713c98528..28d0c3ce1963ba684d0492524c1cba6454e1d401:/ld/ldgram.y diff --git a/ld/ldgram.y b/ld/ldgram.y index d5726d1212..7d139719b6 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,18 +35,11 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "ldemul.h" #include "ldfile.h" #include "ldmisc.h" -#include "ldsym.h" #include "ldmain.h" #include "mri.h" #include "ldlex.h" -#define YYDEBUG 1 - static int typebits; -strip_symbols_type strip_symbols=STRIP_NONE; -discard_locals_type discard_locals=DISCARD_NONE; - -static char *dirlist_ptr; lang_memory_region_type *region; @@ -67,21 +61,9 @@ 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 opt_at @@ -105,310 +87,48 @@ static int error_index; %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 OPTION_warn_common -%token OPTION_EB OPTION_EL OPTION_G OPTION_Gval OPTION_help -%token OPTION_format OPTION_oformat 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_memul OPTION_M OPTION_t STARTUP HLL SYSLIB FLOAT NOFLOAT -%token OPTION_L OPTION_Map -%token OPTION_n OPTION_r OPTION_o OPTION_b OPTION_R OPTION_relax OPTION_version -%token OPTION_l OPTION_Lfile OPTION_T OPTION_Aarch OPTION_Tfile -%token OPTION_Texp OPTION_y -%token OPTION_Ur -%token ORIGIN FILL OPTION_g -%token LENGTH CREATE_OBJECT_SYMBOLS INPUT OUTPUT CONSTRUCTORS -%token OPTION_RETAIN_SYMBOLS_FILE ALIGNMOD AT -%token OPTION_Qy OPTION_Y OPTION_dn OPTION_call_shared OPTION_non_shared -%token OPTION_Oval -%token OPTION_YP - +%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 GROUP OUTPUT CONSTRUCTORS +%token ALIGNMOD AT PROVIDE %type assign_op - %type filename - - %token CHIP LIST SECT ABSOLUTE LOAD NEWLINE ENDWORD ORDER NAMEWORD -%token FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE +%token FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE REL +%token INPUT_SCRIPT INPUT_MRI_SCRIPT INPUT_DEFSYM %% -file: command_line { lang_final(); }; - - -filename: NAME; - - -command_line: - command_line command_line_option - | +file: + INPUT_SCRIPT script_file + | INPUT_MRI_SCRIPT mri_script_file + | INPUT_DEFSYM defsym_expr ; -command_line_option: - OPTION_Bstatic { } - | OPTION_help - { - help (); - exit (0); - } - | OPTION_v - { - ldversion(0); - } - | OPTION_V - { - ldversion(1); - trace_file_tries = true; - } - | OPTION_version - { - ldversion(0); - exit(0); - } - | OPTION_t { - trace_files = true; - } - | OPTION_Map NAME - { - write_map = true; - config.map_filename = $2; - } - | OPTION_m NAME - { - /* Ignore. */ - } - | OPTION_memul - { - /* Ignore. */ - } - | 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, 0); - } - | 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_warn_common - { - config.warn_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_oformat NAME - { - lang_add_output_format($2, 0); - } - | 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 NAME - { - ldfile_add_library_path($2); - } - | OPTION_Lfile - { - ldfile_add_library_path($1); - } - | OPTION_F - { - /* Ignore */ - } - | 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();} +filename: NAME; - | 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); } - | OPTION_EB +defsym_expr: + { ldlex_defsym(); } + NAME '=' exp { - /* FIXME: This is currently ignored. It means - ``produce a big-endian object file''. It could - be used to select an output format. */ - } - | OPTION_EL - { - /* FIXME: This is currently ignored. It means - ``produce a little-endian object file''. It could - be used to select an output format. */ - } - | OPTION_G NAME - { - g_switch_value = atoi ($2); - } - | OPTION_Gval - { - g_switch_value = yylval.integer; - } - | OPTION_Qy - | OPTION_dn - | OPTION_non_shared - | OPTION_call_shared - | OPTION_Oval - | OPTION_YP - { - dirlist_ptr = $1; - goto set_default_dirlist; - } - | OPTION_Y NAME - { - if (strncmp ($2, "P,", 2)) - einfo ("%P%F: unknown -Y option -- %s\n", $2); - else - { - char *p = ""; - dirlist_ptr = $2; - set_default_dirlist: - while (p != 0) - { - p = strchr (dirlist_ptr, ':'); - if (p) - *p = 0; - if (*dirlist_ptr) - ldfile_add_library_path (dirlist_ptr); - if (p) - { - *p = ':'; - dirlist_ptr = p + 1; - } - } - } - } - | '{' script_file '}' { /* This parses compiled-in scripts. */ } - | NAME - { - if (*$1 == '-') - einfo("%P%F: illegal option -- %s\n", $1); - else - lang_add_input_file($1,lang_input_file_is_file_enum, - (char *)NULL); + ldlex_popstate(); + lang_add_assignment(exp_assop($3,$2,$4)); } - ; - /* SYNTAX WITHIN AN MRI SCRIPT FILE */ mri_script_file: @@ -433,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 @@ -463,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); } | ; @@ -520,7 +239,7 @@ 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, 1); } | OUTPUT_FORMAT '(' NAME ')' @@ -530,6 +249,10 @@ ifile_p1: | FORCE_COMMON_ALLOCATION { command_line.force_common_definition = true ; } | INPUT '(' input_list ')' + | GROUP + { lang_enter_group (); } + '(' input_list ')' + { lang_leave_group (); } | MAP '(' filename ')' { lang_add_map($3); } | INCLUDE filename @@ -560,7 +283,7 @@ sec_or_group_p1: statement_anywhere: ENTRY '(' NAME ')' - { lang_add_entry($3); } + { lang_add_entry ($3, 0); } | assignment end ; @@ -609,7 +332,7 @@ statement: | input_section_spec | length '(' exp ')' { - lang_add_data($1,$3); + lang_add_data((int) $1,$3); } | FILL '(' exp ')' @@ -633,7 +356,9 @@ statement_list_opt: ; length: - LONG + QUAD + { $$ = $1; } + | LONG { $$ = $1; } | SHORT { $$ = $1; } @@ -681,14 +406,20 @@ end: ';' | ',' assignment: NAME '=' mustbe_exp { - lang_add_assignment(exp_assop($2,$1,$3)); + lang_add_assignment (exp_assop ($2, $1, $3)); } | NAME assign_op mustbe_exp { - -lang_add_assignment(exp_assop('=',$1,exp_binop($2,exp_nameop(NAME,$1),$3))); + lang_add_assignment (exp_assop ('=', $1, + exp_binop ($2, + exp_nameop (NAME, + $1), + $3))); + } + | PROVIDE '(' NAME '=' mustbe_exp ')' + { + lang_add_assignment (exp_provide ($3, $5)); } - ; @@ -782,7 +513,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 @@ -843,6 +574,8 @@ exp : { $$ = exp_unop(ABSOLUTE, $3); } | ALIGN_K '(' exp ')' { $$ = exp_unop(ALIGN_K,$3); } + | BLOCK '(' exp ')' + { $$ = exp_unop(ALIGN_K,$3); } | NAME { $$ = exp_nameop(NAME,$1); } ; @@ -861,10 +594,10 @@ section: NAME { ldlex_expression(); } lang_enter_output_section_statement($1,$3,typebits,0,0,0,$4); } statement_list_opt - '}' {ldlex_expression();} fill_opt memspec_opt + '}' {ldlex_expression();} memspec_opt fill_opt { ldlex_popstate(); - lang_leave_output_section_statement($11, $12); + lang_leave_output_section_statement($12, $11); } opt_comma @@ -895,10 +628,13 @@ 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 (ldfile_assumed_script) + einfo ("%P:%s: file format not recognized; treating as linker script\n", + ldfile_input_filename); + 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); }