Automatic date update in version.in
[binutils-gdb.git] / ld / ldgram.y
index 77442818587661c9f8865106fe5ab15113f10429..2eb989df77a295de538d59d845f4407f076ea909 100644 (file)
@@ -248,9 +248,8 @@ mri_script_command:
        |       CASE casesymlist
        |       EXTERN extern_name_list
        |       INCLUDE filename
-               { ldlex_script (); ldfile_open_command_file($2); }
+               { ldfile_open_command_file ($2); }
                mri_script_lines END
-               { ldlex_popstate (); }
        |       START NAME
                { lang_add_entry ($2, false); }
        |
@@ -281,25 +280,19 @@ casesymlist:
        | casesymlist ',' NAME
        ;
 
-/* Parsed as expressions so that commas separate entries */
 extern_name_list:
-       { ldlex_expression (); }
-       extern_name_list_body
-       { ldlex_popstate (); }
-
-extern_name_list_body:
-         NAME
+       NAME
                        { ldlang_add_undef ($1, false); }
-       | extern_name_list_body NAME
+       | extern_name_list NAME
                        { ldlang_add_undef ($2, false); }
-       | extern_name_list_body ',' NAME
+       | extern_name_list ',' NAME
                        { ldlang_add_undef ($3, false); }
        ;
 
 script_file:
-       { ldlex_both(); }
+       { ldlex_script (); }
        ifile_list
-       { ldlex_popstate(); }
+       { ldlex_popstate (); }
        ;
 
 ifile_list:
@@ -346,9 +339,8 @@ ifile_p1:
        |       MAP '(' filename ')'
                { lang_add_map($3); }
        |       INCLUDE filename
-               { ldlex_script (); ldfile_open_command_file($2); }
+               { ldfile_open_command_file ($2); }
                ifile_list END
-               { ldlex_popstate (); }
        |       NOCROSSREFS '(' nocrossref_list ')'
                {
                  lang_add_nocrossref ($3);
@@ -357,7 +349,8 @@ ifile_p1:
                {
                  lang_add_nocrossref_to ($3);
                }
-       |       EXTERN '(' extern_name_list ')'
+       |       EXTERN '(' { ldlex_expression (); } extern_name_list ')'
+                       { ldlex_popstate (); }
        |       INSERT_K AFTER NAME
                { lang_add_insert ($3, 0); }
        |       INSERT_K BEFORE NAME
@@ -428,21 +421,11 @@ statement_anywhere:
                  lang_add_assignment (exp_assert ($4, $6)); }
        ;
 
-/* The '*' and '?' cases are there because the lexer returns them as
-   separate tokens rather than as NAME.  */
 wildcard_name:
                NAME
                        {
                          $$ = $1;
                        }
-       |       '*'
-                       {
-                         $$ = "*";
-                       }
-       |       '?'
-                       {
-                         $$ = "?";
-                       }
        ;
 
 wildcard_maybe_exclude:
@@ -697,11 +680,9 @@ statement:
                }
        | INCLUDE filename
                {
-                 ldlex_script ();
                  ldfile_open_command_file ($2);
                }
          statement_list_opt END
-               { ldlex_popstate (); }
        ;
 
 statement_list:
@@ -814,9 +795,8 @@ memory_spec:        NAME
                origin_spec opt_comma length_spec
                {}
        |       INCLUDE filename
-               { ldlex_script (); ldfile_open_command_file($2); }
+               { ldfile_open_command_file ($2); }
                memory_spec_list_opt END
-               { ldlex_popstate (); }
        ;
 
 origin_spec:
@@ -829,6 +809,11 @@ origin_spec:
 length_spec:
             LENGTH '=' mustbe_exp
                {
+                 if (yychar == NAME)
+                   {
+                     yyclearin;
+                     ldlex_backup ();
+                   }
                  region->length_exp = $3;
                }
        ;
@@ -1021,10 +1006,10 @@ exp     :
                        { $$ = exp_binop (MIN_K, $3, $5 ); }
        |       ASSERT_K '(' exp ',' NAME ')'
                        { $$ = exp_assert ($3, $5); }
