version 1.5, 2018/04/14 15:49:44 |
version 1.6, 2020/04/03 17:51:14 |
|
|
/* A YACC grammar to parse a superset of the AT&T linker scripting language. |
/* A YACC grammar to parse a superset of the AT&T linker scripting language. |
Copyright (C) 1991-2016 Free Software Foundation, Inc. |
Copyright (C) 1991-2018 Free Software Foundation, Inc. |
Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com). |
Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com). |
|
|
This file is part of the GNU Binutils. |
This file is part of the GNU Binutils. |
|
|
static enum section_type sectype; |
static enum section_type sectype; |
static lang_memory_region_type *region; |
static lang_memory_region_type *region; |
|
|
bfd_boolean ldgram_had_keep = FALSE; |
static bfd_boolean ldgram_had_keep = FALSE; |
char *ldgram_vers_current_lang = NULL; |
static char *ldgram_vers_current_lang = NULL; |
|
|
#define ERROR_NAME_MAX 20 |
#define ERROR_NAME_MAX 20 |
static char *error_names[ERROR_NAME_MAX]; |
static char *error_names[ERROR_NAME_MAX]; |
Line 92 static int error_index; |
|
Line 92 static int error_index; |
|
%type <etree> opt_exp_without_type opt_subalign opt_align |
%type <etree> opt_exp_without_type opt_subalign opt_align |
%type <fill> fill_opt fill_exp |
%type <fill> fill_opt fill_exp |
%type <name_list> exclude_name_list |
%type <name_list> exclude_name_list |
%type <wildcard_list> file_NAME_list |
%type <wildcard_list> section_name_list |
%type <flag_info_list> sect_flag_list |
%type <flag_info_list> sect_flag_list |
%type <flag_info> sect_flags |
%type <flag_info> sect_flags |
%type <name> memspec_opt casesymlist |
%type <name> memspec_opt casesymlist |
%type <name> memspec_at_opt |
%type <name> memspec_at_opt |
%type <cname> wildcard_name |
%type <cname> wildcard_name |
%type <wildcard> wildcard_spec |
%type <wildcard> section_name_spec filename_spec wildcard_maybe_exclude |
%token <bigint> INT |
%token <bigint> INT |
%token <name> NAME LNAME |
%token <name> NAME LNAME |
%type <integer> length |
%type <integer> length |
Line 131 static int error_index; |
|
Line 131 static int error_index; |
|
%token SORT_BY_INIT_PRIORITY |
%token SORT_BY_INIT_PRIORITY |
%token '{' '}' |
%token '{' '}' |
%token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH |
%token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH |
%token INHIBIT_COMMON_ALLOCATION |
%token INHIBIT_COMMON_ALLOCATION FORCE_GROUP_ALLOCATION |
%token SEGMENT_START |
%token SEGMENT_START |
%token INCLUDE |
%token INCLUDE |
%token MEMORY |
%token MEMORY |
Line 199 mri_script_file: |
|
Line 199 mri_script_file: |
|
|
|
mri_script_lines: |
mri_script_lines: |
mri_script_lines mri_script_command NEWLINE |
mri_script_lines mri_script_command NEWLINE |
| |
| |
; |
; |
|
|
mri_script_command: |
mri_script_command: |
CHIP exp |
CHIP exp |
| CHIP exp ',' exp |
| CHIP exp ',' exp |
| NAME { |
| NAME { |
einfo(_("%P%F: unrecognised keyword in MRI style script '%s'\n"),$1); |
einfo(_("%F%P: unrecognised keyword in MRI style script '%s'\n"),$1); |
} |
} |
| LIST { |
| LIST { |
config.map_filename = "-"; |
config.map_filename = "-"; |
} |
} |
| ORDER ordernamelist |
| ORDER ordernamelist |
| ENDWORD |
| ENDWORD |
| PUBLIC NAME '=' exp |
| PUBLIC NAME '=' exp |
{ mri_public($2, $4); } |
{ mri_public($2, $4); } |
| PUBLIC NAME ',' exp |
| PUBLIC NAME ',' exp |
{ mri_public($2, $4); } |
{ mri_public($2, $4); } |
| PUBLIC NAME exp |
| PUBLIC NAME exp |
{ mri_public($2, $3); } |
{ mri_public($2, $3); } |
| FORMAT NAME |
| FORMAT NAME |
{ mri_format($2); } |
{ mri_format($2); } |
| SECT NAME ',' exp |
| SECT NAME ',' exp |
{ mri_output_section($2, $4);} |
{ mri_output_section($2, $4);} |
Line 237 mri_script_command: |
|
Line 237 mri_script_command: |
|
{ mri_alignmod($2,$4); } |
{ mri_alignmod($2,$4); } |
| ABSOLUTE mri_abs_name_list |
| ABSOLUTE mri_abs_name_list |
| LOAD mri_load_name_list |
| LOAD mri_load_name_list |
| NAMEWORD NAME |
| NAMEWORD NAME |
{ mri_name($2); } |
{ mri_name($2); } |
| ALIAS NAME ',' NAME |
| ALIAS NAME ',' NAME |
{ mri_alias($2,$4,0);} |
{ mri_alias($2,$4,0);} |
| ALIAS NAME ',' INT |
| ALIAS NAME ',' INT |
{ mri_alias ($2, 0, (int) $4.integer); } |
{ mri_alias ($2, 0, (int) $4.integer); } |
| BASE exp |
| BASE exp |
{ mri_base($2); } |
{ mri_base($2); } |
| TRUNCATE INT |
| TRUNCATE INT |
{ mri_truncate ((unsigned int) $2.integer); } |
{ mri_truncate ((unsigned int) $2.integer); } |
Line 255 mri_script_command: |
|
Line 255 mri_script_command: |
|
{ ldlex_popstate (); } |
{ ldlex_popstate (); } |
| START NAME |
| START NAME |
{ lang_add_entry ($2, FALSE); } |
{ lang_add_entry ($2, FALSE); } |
| |
| |
; |
; |
|
|
ordernamelist: |
ordernamelist: |
ordernamelist ',' NAME { mri_order($3); } |
ordernamelist ',' NAME { mri_order($3); } |
| ordernamelist NAME { mri_order($2); } |
| ordernamelist NAME { mri_order($2); } |
| |
| |
; |
; |
|
|
mri_load_name_list: |
mri_load_name_list: |
Line 271 mri_load_name_list: |
|
Line 271 mri_load_name_list: |
|
; |
; |
|
|
mri_abs_name_list: |
mri_abs_name_list: |
NAME |
NAME |
{ mri_only_load($1); } |
{ mri_only_load($1); } |
| mri_abs_name_list ',' NAME |
| mri_abs_name_list ',' NAME |
{ mri_only_load($3); } |
{ mri_only_load($3); } |
; |
; |
|
|
casesymlist: |
casesymlist: |
|
|
{ ldlex_both(); } |
{ ldlex_both(); } |
ifile_list |
ifile_list |
{ ldlex_popstate(); } |
{ ldlex_popstate(); } |
; |
; |
|
|
ifile_list: |
ifile_list: |
ifile_list ifile_p1 |
ifile_list ifile_p1 |
| |
| |
; |
; |
|
|
|
|
|
|
| floating_point_support |
| floating_point_support |
| statement_anywhere |
| statement_anywhere |
| version |
| version |
| ';' |
| ';' |
| TARGET_K '(' NAME ')' |
| TARGET_K '(' NAME ')' |
{ lang_add_target($3); } |
{ lang_add_target($3); } |
| SEARCH_DIR '(' filename ')' |
| SEARCH_DIR '(' filename ')' |
{ ldfile_add_library_path ($3, FALSE); } |
{ ldfile_add_library_path ($3, FALSE); } |
| OUTPUT '(' filename ')' |
| OUTPUT '(' filename ')' |
{ lang_add_output($3, 1); } |
{ lang_add_output($3, 1); } |
| OUTPUT_FORMAT '(' NAME ')' |
| OUTPUT_FORMAT '(' NAME ')' |
{ lang_add_output_format ($3, (char *) NULL, |
{ lang_add_output_format ($3, (char *) NULL, |
(char *) NULL, 1); } |
(char *) NULL, 1); } |
| OUTPUT_FORMAT '(' NAME ',' NAME ',' NAME ')' |
| OUTPUT_FORMAT '(' NAME ',' NAME ',' NAME ')' |
{ lang_add_output_format ($3, $5, $7, 1); } |
{ lang_add_output_format ($3, $5, $7, 1); } |
| OUTPUT_ARCH '(' NAME ')' |
| OUTPUT_ARCH '(' NAME ')' |
{ ldfile_set_output_arch ($3, bfd_arch_unknown); } |
{ ldfile_set_output_arch ($3, bfd_arch_unknown); } |
| FORCE_COMMON_ALLOCATION |
| FORCE_COMMON_ALLOCATION |
{ command_line.force_common_definition = TRUE ; } |
{ command_line.force_common_definition = TRUE ; } |
|
| FORCE_GROUP_ALLOCATION |
|
{ command_line.force_group_allocation = TRUE ; } |
| INHIBIT_COMMON_ALLOCATION |
| INHIBIT_COMMON_ALLOCATION |
{ command_line.inhibit_common_definition = TRUE ; } |
{ link_info.inhibit_common_definition = TRUE ; } |
| INPUT '(' input_list ')' |
| INPUT '(' input_list ')' |
| GROUP |
| GROUP |
{ lang_enter_group (); } |
{ lang_enter_group (); } |
'(' input_list ')' |
'(' input_list ')' |
{ lang_leave_group (); } |
{ lang_leave_group (); } |
| MAP '(' filename ')' |
| MAP '(' filename ')' |
{ lang_add_map($3); } |
{ lang_add_map($3); } |
| INCLUDE filename |
| INCLUDE filename |
{ ldlex_script (); ldfile_open_command_file($2); } |
{ ldlex_script (); ldfile_open_command_file($2); } |
|
|
} |
} |
; |
; |
|
|
wildcard_spec: |
wildcard_maybe_exclude: |
wildcard_name |
wildcard_name |
{ |
{ |
$$.name = $1; |
$$.name = $1; |
|
|
$$.exclude_name_list = NULL; |
$$.exclude_name_list = NULL; |
$$.section_flag_list = NULL; |
$$.section_flag_list = NULL; |
} |
} |
| EXCLUDE_FILE '(' exclude_name_list ')' wildcard_name |
| EXCLUDE_FILE '(' exclude_name_list ')' wildcard_name |
{ |
{ |
$$.name = $5; |
$$.name = $5; |
$$.sorted = none; |
$$.sorted = none; |
$$.exclude_name_list = $3; |
$$.exclude_name_list = $3; |
$$.section_flag_list = NULL; |
$$.section_flag_list = NULL; |
} |
} |
| SORT_BY_NAME '(' wildcard_name ')' |
; |
|
|
|
filename_spec: |
|
wildcard_maybe_exclude |
|
| SORT_BY_NAME '(' wildcard_maybe_exclude ')' |
{ |
{ |
$$.name = $3; |
$$ = $3; |
|
$$.sorted = by_name; |
|
} |
|
| SORT_NONE '(' wildcard_maybe_exclude ')' |
|
{ |
|
$$ = $3; |
|
$$.sorted = by_none; |
|
} |
|
; |
|
|
|
section_name_spec: |
|
wildcard_maybe_exclude |
|
| SORT_BY_NAME '(' wildcard_maybe_exclude ')' |
|
{ |
|
$$ = $3; |
$$.sorted = by_name; |
$$.sorted = by_name; |
$$.exclude_name_list = NULL; |
|
$$.section_flag_list = NULL; |
|
} |
} |
| SORT_BY_ALIGNMENT '(' wildcard_name ')' |
| SORT_BY_ALIGNMENT '(' wildcard_maybe_exclude ')' |
{ |
{ |
$$.name = $3; |
$$ = $3; |
$$.sorted = by_alignment; |
$$.sorted = by_alignment; |
$$.exclude_name_list = NULL; |
|
$$.section_flag_list = NULL; |
|
} |
} |
| SORT_NONE '(' wildcard_name ')' |
| SORT_NONE '(' wildcard_maybe_exclude ')' |
{ |
{ |
$$.name = $3; |
$$ = $3; |
$$.sorted = by_none; |
$$.sorted = by_none; |
$$.exclude_name_list = NULL; |
|
$$.section_flag_list = NULL; |
|
} |
} |
| SORT_BY_NAME '(' SORT_BY_ALIGNMENT '(' wildcard_name ')' ')' |
| SORT_BY_NAME '(' SORT_BY_ALIGNMENT '(' wildcard_maybe_exclude ')' ')' |
{ |
{ |
$$.name = $5; |
$$ = $5; |
$$.sorted = by_name_alignment; |
$$.sorted = by_name_alignment; |
$$.exclude_name_list = NULL; |
|
$$.section_flag_list = NULL; |
|
} |
} |
| SORT_BY_NAME '(' SORT_BY_NAME '(' wildcard_name ')' ')' |
| SORT_BY_NAME '(' SORT_BY_NAME '(' wildcard_maybe_exclude ')' ')' |
{ |
{ |
$$.name = $5; |
$$ = $5; |
$$.sorted = by_name; |
$$.sorted = by_name; |
$$.exclude_name_list = NULL; |
|
$$.section_flag_list = NULL; |
|
} |
} |
| SORT_BY_ALIGNMENT '(' SORT_BY_NAME '(' wildcard_name ')' ')' |
| SORT_BY_ALIGNMENT '(' SORT_BY_NAME '(' wildcard_maybe_exclude ')' ')' |
{ |
{ |
$$.name = $5; |
$$ = $5; |
$$.sorted = by_alignment_name; |
$$.sorted = by_alignment_name; |
$$.exclude_name_list = NULL; |
|
$$.section_flag_list = NULL; |
|
} |
} |
| SORT_BY_ALIGNMENT '(' SORT_BY_ALIGNMENT '(' wildcard_name ')' ')' |
| SORT_BY_ALIGNMENT '(' SORT_BY_ALIGNMENT '(' wildcard_maybe_exclude ')' ')' |
{ |
{ |
$$.name = $5; |
$$ = $5; |
$$.sorted = by_alignment; |
$$.sorted = by_alignment; |
$$.exclude_name_list = NULL; |
|
$$.section_flag_list = NULL; |
|
} |
|
| SORT_BY_NAME '(' EXCLUDE_FILE '(' exclude_name_list ')' wildcard_name ')' |
|
{ |
|
$$.name = $7; |
|
$$.sorted = by_name; |
|
$$.exclude_name_list = $5; |
|
$$.section_flag_list = NULL; |
|
} |
} |
| SORT_BY_INIT_PRIORITY '(' wildcard_name ')' |
| SORT_BY_INIT_PRIORITY '(' wildcard_maybe_exclude ')' |
{ |
{ |
$$.name = $3; |
$$ = $3; |
$$.sorted = by_init_priority; |
$$.sorted = by_init_priority; |
$$.exclude_name_list = NULL; |
|
$$.section_flag_list = NULL; |
|
} |
} |
; |
; |
|
|
Line 596 exclude_name_list: |
|
Line 593 exclude_name_list: |
|
} |
} |
; |
; |
|
|
file_NAME_list: |
section_name_list: |
file_NAME_list opt_comma wildcard_spec |
section_name_list opt_comma section_name_spec |
{ |
{ |
struct wildcard_list *tmp; |
struct wildcard_list *tmp; |
tmp = (struct wildcard_list *) xmalloc (sizeof *tmp); |
tmp = (struct wildcard_list *) xmalloc (sizeof *tmp); |
|
|
$$ = tmp; |
$$ = tmp; |
} |
} |
| |
| |
wildcard_spec |
section_name_spec |
{ |
{ |
struct wildcard_list *tmp; |
struct wildcard_list *tmp; |
tmp = (struct wildcard_list *) xmalloc (sizeof *tmp); |
tmp = (struct wildcard_list *) xmalloc (sizeof *tmp); |
Line 635 input_section_spec_no_keep: |
|
Line 632 input_section_spec_no_keep: |
|
tmp.section_flag_list = $1; |
tmp.section_flag_list = $1; |
lang_add_wild (&tmp, NULL, ldgram_had_keep); |
lang_add_wild (&tmp, NULL, ldgram_had_keep); |
} |
} |
| '[' file_NAME_list ']' |
| '[' section_name_list ']' |
{ |
{ |
lang_add_wild (NULL, $2, ldgram_had_keep); |
lang_add_wild (NULL, $2, ldgram_had_keep); |
} |
} |
| sect_flags '[' file_NAME_list ']' |
| sect_flags '[' section_name_list ']' |
{ |
{ |
struct wildcard_spec tmp; |
struct wildcard_spec tmp; |
tmp.name = NULL; |
tmp.name = NULL; |
Line 648 input_section_spec_no_keep: |
|
Line 645 input_section_spec_no_keep: |
|
tmp.section_flag_list = $1; |
tmp.section_flag_list = $1; |
lang_add_wild (&tmp, $3, ldgram_had_keep); |
lang_add_wild (&tmp, $3, ldgram_had_keep); |
} |
} |
| wildcard_spec '(' file_NAME_list ')' |
| filename_spec '(' section_name_list ')' |
{ |
{ |
lang_add_wild (&$1, $3, ldgram_had_keep); |
lang_add_wild (&$1, $3, ldgram_had_keep); |
} |
} |
| sect_flags wildcard_spec '(' file_NAME_list ')' |
| sect_flags filename_spec '(' section_name_list ')' |
{ |
{ |
$2.section_flag_list = $1; |
$2.section_flag_list = $1; |
lang_add_wild (&$2, $4, ldgram_had_keep); |
lang_add_wild (&$2, $4, ldgram_had_keep); |
Line 668 input_section_spec: |
|
Line 665 input_section_spec: |
|
; |
; |
|
|
statement: |
statement: |
assignment end |
assignment end |
| CREATE_OBJECT_SYMBOLS |
| CREATE_OBJECT_SYMBOLS |
{ |
{ |
lang_add_attribute(lang_object_symbols_statement_enum); |
lang_add_attribute(lang_object_symbols_statement_enum); |
} |
} |
| ';' |
| ';' |
| CONSTRUCTORS |
| CONSTRUCTORS |
{ |
{ |
|
|
lang_add_attribute(lang_constructors_statement_enum); |
lang_add_attribute(lang_constructors_statement_enum); |
|
|
lang_add_attribute (lang_constructors_statement_enum); |
lang_add_attribute (lang_constructors_statement_enum); |
} |
} |
| input_section_spec |
| input_section_spec |
| length '(' mustbe_exp ')' |
| length '(' mustbe_exp ')' |
{ |
{ |
lang_add_data ((int) $1, $3); |
lang_add_data ((int) $1, $3); |
} |
} |
|
|
| FILL '(' fill_exp ')' |
| FILL '(' fill_exp ')' |
{ |
{ |
lang_add_fill ($3); |
lang_add_fill ($3); |
} |
} |
| ASSERT_K {ldlex_expression ();} '(' exp ',' NAME ')' end |
| ASSERT_K {ldlex_expression ();} '(' exp ',' NAME ')' end |
{ ldlex_popstate (); |
{ ldlex_popstate (); |
lang_add_assignment (exp_assert ($4, $6)); } |
lang_add_assignment (exp_assert ($4, $6)); } |
|
|
|
|
statement_list: |
statement_list: |
statement_list statement |
statement_list statement |
| statement |
| statement |
; |
; |
|
|
statement_list_opt: |
statement_list_opt: |
|
|
{ $$ = $1; } |
{ $$ = $1; } |
| LONG |
| LONG |
{ $$ = $1; } |
{ $$ = $1; } |
| SHORT |
| SHORT |
{ $$ = $1; } |
{ $$ = $1; } |
| BYTE |
| BYTE |
{ $$ = $1; } |
{ $$ = $1; } |
|
|
fill_opt: |
fill_opt: |
'=' fill_exp |
'=' fill_exp |
{ $$ = $2; } |
{ $$ = $2; } |
| { $$ = (fill_type *) 0; } |
| { $$ = (fill_type *) 0; } |
; |
; |
|
|
assign_op: |
assign_op: |
|
|
{ $$ = '+'; } |
{ $$ = '+'; } |
| MINUSEQ |
| MINUSEQ |
{ $$ = '-'; } |
{ $$ = '-'; } |
| MULTEQ |
| MULTEQ |
{ $$ = '*'; } |
{ $$ = '*'; } |
| DIVEQ |
| DIVEQ |
{ $$ = '/'; } |
{ $$ = '/'; } |
| LSHIFTEQ |
| LSHIFTEQ |
{ $$ = LSHIFT; } |
{ $$ = LSHIFT; } |
| RSHIFTEQ |
| RSHIFTEQ |
{ $$ = RSHIFT; } |
{ $$ = RSHIFT; } |
| ANDEQ |
| ANDEQ |
{ $$ = '&'; } |
{ $$ = '&'; } |
| OREQ |
| OREQ |
{ $$ = '|'; } |
{ $$ = '|'; } |
|
|
; |
; |
Line 807 memory_spec_list: |
|
Line 804 memory_spec_list: |
|
; |
; |
|
|
|
|
memory_spec: NAME |
memory_spec: NAME |
{ region = lang_memory_region_lookup ($1, TRUE); } |
{ region = lang_memory_region_lookup ($1, TRUE); } |
attributes_opt ':' |
attributes_opt ':' |
origin_spec opt_comma length_spec |
origin_spec opt_comma length_spec |
|
|
; |
; |
|
|
length_spec: |
length_spec: |
LENGTH '=' mustbe_exp |
LENGTH '=' mustbe_exp |
{ |
{ |
region->length_exp = $3; |
region->length_exp = $3; |
} |
} |
|
|
{ $$ = exp_binop (NE , $1, $3); } |
{ $$ = exp_binop (NE , $1, $3); } |
| exp LE exp |
| exp LE exp |
{ $$ = exp_binop (LE , $1, $3); } |
{ $$ = exp_binop (LE , $1, $3); } |
| exp GE exp |
| exp GE exp |
{ $$ = exp_binop (GE , $1, $3); } |
{ $$ = exp_binop (GE , $1, $3); } |
| exp '<' exp |
| exp '<' exp |
{ $$ = exp_binop ('<' , $1, $3); } |
{ $$ = exp_binop ('<' , $1, $3); } |
|
|
{ $$ = exp_nameop (DEFINED, $3); } |
{ $$ = exp_nameop (DEFINED, $3); } |
| INT |
| INT |
{ $$ = exp_bigintop ($1.integer, $1.str); } |
{ $$ = exp_bigintop ($1.integer, $1.str); } |
| SIZEOF_HEADERS |
| SIZEOF_HEADERS |
{ $$ = exp_nameop (SIZEOF_HEADERS,0); } |
{ $$ = exp_nameop (SIZEOF_HEADERS,0); } |
|
|
| ALIGNOF '(' NAME ')' |
| ALIGNOF '(' NAME ')' |
|
|
{ $$ = exp_binop (DATA_SEGMENT_RELRO_END, $5, $3); } |
{ $$ = exp_binop (DATA_SEGMENT_RELRO_END, $5, $3); } |
| DATA_SEGMENT_END '(' exp ')' |
| DATA_SEGMENT_END '(' exp ')' |
{ $$ = exp_unop (DATA_SEGMENT_END, $3); } |
{ $$ = exp_unop (DATA_SEGMENT_END, $3); } |
| SEGMENT_START '(' NAME ',' exp ')' |
| SEGMENT_START '(' NAME ',' exp ')' |
{ /* The operands to the expression node are |
{ /* The operands to the expression node are |
placed in the opposite order from the way |
placed in the opposite order from the way |
in which they appear in the script as |
in which they appear in the script as |
that allows us to reuse more code in |
that allows us to reuse more code in |
|
|
|
|
|
|
memspec_at_opt: |
memspec_at_opt: |
AT '>' NAME { $$ = $3; } |
AT '>' NAME { $$ = $3; } |
| { $$ = 0; } |
| { $$ = 0; } |
; |
; |
|
|
opt_at: |
opt_at: |
AT '(' exp ')' { $$ = $3; } |
AT '(' exp ')' { $$ = $3; } |
Line 1056 sect_constraint: |
|
Line 1053 sect_constraint: |
|
| { $$ = 0; } |
| { $$ = 0; } |
; |
; |
|
|
section: NAME { ldlex_expression(); } |
section: NAME { ldlex_expression(); } |
opt_exp_with_type |
opt_exp_with_type |
opt_at |
opt_at |
opt_align |
opt_align |
Line 1070 section: NAME { ldlex_expression(); } |
|
Line 1067 section: NAME { ldlex_expression(); } |
|
$5, $7, $4, $9, $6); |
$5, $7, $4, $9, $6); |
} |
} |
statement_list_opt |
statement_list_opt |
'}' { ldlex_popstate (); ldlex_expression (); } |
'}' { ldlex_popstate (); ldlex_expression (); } |
memspec_opt memspec_at_opt phdr_opt fill_opt |
memspec_opt memspec_at_opt phdr_opt fill_opt |
{ |
{ |
ldlex_popstate (); |
ldlex_popstate (); |
|
|
; |
; |
|
|
atype: |
atype: |
'(' type ')' |
'(' type ')' |
| /* EMPTY */ { sectype = normal_section; } |
| /* EMPTY */ { sectype = normal_section; } |
| '(' ')' { sectype = normal_section; } |
| '(' ')' { sectype = normal_section; } |
; |
; |
|
|
opt_exp_with_type: |
opt_exp_with_type: |
|
|
else |
else |
{ |
{ |
einfo (_("\ |
einfo (_("\ |
%X%P:%S: unknown phdr type `%s' (try integer literal)\n"), |
%X%P:%pS: unknown phdr type `%s' (try integer literal)\n"), |
NULL, s); |
NULL, s); |
$$ = exp_intop (0); |
$$ = exp_intop (0); |
} |
} |
Line 1271 phdr_qualifiers: |
|
Line 1268 phdr_qualifiers: |
|
else if (strcmp ($1, "FLAGS") == 0 && $2 != NULL) |
else if (strcmp ($1, "FLAGS") == 0 && $2 != NULL) |
$$.flags = $2; |
$$.flags = $2; |
else |
else |
einfo (_("%X%P:%S: PHDRS syntax error at `%s'\n"), |
einfo (_("%X%P:%pS: PHDRS syntax error at `%s'\n"), |
NULL, $1); |
NULL, $1); |
} |
} |
| AT '(' exp ')' phdr_qualifiers |
| AT '(' exp ')' phdr_qualifiers |
|
|
{ |
{ |
$$ = lang_new_vers_pattern (NULL, $1, ldgram_vers_current_lang, FALSE); |
$$ = lang_new_vers_pattern (NULL, $1, ldgram_vers_current_lang, FALSE); |
} |
} |
| NAME |
| NAME |
{ |
{ |
$$ = lang_new_vers_pattern (NULL, $1, ldgram_vers_current_lang, TRUE); |
$$ = lang_new_vers_pattern (NULL, $1, ldgram_vers_current_lang, TRUE); |
} |
} |
|
|
einfo (_("%P:%s: file format not recognized; treating as linker script\n"), |
einfo (_("%P:%s: file format not recognized; treating as linker script\n"), |
ldlex_filename ()); |
ldlex_filename ()); |
if (error_index > 0 && error_index < ERROR_NAME_MAX) |
if (error_index > 0 && error_index < ERROR_NAME_MAX) |
einfo ("%P%F:%S: %s in %s\n", NULL, arg, error_names[error_index - 1]); |
einfo ("%F%P:%pS: %s in %s\n", NULL, arg, error_names[error_index - 1]); |
else |
else |
einfo ("%P%F:%S: %s\n", NULL, arg); |
einfo ("%F%P:%pS: %s\n", NULL, arg); |
} |
} |