/* 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
+ 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
Free Software Foundation, Inc.
Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com).
%token <token> ALIGN_K BLOCK BIND QUAD SQUAD LONG SHORT BYTE
%token SECTIONS PHDRS INSERT_K AFTER BEFORE
%token DATA_SEGMENT_ALIGN DATA_SEGMENT_RELRO_END DATA_SEGMENT_END
-%token SORT_BY_NAME SORT_BY_ALIGNMENT
+%token SORT_BY_NAME SORT_BY_ALIGNMENT SORT_NONE
%token SORT_BY_INIT_PRIORITY
%token '{' '}'
%token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH
%token STARTUP HLL SYSLIB FLOAT NOFLOAT NOCROSSREFS
%token ORIGIN FILL
%token LENGTH CREATE_OBJECT_SYMBOLS INPUT GROUP OUTPUT CONSTRUCTORS
-%token ALIGNMOD AT SUBALIGN PROVIDE PROVIDE_HIDDEN AS_NEEDED
+%token ALIGNMOD AT SUBALIGN HIDDEN PROVIDE PROVIDE_HIDDEN AS_NEEDED
%type <token> assign_op atype attributes_opt sect_constraint
%type <name> filename
%token CHIP LIST SECT ABSOLUTE LOAD NEWLINE ENDWORD ORDER NAMEWORD ASSERT_K
{ lang_add_input_file($2,lang_input_file_is_l_enum,
(char *)NULL); }
| AS_NEEDED '('
- { $<integer>$ = add_DT_NEEDED_for_regular; add_DT_NEEDED_for_regular = TRUE; }
+ { $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
+ input_flags.add_DT_NEEDED_for_regular = TRUE; }
input_list ')'
- { add_DT_NEEDED_for_regular = $<integer>3; }
+ { input_flags.add_DT_NEEDED_for_regular = $<integer>3; }
| input_list ',' AS_NEEDED '('
- { $<integer>$ = add_DT_NEEDED_for_regular; add_DT_NEEDED_for_regular = TRUE; }
+ { $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
+ input_flags.add_DT_NEEDED_for_regular = TRUE; }
input_list ')'
- { add_DT_NEEDED_for_regular = $<integer>5; }
+ { input_flags.add_DT_NEEDED_for_regular = $<integer>5; }
| input_list AS_NEEDED '('
- { $<integer>$ = add_DT_NEEDED_for_regular; add_DT_NEEDED_for_regular = TRUE; }
+ { $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
+ input_flags.add_DT_NEEDED_for_regular = TRUE; }
input_list ')'
- { add_DT_NEEDED_for_regular = $<integer>4; }
+ { input_flags.add_DT_NEEDED_for_regular = $<integer>4; }
;
sections:
$$.exclude_name_list = NULL;
$$.section_flag_list = NULL;
}
+ | SORT_NONE '(' wildcard_name ')'
+ {
+ $$.name = $3;
+ $$.sorted = by_none;
+ $$.exclude_name_list = NULL;
+ $$.section_flag_list = NULL;
+ }
| SORT_BY_NAME '(' SORT_BY_ALIGNMENT '(' wildcard_name ')' ')'
{
$$.name = $5;
tmp.exclude_name_list = NULL;
tmp.sorted = none;
tmp.section_flag_list = $1;
- lang_add_wild (NULL, $3, ldgram_had_keep);
+ lang_add_wild (&tmp, $3, ldgram_had_keep);
}
| wildcard_spec '(' file_NAME_list ')'
{
assignment:
NAME '=' mustbe_exp
{
- lang_add_assignment (exp_assign ($1, $3));
+ lang_add_assignment (exp_assign ($1, $3, FALSE));
}
| NAME assign_op mustbe_exp
{
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 ')'
{
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
{
einfo (_("\
%X%P:%S: unknown phdr type `%s' (try integer literal)\n"),
- s);
+ NULL, s);
$$ = exp_intop (0);
}
}
else if (strcmp ($1, "FLAGS") == 0 && $2 != NULL)
$$.flags = $2;
else
- einfo (_("%X%P:%S: PHDRS syntax error at `%s'\n"), $1);
+ einfo (_("%X%P:%S: PHDRS syntax error at `%s'\n"),
+ NULL, $1);
}
| AT '(' exp ')' phdr_qualifiers
{
{
if (ldfile_assumed_script)
einfo (_("%P:%s: file format not recognized; treating as linker script\n"),
- ldfile_input_filename);
+ ldlex_filename ());
if (error_index > 0 && error_index < ERROR_NAME_MAX)
- einfo ("%P%F:%S: %s in %s\n", arg, error_names[error_index-1]);
+ einfo ("%P%F:%S: %s in %s\n", NULL, arg, error_names[error_index - 1]);
else
- einfo ("%P%F:%S: %s\n", arg);
+ einfo ("%P%F:%S: %s\n", NULL, arg);
}