-/* yyscript.y -- linker script grammer for gold. */
+/* yyscript.y -- linker script grammar for gold. */
/* Copyright 2006, 2007, 2008 Free Software Foundation, Inc.
Written by Ian Lance Taylor <iant@google.com>.
%token PARSING_LINKER_SCRIPT
%token PARSING_VERSION_SCRIPT
%token PARSING_DEFSYM
+%token PARSING_DYNAMIC_LIST
/* Non-terminal types, where needed. */
PARSING_LINKER_SCRIPT linker_script
| PARSING_VERSION_SCRIPT version_script
| PARSING_DEFSYM defsym_expr
+ | PARSING_DYNAMIC_LIST dynamic_list_expr
;
/* A file contains a list of commands. */
/* A command which may appear at top level of a linker script. */
file_cmd:
- GROUP
+ FORCE_COMMON_ALLOCATION
+ { script_set_common_allocation(closure, 1); }
+ | GROUP
{ script_start_group(closure); }
'(' input_list ')'
{ script_end_group(closure); }
+ | INHIBIT_COMMON_ALLOCATION
+ { script_set_common_allocation(closure, 0); }
| OPTION '(' string ')'
{ script_parse_option(closure, $3.value, $3.length); }
| PHDRS '{' phdrs_defs '}'
| BLOCK '(' exp ')'
{ $$ = script_exp_function_align(script_exp_string(".", 1), $3); }
| DATA_SEGMENT_ALIGN '(' exp ',' exp ')'
- { $$ = script_exp_function_data_segment_align($3, $5); }
+ {
+ script_data_segment_align(closure);
+ $$ = script_exp_function_data_segment_align($3, $5);
+ }
| DATA_SEGMENT_RELRO_END '(' exp ',' exp ')'
- { $$ = script_exp_function_data_segment_relro_end($3, $5); }
+ {
+ script_data_segment_relro_end(closure);
+ $$ = script_exp_function_data_segment_relro_end($3, $5);
+ }
| DATA_SEGMENT_END '(' exp ')'
{ $$ = script_exp_function_data_segment_end($3); }
| SEGMENT_START '(' string ',' exp ')'
{ script_set_symbol(closure, $1.value, $1.length, $3, 0, 0); }
;
+/* Handle the --dynamic-list option. A dynamic list has the format
+ { sym1; sym2; extern "C++" { namespace::sym3 }; };
+ We store the symbol we see in the "local" list; that is where
+ Command_line::in_dynamic_list() will look to do its check.
+ TODO(csilvers): More than one of these brace-lists can appear, and
+ should just be merged and treated as a single list. */
+dynamic_list_expr: dynamic_list_nodes ;
+
+dynamic_list_nodes:
+ dynamic_list_node
+ | dynamic_list_nodes dynamic_list_node
+ ;
+
+dynamic_list_node:
+ '{' vers_defns ';' '}' ';'
+ { script_new_vers_node (closure, NULL, $2); }
+ ;
+
/* A version script. */
version_script:
vers_nodes