gdb: Remove check for gdb_stderr == NULL
[deliverable/binutils-gdb.git] / ld / ldgram.y
index 6e001184e091391b4658b1365f9df093496defa8..e2998f15533456e51987b74d52dd2028773589b7 100644 (file)
@@ -1,7 +1,5 @@
 /* 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, 2006, 2007, 2008, 2009, 2010, 2011, 2012
-   Free Software Foundation, Inc.
+   Copyright (C) 1991-2017 Free Software Foundation, Inc.
    Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com).
 
    This file is part of the GNU Binutils.
@@ -50,8 +48,8 @@
 static enum section_type sectype;
 static lang_memory_region_type *region;
 
-bfd_boolean ldgram_had_keep = FALSE;
-char *ldgram_vers_current_lang = NULL;
+static bfd_boolean ldgram_had_keep = FALSE;
+static char *ldgram_vers_current_lang = NULL;
 
 #define ERROR_NAME_MAX 20
 static char *error_names[ERROR_NAME_MAX];
@@ -94,13 +92,13 @@ static int error_index;
 %type <etree> opt_exp_without_type opt_subalign opt_align
 %type <fill> fill_opt fill_exp
 %type <name_list> exclude_name_list
-%type <wildcard_list> file_NAME_list
+%type <wildcard_list> section_name_list
 %type <flag_info_list> sect_flag_list
 %type <flag_info> sect_flags
 %type <name> memspec_opt casesymlist
 %type <name> memspec_at_opt
 %type <cname> wildcard_name
-%type <wildcard> wildcard_spec
+%type <wildcard> section_name_spec filename_spec wildcard_maybe_exclude
 %token <bigint> INT
 %token <name> NAME LNAME
 %type <integer> length
@@ -133,7 +131,7 @@ static int error_index;
 %token SORT_BY_INIT_PRIORITY
 %token '{' '}'
 %token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH
-%token INHIBIT_COMMON_ALLOCATION
+%token INHIBIT_COMMON_ALLOCATION FORCE_GROUP_ALLOCATION
 %token SEGMENT_START
 %token INCLUDE
 %token MEMORY
@@ -143,18 +141,18 @@ static int error_index;
 %token DEFINED TARGET_K SEARCH_DIR MAP ENTRY
 %token <integer> NEXT
 %token SIZEOF ALIGNOF ADDR LOADADDR MAX_K MIN_K
-%token STARTUP HLL SYSLIB FLOAT NOFLOAT NOCROSSREFS
+%token STARTUP HLL SYSLIB FLOAT NOFLOAT NOCROSSREFS NOCROSSREFS_TO
 %token ORIGIN FILL
 %token LENGTH CREATE_OBJECT_SYMBOLS INPUT GROUP OUTPUT CONSTRUCTORS
-%token ALIGNMOD AT SUBALIGN PROVIDE PROVIDE_HIDDEN AS_NEEDED
-%type <token> assign_op atype attributes_opt sect_constraint
+%token ALIGNMOD AT SUBALIGN HIDDEN PROVIDE PROVIDE_HIDDEN AS_NEEDED
+%type <token> assign_op atype attributes_opt sect_constraint opt_align_with_input
 %type <name>  filename
 %token CHIP LIST SECT ABSOLUTE  LOAD NEWLINE ENDWORD ORDER NAMEWORD ASSERT_K
-%token FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE REL
+%token LOG2CEIL FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE REL
 %token INPUT_SCRIPT INPUT_MRI_SCRIPT INPUT_DEFSYM CASE EXTERN START
 %token <name> VERS_TAG VERS_IDENTIFIER
 %token GLOBAL LOCAL VERSIONK INPUT_VERSION_SCRIPT
-%token KEEP ONLY_IF_RO ONLY_IF_RW SPECIAL INPUT_SECTION_FLAGS
+%token KEEP ONLY_IF_RO ONLY_IF_RW SPECIAL INPUT_SECTION_FLAGS ALIGN_WITH_INPUT
 %token EXCLUDE_FILE
 %token CONSTANT
 %type <versyms> vers_defns
@@ -338,8 +336,10 @@ ifile_p1:
                  { ldfile_set_output_arch ($3, bfd_arch_unknown); }
        |       FORCE_COMMON_ALLOCATION
                { command_line.force_common_definition = TRUE ; }
+       |       FORCE_GROUP_ALLOCATION
+               { command_line.force_group_allocation = TRUE ; }
        |       INHIBIT_COMMON_ALLOCATION
-               { command_line.inhibit_common_definition = TRUE ; }
+               { link_info.inhibit_common_definition = TRUE ; }
        |       INPUT '(' input_list ')'
        |       GROUP
                  { lang_enter_group (); }
@@ -355,6 +355,10 @@ ifile_p1:
                {
                  lang_add_nocrossref ($3);
                }
+       |       NOCROSSREFS_TO '(' nocrossref_list ')'
+               {
+                 lang_add_nocrossref_to ($3);
+               }
        |       EXTERN '(' extern_name_list ')'
        |       INSERT_K AFTER NAME
                { lang_add_insert ($3, 0); }
@@ -367,38 +371,43 @@ ifile_p1:
        ;
 
 input_list:
+               { ldlex_inputlist(); }
+               input_list1
+               { ldlex_popstate(); }
+
+input_list1:
                NAME
                { lang_add_input_file($1,lang_input_file_is_search_file_enum,
                                 (char *)NULL); }
-       |       input_list ',' NAME
+       |       input_list1 ',' NAME
                { lang_add_input_file($3,lang_input_file_is_search_file_enum,
                                 (char *)NULL); }
-       |       input_list NAME
+       |       input_list1 NAME
                { lang_add_input_file($2,lang_input_file_is_search_file_enum,
                                 (char *)NULL); }
        |       LNAME
                { lang_add_input_file($1,lang_input_file_is_l_enum,
                                 (char *)NULL); }
-       |       input_list ',' LNAME
+       |       input_list1 ',' LNAME
                { lang_add_input_file($3,lang_input_file_is_l_enum,
                                 (char *)NULL); }
-       |       input_list LNAME
+       |       input_list1 LNAME
                { lang_add_input_file($2,lang_input_file_is_l_enum,
                                 (char *)NULL); }
        |       AS_NEEDED '('
                  { $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
                    input_flags.add_DT_NEEDED_for_regular = TRUE; }
-                    input_list ')'
+                    input_list1 ')'
                  { input_flags.add_DT_NEEDED_for_regular = $<integer>3; }
-       |       input_list ',' AS_NEEDED '('
+       |       input_list1 ',' AS_NEEDED '('
                  { $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
                    input_flags.add_DT_NEEDED_for_regular = TRUE; }
-                    input_list ')'
+                    input_list1 ')'
                  { input_flags.add_DT_NEEDED_for_regular = $<integer>5; }
-       |       input_list AS_NEEDED '('
+       |       input_list1 AS_NEEDED '('
                  { $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
                    input_flags.add_DT_NEEDED_for_regular = TRUE; }
-                    input_list ')'
+                    input_list1 ')'
                  { input_flags.add_DT_NEEDED_for_regular = $<integer>4; }
        ;
 
@@ -438,7 +447,7 @@ wildcard_name:
                        }
        ;
 
-wildcard_spec:
+wildcard_maybe_exclude:
                wildcard_name
                        {
                          $$.name = $1;
@@ -453,68 +462,63 @@ wildcard_spec:
                          $$.exclude_name_list = $3;
                          $$.section_flag_list = NULL;
                        }
-       |       SORT_BY_NAME '(' wildcard_name ')'
+       ;
+
+filename_spec:
+               wildcard_maybe_exclude
+       |       SORT_BY_NAME '(' wildcard_maybe_exclude ')'
                        {
-                         $$.name = $3;
+                         $$ = $3;
                          $$.sorted = by_name;
-                         $$.exclude_name_list = NULL;
-                         $$.section_flag_list = NULL;
                        }
-       |       SORT_BY_ALIGNMENT '(' wildcard_name ')'
+       |       SORT_NONE '(' wildcard_maybe_exclude ')'
+                       {
+                         $$ = $3;
+                         $$.sorted = by_none;
+                       }
+       ;
+
+section_name_spec:
+               wildcard_maybe_exclude
+       |       SORT_BY_NAME '(' wildcard_maybe_exclude ')'
                        {
-                         $$.name = $3;
+                         $$ = $3;
+                         $$.sorted = by_name;
+                       }
+       |       SORT_BY_ALIGNMENT '(' wildcard_maybe_exclude ')'
+                       {
+                         $$ = $3;
                          $$.sorted = by_alignment;
-                         $$.exclude_name_list = NULL;
-                         $$.section_flag_list = NULL;
                        }
-       |       SORT_NONE '(' wildcard_name ')'
+       |       SORT_NONE '(' wildcard_maybe_exclude ')'
                        {
-                         $$.name = $3;
+                         $$ = $3;
                          $$.sorted = by_none;
-                         $$.exclude_name_list = NULL;
-                         $$.section_flag_list = NULL;
                        }
-       |       SORT_BY_NAME '(' SORT_BY_ALIGNMENT '(' wildcard_name ')' ')'
+       |       SORT_BY_NAME '(' SORT_BY_ALIGNMENT '(' wildcard_maybe_exclude ')' ')'
                        {
-                         $$.name = $5;
+                         $$ = $5;
                          $$.sorted = by_name_alignment;
-                         $$.exclude_name_list = NULL;
-                         $$.section_flag_list = NULL;
                        }
-       |       SORT_BY_NAME '(' SORT_BY_NAME '(' wildcard_name ')' ')'
+       |       SORT_BY_NAME '(' SORT_BY_NAME '(' wildcard_maybe_exclude ')' ')'
                        {
-                         $$.name = $5;
+                         $$ = $5;
                          $$.sorted = by_name;
-                         $$.exclude_name_list = NULL;
-                         $$.section_flag_list = NULL;
                        }
-       |       SORT_BY_ALIGNMENT '(' SORT_BY_NAME '(' wildcard_name ')' ')'
+       |       SORT_BY_ALIGNMENT '(' SORT_BY_NAME '(' wildcard_maybe_exclude ')' ')'
                        {
-                         $$.name = $5;
+                         $$ = $5;
                          $$.sorted = by_alignment_name;
-                         $$.exclude_name_list = NULL;
-                         $$.section_flag_list = NULL;
                        }
-       |       SORT_BY_ALIGNMENT '(' SORT_BY_ALIGNMENT '(' wildcard_name ')' ')'
+       |       SORT_BY_ALIGNMENT '(' SORT_BY_ALIGNMENT '(' wildcard_maybe_exclude ')' ')'
                        {
-                         $$.name = $5;
+                         $$ = $5;
                          $$.sorted = by_alignment;
-                         $$.exclude_name_list = NULL;
-                         $$.section_flag_list = NULL;
                        }
-       |       SORT_BY_NAME '(' EXCLUDE_FILE '(' exclude_name_list ')' wildcard_name ')'
+       |       SORT_BY_INIT_PRIORITY '(' wildcard_maybe_exclude ')'
                        {
-                         $$.name = $7;
-                         $$.sorted = by_name;
-                         $$.exclude_name_list = $5;
-                         $$.section_flag_list = NULL;
-                       }
-       |       SORT_BY_INIT_PRIORITY '(' wildcard_name ')'
-                       {
-                         $$.name = $3;
+                         $$ = $3;
                          $$.sorted = by_init_priority;
-                         $$.exclude_name_list = NULL;
-                         $$.section_flag_list = NULL;
                        }
        ;
 
@@ -589,8 +593,8 @@ exclude_name_list:
                        }
        ;
 
-file_NAME_list:
-               file_NAME_list opt_comma wildcard_spec
+section_name_list:
+               section_name_list opt_comma section_name_spec
                        {
                          struct wildcard_list *tmp;
                          tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
@@ -599,7 +603,7 @@ file_NAME_list:
                          $$ = tmp;
                        }
        |
-               wildcard_spec
+               section_name_spec
                        {
                          struct wildcard_list *tmp;
                          tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
@@ -628,11 +632,11 @@ input_section_spec_no_keep:
                          tmp.section_flag_list = $1;
                          lang_add_wild (&tmp, NULL, ldgram_had_keep);
                        }
-        |      '[' file_NAME_list ']'
+        |      '[' section_name_list ']'
                        {
                          lang_add_wild (NULL, $2, ldgram_had_keep);
                        }
-        |      sect_flags '[' file_NAME_list ']'
+        |      sect_flags '[' section_name_list ']'
                        {
                          struct wildcard_spec tmp;
                          tmp.name = NULL;
@@ -641,11 +645,11 @@ input_section_spec_no_keep:
                          tmp.section_flag_list = $1;
                          lang_add_wild (&tmp, $3, ldgram_had_keep);
                        }
-       |       wildcard_spec '(' file_NAME_list ')'
+       |       filename_spec '(' section_name_list ')'
                        {
                          lang_add_wild (&$1, $3, ldgram_had_keep);
                        }
-       |       sect_flags wildcard_spec '(' file_NAME_list ')'
+       |       sect_flags filename_spec '(' section_name_list ')'
                        {
                          $2.section_flag_list = $1;
                          lang_add_wild (&$2, $4, ldgram_had_keep);
@@ -759,7 +763,7 @@ end:        ';' | ','
 assignment:
                NAME '=' mustbe_exp
                {
-                 lang_add_assignment (exp_assign ($1, $3));
+                 lang_add_assignment (exp_assign ($1, $3, FALSE));
                }
        |       NAME assign_op mustbe_exp
                {
@@ -767,7 +771,11 @@ assignment:
                                                   exp_binop ($2,
                                                              exp_nameop (NAME,
                                                                          $1),
-                                                             $3)));
+                                                             $3), FALSE));
+               }
+       |       HIDDEN '(' NAME '=' mustbe_exp ')'
+               {
+                 lang_add_assignment (exp_assign ($3, $5, TRUE));
                }
        |       PROVIDE '(' NAME '=' mustbe_exp ')'
                {
@@ -810,7 +818,7 @@ memory_spec:        NAME
 origin_spec:
        ORIGIN '=' mustbe_exp
                {
-                 region->origin = exp_get_vma ($3, 0, "origin");
+                 region->origin_exp = $3;
                  region->current = region->origin;
                }
        ;
@@ -818,7 +826,7 @@ origin_spec:
 length_spec:
              LENGTH '=' mustbe_exp
                {
-                 region->length = exp_get_vma ($3, -1, "length");
+                 region->length_exp = $3;
                }
        ;
 
@@ -1008,6 +1016,8 @@ exp       :
                        { $$ = exp_nameop (ORIGIN, $3); }
        |       LENGTH '(' NAME ')'
                        { $$ = exp_nameop (LENGTH, $3); }
+       |       LOG2CEIL '(' exp ')'
+                       { $$ = exp_unop (LOG2CEIL, $3); }
        ;
 
 
@@ -1026,6 +1036,11 @@ opt_align:
        |       { $$ = 0; }
        ;
 
+opt_align_with_input:
+               ALIGN_WITH_INPUT { $$ = ALIGN_WITH_INPUT; }
+       |       { $$ = 0; }
+       ;
+
 opt_subalign:
                SUBALIGN '(' exp ')' { $$ = $3; }
        |       { $$ = 0; }
@@ -1042,20 +1057,21 @@ section:        NAME            { ldlex_expression(); }
                opt_exp_with_type
                opt_at
                opt_align
+               opt_align_with_input
                opt_subalign    { ldlex_popstate (); ldlex_script (); }
                sect_constraint
                '{'
                        {
                          lang_enter_output_section_statement($1, $3,
                                                              sectype,
-                                                             $5, $6, $4, $8);
+                                                             $5, $7, $4, $9, $6);
                        }
                statement_list_opt
                '}' { ldlex_popstate (); ldlex_expression (); }
                memspec_opt memspec_at_opt phdr_opt fill_opt
                {
                  ldlex_popstate ();
-                 lang_leave_output_section_statement ($17, $14, $16, $15);
+                 lang_leave_output_section_statement ($18, $15, $17, $16);
                }
                opt_comma
                {}
@@ -1085,7 +1101,7 @@ section:  NAME            { ldlex_expression(); }
                opt_exp_with_type
                {
                  ldlex_popstate ();
-                 lang_add_assignment (exp_assign (".", $3));
+                 lang_add_assignment (exp_assign (".", $3, FALSE));
                }
                '{' sec_or_group_p1 '}'
        |       INCLUDE filename
This page took 0.041236 seconds and 4 git commands to generate.