M68K TLS support.
[deliverable/binutils-gdb.git] / ld / ldgram.y
index 78d7165b094cb877b389a7f85ec6b02396119618..1149e6b29c40cbe9db08c542a9fab873e016224f 100644 (file)
@@ -3,11 +3,11 @@
    2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
    Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com).
 
    2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
    Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com).
 
-   This file is part of GNU ld.
+   This file is part of the GNU Binutils.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -17,7 +17,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 
 %{
 /*
 
 %{
 /*
 static enum section_type sectype;
 static lang_memory_region_type *region;
 
 static enum section_type sectype;
 static lang_memory_region_type *region;
 
-FILE *saved_script_handle = NULL;
-bfd_boolean force_make_executable = FALSE;
-
-bfd_boolean ldgram_in_script = FALSE;
-bfd_boolean ldgram_had_equals = FALSE;
 bfd_boolean ldgram_had_keep = FALSE;
 char *ldgram_vers_current_lang = NULL;
 
 bfd_boolean ldgram_had_keep = FALSE;
 char *ldgram_vers_current_lang = NULL;
 
@@ -126,7 +122,8 @@ static int error_index;
 %token END
 %left <token> '('
 %token <token> ALIGN_K BLOCK BIND QUAD SQUAD LONG SHORT BYTE
 %token END
 %left <token> '('
 %token <token> ALIGN_K BLOCK BIND QUAD SQUAD LONG SHORT BYTE
-%token SECTIONS PHDRS DATA_SEGMENT_ALIGN DATA_SEGMENT_RELRO_END DATA_SEGMENT_END
+%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 '{' '}'
 %token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH
 %token SORT_BY_NAME SORT_BY_ALIGNMENT
 %token '{' '}'
 %token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH
@@ -137,7 +134,7 @@ static int error_index;
 %token NOLOAD DSECT COPY INFO OVERLAY
 %token DEFINED TARGET_K SEARCH_DIR MAP ENTRY
 %token <integer> NEXT
 %token NOLOAD DSECT COPY INFO OVERLAY
 %token DEFINED TARGET_K SEARCH_DIR MAP ENTRY
 %token <integer> NEXT
-%token SIZEOF ADDR LOADADDR MAX_K MIN_K
+%token SIZEOF ALIGNOF ADDR LOADADDR MAX_K MIN_K
 %token STARTUP HLL SYSLIB FLOAT NOFLOAT NOCROSSREFS
 %token ORIGIN FILL
 %token LENGTH CREATE_OBJECT_SYMBOLS INPUT GROUP OUTPUT CONSTRUCTORS
 %token STARTUP HLL SYSLIB FLOAT NOFLOAT NOCROSSREFS
 %token ORIGIN FILL
 %token LENGTH CREATE_OBJECT_SYMBOLS INPUT GROUP OUTPUT CONSTRUCTORS
@@ -280,33 +277,33 @@ casesymlist:
        | casesymlist ',' NAME
        ;
 
        | casesymlist ',' NAME
        ;
 
+/* Parsed as expressions so that commas separate entries */
 extern_name_list:
 extern_name_list:
+       { ldlex_expression (); }
+       extern_name_list_body
+       { ldlex_popstate (); }
+
+extern_name_list_body:
          NAME
                        { ldlang_add_undef ($1); }
          NAME
                        { ldlang_add_undef ($1); }
-       | extern_name_list NAME
+       | extern_name_list_body NAME
                        { ldlang_add_undef ($2); }
                        { ldlang_add_undef ($2); }
-       | extern_name_list ',' NAME
+       | extern_name_list_body ',' NAME
                        { ldlang_add_undef ($3); }
        ;
 
 script_file:
                        { ldlang_add_undef ($3); }
        ;
 
 script_file:
-       {
-        ldlex_both();
-       }
-       ifile_list
-       {
-       ldlex_popstate();
-       }
+       { ldlex_both(); }
+       ifile_list
+       { ldlex_popstate(); }
         ;
 
         ;
 
-
 ifile_list:
 ifile_list:
-       ifile_list ifile_p1
+       ifile_list ifile_p1
         |
        ;
 
 
         |
        ;
 
 
-
 ifile_p1:
                memory
        |       sections
 ifile_p1:
                memory
        |       sections
@@ -351,6 +348,10 @@ ifile_p1:
                  lang_add_nocrossref ($3);
                }
        |       EXTERN '(' extern_name_list ')'
                  lang_add_nocrossref ($3);
                }
        |       EXTERN '(' extern_name_list ')'
