*** empty log message ***
[deliverable/binutils-gdb.git] / ld / ldgram.y
index 3829e6ae00a15597ce4001619493fe6b85e9ad47..aa639a1f737c08c7a5f8fb2ebb829338830b665b 100644 (file)
@@ -1,13 +1,14 @@
 /* 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 Free Software Foundation, Inc.
+   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+   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
-   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,
@@ -17,7 +18,8 @@
 
    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.  */
 
 %{
 /*
@@ -26,8 +28,8 @@
 
 #define DONTDECLARE_MALLOC
 
-#include "bfd.h"
 #include "sysdep.h"
+#include "bfd.h"
 #include "bfdlink.h"
 #include "ld.h"
 #include "ldexp.h"
 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;
 
@@ -126,19 +123,20 @@ static int error_index;
 %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 INHIBIT_COMMON_ALLOCATION
-%token SIZEOF_HEADERS
 %token SEGMENT_START
 %token INCLUDE
-%token MEMORY DEFSYMEND
+%token MEMORY
+%token REGION_ALIAS
 %token NOLOAD DSECT COPY INFO OVERLAY
-%token NAME LNAME DEFINED TARGET_K SEARCH_DIR MAP ENTRY
+%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
@@ -152,9 +150,11 @@ static int error_index;
 %token GLOBAL LOCAL VERSIONK INPUT_VERSION_SCRIPT
 %token KEEP ONLY_IF_RO ONLY_IF_RW SPECIAL
 %token EXCLUDE_FILE
+%token CONSTANT
 %type <versyms> vers_defns
 %type <versnode> vers_tag
 %type <deflist> verdep
+%token INPUT_DYNAMIC_LIST
 
 %%
 
@@ -162,6 +162,7 @@ file:
                INPUT_SCRIPT script_file
        |       INPUT_MRI_SCRIPT mri_script_file
        |       INPUT_VERSION_SCRIPT version_script_file
+       |       INPUT_DYNAMIC_LIST dynamic_list_file
        |       INPUT_DEFSYM defsym_expr
        ;
 
@@ -278,33 +279,33 @@ 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
                        { ldlang_add_undef ($1); }
-       | extern_name_list NAME
+       | extern_name_list_body NAME
                        { ldlang_add_undef ($2); }
-       | extern_name_list ',' NAME
+       | extern_name_list_body ',' NAME
                        { ldlang_add_undef ($3); }
        ;
 
 script_file:
-       {
-        ldlex_both();
-       }
-       ifile_list
-       {
-       ldlex_popstate();
-       }
+       { ldlex_both(); }
+       ifile_list
+       { ldlex_popstate(); }
         ;
 
-
 ifile_list:
-       ifile_list ifile_p1
+       ifile_list ifile_p1
         |
        ;
 
 
-
 ifile_p1:
                memory
        |       sections
@@ -349,6 +350,12 @@ ifile_p1:
                  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); }
+       |       REGION_ALIAS '(' NAME ',' NAME ')'
+               { lang_memory_region_alias ($3, $5); }
        ;
 
 input_list:
@@ -571,6 +578,13 @@ statement:
                        {
                          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:
@@ -662,13 +676,14 @@ opt_comma:
 
 
 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
-       |       memory_spec_list ',' memory_spec
-       |
+               memory_spec_list opt_comma memory_spec
+       |       memory_spec
        ;
 
 
@@ -677,6 +692,10 @@ memory_spec:       NAME
                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:
@@ -835,12 +854,16 @@ exp       :
         |      SIZEOF_HEADERS
                        { $$ = exp_nameop (SIZEOF_HEADERS,0); }
 
+       |       ALIGNOF '(' NAME ')'
+                       { $$ = exp_nameop (ALIGNOF,$3); }
        |       SIZEOF '(' NAME ')'
                        { $$ = exp_nameop (SIZEOF,$3); }
        |       ADDR '(' NAME ')'
                        { $$ = exp_nameop (ADDR,$3); }
        |       LOADADDR '(' NAME ')'
                        { $$ = exp_nameop (LOADADDR,$3); }
+       |       CONSTANT '(' NAME ')'
+                       { $$ = exp_nameop (CONSTANT,$3); }
        |       ABSOLUTE '(' exp ')'
                        { $$ = exp_unop (ABSOLUTE, $3); }
        |       ALIGN_K '(' exp ')'
@@ -956,14 +979,18 @@ section:  NAME            { ldlex_expression(); }
                  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:
           NOLOAD  { sectype = noload_section; }
-       |  DSECT   { sectype = dsect_section; }
-       |  COPY    { sectype = copy_section; }
-       |  INFO    { sectype = info_section; }
-       |  OVERLAY { sectype = overlay_section; }
+       |  DSECT   { sectype = noalloc_section; }
+       |  COPY    { sectype = noalloc_section; }
+       |  INFO    { sectype = noalloc_section; }
+       |  OVERLAY { sectype = noalloc_section; }
        ;
 
 atype:
@@ -1136,6 +1163,34 @@ phdr_val:
                }
        ;
 
+dynamic_list_file:
+               {
+                 ldlex_version_file ();
+                 PUSH_ERROR (_("dynamic list"));
+               }
+               dynamic_list_nodes
+               {
+                 ldlex_popstate ();
+                 POP_ERROR ();
+               }
+       ;
+
+dynamic_list_nodes:
+               dynamic_list_node
+       |       dynamic_list_nodes dynamic_list_node
+       ;
+
+dynamic_list_node:
+               '{' dynamic_list_tag '}' ';'
+       ;
+
+dynamic_list_tag:
+               vers_defns ';'
+               {
+                 lang_append_dynamic_list ($1);
+               }
+       ;
+
 /* This syntax is used within an external version script file.  */
 
 version_script_file:
This page took 0.028401 seconds and 4 git commands to generate.