2007-02-06 H.J. Lu <hongjiu.lu@intel.com>
[deliverable/binutils-gdb.git] / ld / ldgram.y
index f6e2aa22151336763c95ddfc0dc617bad15173f6..cad56759e9424a4669ca63d401f6acb9a73b6994 100644 (file)
@@ -1,6 +1,6 @@
 /* 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 Free Software Foundation, Inc.
    Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com).
 
    This file is part of GNU ld.
@@ -131,12 +131,11 @@ static int error_index;
 %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 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 STARTUP HLL SYSLIB FLOAT NOFLOAT NOCROSSREFS
@@ -152,9 +151,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 +163,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
        ;
 
@@ -841,6 +843,8 @@ exp :
                        { $$ = 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 ')'
@@ -960,10 +964,10 @@ section:  NAME            { ldlex_expression(); }
 
 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 +1140,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:
@@ -1219,11 +1251,19 @@ vers_tag:
 vers_defns:
                VERS_IDENTIFIER
                {
-                 $$ = lang_new_vers_pattern (NULL, $1, ldgram_vers_current_lang);
+                 $$ = lang_new_vers_pattern (NULL, $1, ldgram_vers_current_lang, FALSE);
+               }
+        |       NAME
+               {
+                 $$ = lang_new_vers_pattern (NULL, $1, ldgram_vers_current_lang, TRUE);
                }
        |       vers_defns ';' VERS_IDENTIFIER
                {
-                 $$ = lang_new_vers_pattern ($1, $3, ldgram_vers_current_lang);
+                 $$ = lang_new_vers_pattern ($1, $3, ldgram_vers_current_lang, FALSE);
+               }
+       |       vers_defns ';' NAME
+               {
+                 $$ = lang_new_vers_pattern ($1, $3, ldgram_vers_current_lang, TRUE);
                }
        |       vers_defns ';' EXTERN NAME '{'
                        {
@@ -1250,27 +1290,27 @@ vers_defns:
                        }
        |       GLOBAL
                {
-                 $$ = lang_new_vers_pattern (NULL, "global", ldgram_vers_current_lang);
+                 $$ = lang_new_vers_pattern (NULL, "global", ldgram_vers_current_lang, FALSE);
                }
        |       vers_defns ';' GLOBAL
                {
-                 $$ = lang_new_vers_pattern ($1, "global", ldgram_vers_current_lang);
+                 $$ = lang_new_vers_pattern ($1, "global", ldgram_vers_current_lang, FALSE);
                }
        |       LOCAL
                {
-                 $$ = lang_new_vers_pattern (NULL, "local", ldgram_vers_current_lang);
+                 $$ = lang_new_vers_pattern (NULL, "local", ldgram_vers_current_lang, FALSE);
                }
        |       vers_defns ';' LOCAL
                {
-                 $$ = lang_new_vers_pattern ($1, "local", ldgram_vers_current_lang);
+                 $$ = lang_new_vers_pattern ($1, "local", ldgram_vers_current_lang, FALSE);
                }
        |       EXTERN
                {
-                 $$ = lang_new_vers_pattern (NULL, "extern", ldgram_vers_current_lang);
+                 $$ = lang_new_vers_pattern (NULL, "extern", ldgram_vers_current_lang, FALSE);
                }
        |       vers_defns ';' EXTERN
                {
-                 $$ = lang_new_vers_pattern ($1, "extern", ldgram_vers_current_lang);
+                 $$ = lang_new_vers_pattern ($1, "extern", ldgram_vers_current_lang, FALSE);
                }
        ;
 
This page took 0.027268 seconds and 4 git commands to generate.