+       |       INSERT_K AFTER NAME
+               { lang_add_insert ($3, 0); }
+       |       INSERT_K BEFORE NAME
+               { lang_add_insert ($3, 1); }
        ;
 
 input_list:
        ;
 
 input_list:
@@ -573,6 +574,13 @@ statement:
                        {
                          lang_add_fill ($3);
                        }
                        {
                          lang_add_fill ($3);
                        }
+       | ASSERT_K  {ldlex_expression ();} '(' exp ',' NAME ')' end
+                       { ldlex_popstate ();
+                         lang_add_assignment (exp_assert ($4, $6)); }
+       | INCLUDE filename
+               { ldlex_script (); ldfile_open_command_file($2); }
+               statement_list_opt END
+               { ldlex_popstate (); }
        ;
 
 statement_list:
        ;
 
 statement_list:
@@ -664,13 +672,14 @@ opt_comma:
 
 
 memory:
 
 
 memory:
-               MEMORY '{' memory_spec memory_spec_list '}'
+               MEMORY '{' memory_spec_list_opt '}'
        ;
 
        ;
 
+memory_spec_list_opt: memory_spec_list | ;
+
 memory_spec_list:
 memory_spec_list:
-               memory_spec_list memory_spec
-       |       memory_spec_list ',' memory_spec
-       |
+               memory_spec_list opt_comma memory_spec
+       |       memory_spec
        ;
 
 
        ;
 
 
@@ -679,6 +688,10 @@ memory_spec:       NAME
                attributes_opt ':'
                origin_spec opt_comma length_spec
                {}
                attributes_opt ':'
                origin_spec opt_comma length_spec
                {}
+       |       INCLUDE filename
+               { ldlex_script (); ldfile_open_command_file($2); }
+               memory_spec_list_opt END
+               { ldlex_popstate (); }
        ;
 
 origin_spec:
        ;
 
 origin_spec:
@@ -837,6 +850,8 @@ exp :
         |      SIZEOF_HEADERS
                        { $$ = exp_nameop (SIZEOF_HEADERS,0); }
 
         |      SIZEOF_HEADERS
                        { $$ = exp_nameop (SIZEOF_HEADERS,0); }
 
+       |       ALIGNOF '(' NAME ')'
+                       { $$ = exp_nameop (ALIGNOF,$3); }
        |       SIZEOF '(' NAME ')'
                        { $$ = exp_nameop (SIZEOF,$3); }
        |       ADDR '(' NAME ')'
        |       SIZEOF '(' NAME ')'
                        { $$ = exp_nameop (SIZEOF,$3); }
        |       ADDR '(' NAME ')'
@@ -960,6 +975,10 @@ section:   NAME            { ldlex_expression(); }
                  lang_add_assignment (exp_assop ('=', ".", $3));
                }
                '{' sec_or_group_p1 '}'
                  lang_add_assignment (exp_assop ('=', ".", $3));
                }
                '{' sec_or_group_p1 '}'
+       |       INCLUDE filename
+               { ldlex_script (); ldfile_open_command_file($2); }
+               sec_or_group_p1 END
+               { ldlex_popstate (); }
        ;
 
 type:
        ;
 
 type:
This page took 0.025337 seconds and 4 git commands to generate.