-       |       ORIGIN '(' NAME ')'
-                       { $$ = exp_nameop (ORIGIN, $3); }
-       |       LENGTH '(' NAME ')'
-                       { $$ = exp_nameop (LENGTH, $3); }
+       |       ORIGIN paren_script_name
+                       { $$ = exp_nameop (ORIGIN, $2); }
+       |       LENGTH paren_script_name
+                       { $$ = exp_nameop (LENGTH, $2); }
        |       LOG2CEIL '(' exp ')'
                        { $$ = exp_unop (LOG2CEIL, $3); }
        ;
@@ -1069,40 +1054,46 @@ section:        NAME
                opt_align
                opt_align_with_input
                opt_subalign
-                       { ldlex_popstate (); ldlex_script (); }
                sect_constraint
-               '{'
                        {
+                         ldlex_popstate ();
+                         ldlex_wild ();
                          lang_enter_output_section_statement($1, $3, sectype,
                                                              $5, $7, $4,
-                                                             $9, $6);
+                                                             $8, $6);
                        }
+               '{'
                statement_list_opt
                '}'
-                       { ldlex_popstate (); ldlex_expression (); }
+                       { ldlex_popstate (); }
                memspec_opt memspec_at_opt phdr_opt fill_opt
                        {
+                         /* fill_opt may have switched the lexer into
+                            expression state, and back again, but in
+                            order to find the end of the fill
+                            expression the parser must look ahead one
+                            token.  If it is a NAME, throw it away as
+                            it will have been lexed in the wrong
+                            state.  */
                          if (yychar == NAME)
                            {
                              yyclearin;
                              ldlex_backup ();
                            }
-                         ldlex_popstate ();
-                         lang_leave_output_section_statement ($18, $15,
-                                                              $17, $16);
+                         lang_leave_output_section_statement ($17, $14,
+                                                              $16, $15);
                        }
                opt_comma
        |       OVERLAY
                        { ldlex_expression (); }
                opt_exp_without_type opt_nocrossrefs opt_at opt_subalign
-                       { ldlex_popstate (); ldlex_script (); }
+                       { ldlex_popstate (); }
                '{'
                        {
                          lang_enter_overlay ($3, $6);
                        }
                overlay_section
                '}'
-                       { ldlex_popstate (); ldlex_expression (); }
                memspec_opt memspec_at_opt phdr_opt fill_opt
                        {
                          if (yychar == NAME)
@@ -1110,9 +1101,8 @@ section:  NAME
                              yyclearin;
                              ldlex_backup ();
                            }
-                         ldlex_popstate ();
                          lang_leave_overlay ($5, (int) $4,
-                                             $16, $13, $15, $14);
+                                             $15, $12, $14, $13);
                        }
                opt_comma
        |       /* The GROUP case is just enough to support the gcc
@@ -1129,11 +1119,9 @@ section: NAME
                '{' sec_or_group_p1 '}'
        |       INCLUDE filename
                        {
-                         ldlex_script ();
                          ldfile_open_command_file ($2);
                        }
                sec_or_group_p1 END
-                       { ldlex_popstate (); }
        ;
 
 type:
@@ -1204,10 +1192,13 @@ overlay_section:
        |       overlay_section
                NAME
                        {
+                         ldlex_wild ();
                          lang_enter_overlay_section ($2);
                        }
-               '{' statement_list_opt '}'
-                       { ldlex_expression (); }
+               '{'
+               statement_list_opt
+               '}'
+                       { ldlex_popstate (); }
                phdr_opt fill_opt
                        {
                          if (yychar == NAME)
@@ -1215,7 +1206,6 @@ overlay_section:
                              yyclearin;
                              ldlex_backup ();
                            }
-                         ldlex_popstate ();
                          lang_leave_overlay_section ($9, $8);
                        }
                opt_comma
@@ -1272,6 +1262,10 @@ phdr_type:
                            $$ = exp_intop (0x6474e550);
                          else if (strcmp (s, "PT_GNU_STACK") == 0)
                            $$ = exp_intop (0x6474e551);
+                         else if (strcmp (s, "PT_GNU_RELRO") == 0)
+                           $$ = exp_intop (0x6474e552);
+                         else if (strcmp (s, "PT_GNU_PROPERTY") == 0)
+                           $$ = exp_intop (0x6474e553);
                          else
                            {
                              einfo (_("\