2008-12-15 Paul Pluzhnikov <ppluzhnikov@google.com>
[deliverable/binutils-gdb.git] / gold / yyscript.y
index ec2e8c0da2d8a5d9a4fceebd60290b2ab86a21da..52493202695f0c9a48085f77db3e4460193a8097 100644 (file)
 %token PARSING_LINKER_SCRIPT
 %token PARSING_VERSION_SCRIPT
 %token PARSING_DEFSYM
+%token PARSING_DYNAMIC_LIST
 
 /* Non-terminal types, where needed.  */
 
@@ -222,6 +223,7 @@ top:
          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.  */
@@ -240,6 +242,7 @@ file_cmd:
            { script_end_group(closure); }
        | INHIBIT_COMMON_ALLOCATION
            { script_set_common_allocation(closure, 0); }
+       | INPUT '(' input_list ')'
         | OPTION '(' string ')'
            { script_parse_option(closure, $3.value, $3.length); }
        | PHDRS '{' phdrs_defs '}'
@@ -811,9 +814,15 @@ exp:
        | 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 ')'
@@ -830,6 +839,24 @@ defsym_expr:
            { 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
This page took 0.023869 seconds and 4 git commands to generate.