projects
/
deliverable
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
gdb: Remove check for gdb_stderr == NULL
[deliverable/binutils-gdb.git]
/
ld
/
ldgram.y
diff --git
a/ld/ldgram.y
b/ld/ldgram.y
index 6e001184e091391b4658b1365f9df093496defa8..e2998f15533456e51987b74d52dd2028773589b7 100644
(file)
--- a/
ld/ldgram.y
+++ b/
ld/ldgram.y
@@
-1,7
+1,5
@@
/* 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 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
- Free Software Foundation, Inc.
+ Copyright (C) 1991-2017 Free Software Foundation, Inc.
Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com).
This file is part of the GNU Binutils.
Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com).
This file is part of the GNU Binutils.
@@
-50,8
+48,8
@@
static enum section_type sectype;
static lang_memory_region_type *region;
static enum section_type sectype;
static lang_memory_region_type *region;
-bfd_boolean ldgram_had_keep = FALSE;
-char *ldgram_vers_current_lang = NULL;
+
static
bfd_boolean ldgram_had_keep = FALSE;
+
static
char *ldgram_vers_current_lang = NULL;
#define ERROR_NAME_MAX 20
static char *error_names[ERROR_NAME_MAX];
#define ERROR_NAME_MAX 20
static char *error_names[ERROR_NAME_MAX];
@@
-94,13
+92,13
@@
static int error_index;
%type <etree> opt_exp_without_type opt_subalign opt_align
%type <fill> fill_opt fill_exp
%type <name_list> exclude_name_list
%type <etree> opt_exp_without_type opt_subalign opt_align
%type <fill> fill_opt fill_exp
%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> sect_flags
%type <name> memspec_opt casesymlist
%type <name> memspec_at_opt
%type <cname> wildcard_name
%type <flag_info_list> sect_flag_list
%type <flag_info> sect_flags
%type <name> memspec_opt casesymlist
%type <name> memspec_at_opt
%type <cname> wildcard_name
-%type <wildcard>
wildcard_spec
+%type <wildcard>
section_name_spec filename_spec wildcard_maybe_exclude
%token <bigint> INT
%token <name> NAME LNAME
%type <integer> length
%token <bigint> INT
%token <name> NAME LNAME
%type <integer> length
@@
-133,7
+131,7
@@
static int error_index;
%token SORT_BY_INIT_PRIORITY
%token '{' '}'
%token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH
%token SORT_BY_INIT_PRIORITY
%token '{' '}'
%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 INCLUDE
%token MEMORY
%token SEGMENT_START
%token INCLUDE
%token MEMORY
@@
-143,18
+141,18
@@
static int error_index;
%token DEFINED TARGET_K SEARCH_DIR MAP ENTRY
%token <integer> NEXT
%token SIZEOF ALIGNOF ADDR LOADADDR MAX_K MIN_K
%token DEFINED TARGET_K SEARCH_DIR MAP ENTRY
%token <integer> NEXT
%token SIZEOF ALIGNOF ADDR LOADADDR MAX_K MIN_K
-%token STARTUP HLL SYSLIB FLOAT NOFLOAT NOCROSSREFS
+%token STARTUP HLL SYSLIB FLOAT NOFLOAT NOCROSSREFS
NOCROSSREFS_TO
%token ORIGIN FILL
%token LENGTH CREATE_OBJECT_SYMBOLS INPUT GROUP OUTPUT CONSTRUCTORS
%token ORIGIN FILL
%token LENGTH CREATE_OBJECT_SYMBOLS INPUT GROUP OUTPUT CONSTRUCTORS
-%token ALIGNMOD AT SUBALIGN PROVIDE PROVIDE_HIDDEN AS_NEEDED
-%type <token> assign_op atype attributes_opt sect_constraint
+%token ALIGNMOD AT SUBALIGN
HIDDEN
PROVIDE PROVIDE_HIDDEN AS_NEEDED
+%type <token> assign_op atype attributes_opt sect_constraint
opt_align_with_input
%type <name> filename
%token CHIP LIST SECT ABSOLUTE LOAD NEWLINE ENDWORD ORDER NAMEWORD ASSERT_K
%type <name> filename
%token CHIP LIST SECT ABSOLUTE LOAD NEWLINE ENDWORD ORDER NAMEWORD ASSERT_K
-%token FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE REL
+%token
LOG2CEIL
FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE REL
%token INPUT_SCRIPT INPUT_MRI_SCRIPT INPUT_DEFSYM CASE EXTERN START
%token <name> VERS_TAG VERS_IDENTIFIER
%token GLOBAL LOCAL VERSIONK INPUT_VERSION_SCRIPT
%token INPUT_SCRIPT INPUT_MRI_SCRIPT INPUT_DEFSYM CASE EXTERN START
%token <name> VERS_TAG VERS_IDENTIFIER
%token GLOBAL LOCAL VERSIONK INPUT_VERSION_SCRIPT
-%token KEEP ONLY_IF_RO ONLY_IF_RW SPECIAL INPUT_SECTION_FLAGS
+%token KEEP ONLY_IF_RO ONLY_IF_RW SPECIAL INPUT_SECTION_FLAGS
ALIGN_WITH_INPUT
%token EXCLUDE_FILE
%token CONSTANT
%type <versyms> vers_defns
%token EXCLUDE_FILE
%token CONSTANT
%type <versyms> vers_defns
@@
-338,8
+336,10
@@
ifile_p1:
{ ldfile_set_output_arch ($3, bfd_arch_unknown); }
| FORCE_COMMON_ALLOCATION
{ command_line.force_common_definition = TRUE ; }
{ ldfile_set_output_arch ($3, bfd_arch_unknown); }
| FORCE_COMMON_ALLOCATION
{ 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 ')'
| GROUP
{ lang_enter_group (); }
| INPUT '(' input_list ')'
| GROUP
{ lang_enter_group (); }
@@
-355,6
+355,10
@@
ifile_p1:
{
lang_add_nocrossref ($3);
}
{
lang_add_nocrossref ($3);
}
+ | NOCROSSREFS_TO '(' nocrossref_list ')'
+ {
+ lang_add_nocrossref_to ($3);
+ }
| EXTERN '(' extern_name_list ')'
| INSERT_K AFTER NAME
{ lang_add_insert ($3, 0); }
| EXTERN '(' extern_name_list ')'
| INSERT_K AFTER NAME
{ lang_add_insert ($3, 0); }
@@
-367,38
+371,43
@@
ifile_p1:
;
input_list:
;
input_list:
+ { ldlex_inputlist(); }
+ input_list1
+ { ldlex_popstate(); }
+
+input_list1:
NAME
{ lang_add_input_file($1,lang_input_file_is_search_file_enum,
(char *)NULL); }
NAME
{ lang_add_input_file($1,lang_input_file_is_search_file_enum,
(char *)NULL); }
- | input_list ',' NAME
+ | input_list
1
',' NAME
{ lang_add_input_file($3,lang_input_file_is_search_file_enum,
(char *)NULL); }
{ lang_add_input_file($3,lang_input_file_is_search_file_enum,
(char *)NULL); }
- | input_list NAME
+ | input_list
1
NAME
{ lang_add_input_file($2,lang_input_file_is_search_file_enum,
(char *)NULL); }
| LNAME
{ lang_add_input_file($1,lang_input_file_is_l_enum,
(char *)NULL); }
{ lang_add_input_file($2,lang_input_file_is_search_file_enum,
(char *)NULL); }
| LNAME
{ lang_add_input_file($1,lang_input_file_is_l_enum,
(char *)NULL); }
- | input_list ',' LNAME
+ | input_list
1
',' LNAME
{ lang_add_input_file($3,lang_input_file_is_l_enum,
(char *)NULL); }
{ lang_add_input_file($3,lang_input_file_is_l_enum,
(char *)NULL); }
- | input_list LNAME
+ | input_list
1
LNAME
{ lang_add_input_file($2,lang_input_file_is_l_enum,
(char *)NULL); }
| AS_NEEDED '('
{ $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
input_flags.add_DT_NEEDED_for_regular = TRUE; }
{ lang_add_input_file($2,lang_input_file_is_l_enum,
(char *)NULL); }
| AS_NEEDED '('
{ $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
input_flags.add_DT_NEEDED_for_regular = TRUE; }
- input_list ')'
+ input_list
1
')'
{ input_flags.add_DT_NEEDED_for_regular = $<integer>3; }
{ input_flags.add_DT_NEEDED_for_regular = $<integer>3; }
- | input_list ',' AS_NEEDED '('
+ | input_list
1
',' AS_NEEDED '('
{ $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
input_flags.add_DT_NEEDED_for_regular = TRUE; }
{ $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
input_flags.add_DT_NEEDED_for_regular = TRUE; }
- input_list ')'
+ input_list
1
')'
{ input_flags.add_DT_NEEDED_for_regular = $<integer>5; }
{ input_flags.add_DT_NEEDED_for_regular = $<integer>5; }
- | input_list AS_NEEDED '('
+ | input_list
1
AS_NEEDED '('
{ $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
input_flags.add_DT_NEEDED_for_regular = TRUE; }
{ $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
input_flags.add_DT_NEEDED_for_regular = TRUE; }
- input_list ')'
+ input_list
1
')'
{ input_flags.add_DT_NEEDED_for_regular = $<integer>4; }
;
{ input_flags.add_DT_NEEDED_for_regular = $<integer>4; }
;
@@
-438,7
+447,7
@@
wildcard_name:
}
;
}
;
-wildcard_
spec
:
+wildcard_
maybe_exclude
:
wildcard_name
{
$$.name = $1;
wildcard_name
{
$$.name = $1;
@@
-453,68
+462,63
@@
wildcard_spec:
$$.exclude_name_list = $3;
$$.section_flag_list = NULL;
}
$$.exclude_name_list = $3;
$$.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;
$$.sorted = by_name;
- $$.exclude_name_list = NULL;
- $$.section_flag_list = NULL;
}
}
- | SORT_BY_ALIGNMENT '(' wildcard_name ')'
+ | SORT_NONE '(' wildcard_maybe_exclude ')'
+ {
+ $$ = $3;
+ $$.sorted = by_none;
+ }
+ ;
+
+section_name_spec:
+ wildcard_maybe_exclude
+ | SORT_BY_NAME '(' wildcard_maybe_exclude ')'
{
{
- $$.name = $3;
+ $$ = $3;
+ $$.sorted = by_name;
+ }
+ | SORT_BY_ALIGNMENT '(' wildcard_maybe_exclude ')'
+ {
+ $$ = $3;
$$.sorted = by_alignment;
$$.sorted = by_alignment;
- $$.exclude_name_list = NULL;
- $$.section_flag_list = NULL;
}
}
- | SORT_NONE '(' wildcard_
nam
e ')'
+ | SORT_NONE '(' wildcard_
maybe_exclud
e ')'
{
{
- $$
.name
= $3;
+ $$ = $3;
$$.sorted = by_none;
$$.sorted = by_none;
- $$.exclude_name_list = NULL;
- $$.section_flag_list = NULL;
}
}
- | SORT_BY_NAME '(' SORT_BY_ALIGNMENT '(' wildcard_
nam
e ')' ')'
+ | SORT_BY_NAME '(' SORT_BY_ALIGNMENT '(' wildcard_
maybe_exclud
e ')' ')'
{
{
- $$
.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_
nam
e ')' ')'
+ | SORT_BY_NAME '(' SORT_BY_NAME '(' wildcard_
maybe_exclud
e ')' ')'
{
{
- $$
.name
= $5;
+ $$ = $5;
$$.sorted = by_name;
$$.sorted = by_name;
- $$.exclude_name_list = NULL;
- $$.section_flag_list = NULL;
}
}
- | SORT_BY_ALIGNMENT '(' SORT_BY_NAME '(' wildcard_
nam
e ')' ')'
+ | SORT_BY_ALIGNMENT '(' SORT_BY_NAME '(' wildcard_
maybe_exclud
e ')' ')'
{
{
- $$
.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_
nam
e ')' ')'
+ | SORT_BY_ALIGNMENT '(' SORT_BY_ALIGNMENT '(' wildcard_
maybe_exclud
e ')' ')'
{
{
- $$
.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_nam
e ')'
+ | SORT_BY_
INIT_PRIORITY '(' wildcard_maybe_exclud
e ')'
{
{
- $$.name = $7;
- $$.sorted = by_name;
- $$.exclude_name_list = $5;
- $$.section_flag_list = NULL;
- }
- | SORT_BY_INIT_PRIORITY '(' wildcard_name ')'
- {
- $$.name = $3;
+ $$ = $3;
$$.sorted = by_init_priority;
$$.sorted = by_init_priority;
- $$.exclude_name_list = NULL;
- $$.section_flag_list = NULL;
}
;
}
;
@@
-589,8
+593,8
@@
exclude_name_list:
}
;
}
;
-
file_NAME
_list:
-
file_NAME_list opt_comma wildcard
_spec
+
section_name
_list:
+
section_name_list opt_comma section_name
_spec
{
struct wildcard_list *tmp;
tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
{
struct wildcard_list *tmp;
tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
@@
-599,7
+603,7
@@
file_NAME_list:
$$ = tmp;
}
|
$$ = tmp;
}
|
-
wildcard
_spec
+
section_name
_spec
{
struct wildcard_list *tmp;
tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
{
struct wildcard_list *tmp;
tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
@@
-628,11
+632,11
@@
input_section_spec_no_keep:
tmp.section_flag_list = $1;
lang_add_wild (&tmp, NULL, ldgram_had_keep);
}
tmp.section_flag_list = $1;
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;
tmp.name = NULL;
{
struct wildcard_spec tmp;
tmp.name = NULL;
@@
-641,11
+645,11
@@
input_section_spec_no_keep:
tmp.section_flag_list = $1;
lang_add_wild (&tmp, $3, ldgram_had_keep);
}
tmp.section_flag_list = $1;
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;
lang_add_wild (&$2, $4, ldgram_had_keep);
{
$2.section_flag_list = $1;
lang_add_wild (&$2, $4, ldgram_had_keep);
@@
-759,7
+763,7
@@
end: ';' | ','
assignment:
NAME '=' mustbe_exp
{
assignment:
NAME '=' mustbe_exp
{
- lang_add_assignment (exp_assign ($1, $3));
+ lang_add_assignment (exp_assign ($1, $3
, FALSE
));
}
| NAME assign_op mustbe_exp
{
}
| NAME assign_op mustbe_exp
{
@@
-767,7
+771,11
@@
assignment:
exp_binop ($2,
exp_nameop (NAME,
$1),
exp_binop ($2,
exp_nameop (NAME,
$1),
- $3)));
+ $3), FALSE));
+ }
+ | HIDDEN '(' NAME '=' mustbe_exp ')'
+ {
+ lang_add_assignment (exp_assign ($3, $5, TRUE));
}
| PROVIDE '(' NAME '=' mustbe_exp ')'
{
}
| PROVIDE '(' NAME '=' mustbe_exp ')'
{
@@
-810,7
+818,7
@@
memory_spec: NAME
origin_spec:
ORIGIN '=' mustbe_exp
{
origin_spec:
ORIGIN '=' mustbe_exp
{
- region->origin
= exp_get_vma ($3, 0, "origin")
;
+ region->origin
_exp = $3
;
region->current = region->origin;
}
;
region->current = region->origin;
}
;
@@
-818,7
+826,7
@@
origin_spec:
length_spec:
LENGTH '=' mustbe_exp
{
length_spec:
LENGTH '=' mustbe_exp
{
- region->length
= exp_get_vma ($3, -1, "length")
;
+ region->length
_exp = $3
;
}
;
}
;
@@
-1008,6
+1016,8
@@
exp :
{ $$ = exp_nameop (ORIGIN, $3); }
| LENGTH '(' NAME ')'
{ $$ = exp_nameop (LENGTH, $3); }
{ $$ = exp_nameop (ORIGIN, $3); }
| LENGTH '(' NAME ')'
{ $$ = exp_nameop (LENGTH, $3); }
+ | LOG2CEIL '(' exp ')'
+ { $$ = exp_unop (LOG2CEIL, $3); }
;
;
@@
-1026,6
+1036,11
@@
opt_align:
| { $$ = 0; }
;
| { $$ = 0; }
;
+opt_align_with_input:
+ ALIGN_WITH_INPUT { $$ = ALIGN_WITH_INPUT; }
+ | { $$ = 0; }
+ ;
+
opt_subalign:
SUBALIGN '(' exp ')' { $$ = $3; }
| { $$ = 0; }
opt_subalign:
SUBALIGN '(' exp ')' { $$ = $3; }
| { $$ = 0; }
@@
-1042,20
+1057,21
@@
section: NAME { ldlex_expression(); }
opt_exp_with_type
opt_at
opt_align
opt_exp_with_type
opt_at
opt_align
+ opt_align_with_input
opt_subalign { ldlex_popstate (); ldlex_script (); }
sect_constraint
'{'
{
lang_enter_output_section_statement($1, $3,
sectype,
opt_subalign { ldlex_popstate (); ldlex_script (); }
sect_constraint
'{'
{
lang_enter_output_section_statement($1, $3,
sectype,
- $5, $
6, $4, $8
);
+ $5, $
7, $4, $9, $6
);
}
statement_list_opt
'}' { ldlex_popstate (); ldlex_expression (); }
memspec_opt memspec_at_opt phdr_opt fill_opt
{
ldlex_popstate ();
}
statement_list_opt
'}' { ldlex_popstate (); ldlex_expression (); }
memspec_opt memspec_at_opt phdr_opt fill_opt
{
ldlex_popstate ();
- lang_leave_output_section_statement ($1
7, $14, $16, $15
);
+ lang_leave_output_section_statement ($1
8, $15, $17, $16
);
}
opt_comma
{}
}
opt_comma
{}
@@
-1085,7
+1101,7
@@
section: NAME { ldlex_expression(); }
opt_exp_with_type
{
ldlex_popstate ();
opt_exp_with_type
{
ldlex_popstate ();
- lang_add_assignment (exp_assign (".", $3));
+ lang_add_assignment (exp_assign (".", $3
, FALSE
));
}
'{' sec_or_group_p1 '}'
| INCLUDE filename
}
'{' sec_or_group_p1 '}'
| INCLUDE filename
This page took
0.031507 seconds
and
4
git commands to generate.