diff options
Diffstat (limited to 'ld/ldgram.y')
-rw-r--r-- | ld/ldgram.y | 81 |
1 files changed, 59 insertions, 22 deletions
diff --git a/ld/ldgram.y b/ld/ldgram.y index 3829e6ae00a15..c6f268b1d7cbb 100644 --- a/ld/ldgram.y +++ b/ld/ldgram.y @@ -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, 2007 Free Software Foundation, Inc. Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com). This file is part of GNU ld. @@ -26,8 +26,8 @@ #define DONTDECLARE_MALLOC -#include "bfd.h" #include "sysdep.h" +#include "bfd.h" #include "bfdlink.h" #include "ld.h" #include "ldexp.h" @@ -131,14 +131,13 @@ 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 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 +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 ; @@ -278,33 +280,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 @@ -571,6 +573,9 @@ statement: { lang_add_fill ($3); } + | ASSERT_K {ldlex_expression ();} '(' exp ',' NAME ')' end + { ldlex_popstate (); + lang_add_assignment (exp_assert ($4, $6)); } ; statement_list: @@ -835,12 +840,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 ')' @@ -960,10 +969,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 +1145,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: |