OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [binutils-2.18.50/] [ld/] [ldgram.y] - Diff between revs 156 and 816

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 156 Rev 816
/* A YACC grammar to parse a superset of the AT&T linker scripting language.
/* 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,
   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
   2001, 2002, 2003, 2004, 2005, 2006, 2007 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).
   Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com).
   This file is part of the GNU Binutils.
   This file is part of the GNU Binutils.
   This program is free software; you can redistribute it and/or modify
   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
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.
   (at your option) any later version.
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */
   MA 02110-1301, USA.  */
%{
%{
/*
/*
 */
 */
#define DONTDECLARE_MALLOC
#define DONTDECLARE_MALLOC
#include "sysdep.h"
#include "sysdep.h"
#include "bfd.h"
#include "bfd.h"
#include "bfdlink.h"
#include "bfdlink.h"
#include "ld.h"
#include "ld.h"
#include "ldexp.h"
#include "ldexp.h"
#include "ldver.h"
#include "ldver.h"
#include "ldlang.h"
#include "ldlang.h"
#include "ldfile.h"
#include "ldfile.h"
#include "ldemul.h"
#include "ldemul.h"
#include "ldmisc.h"
#include "ldmisc.h"
#include "ldmain.h"
#include "ldmain.h"
#include "mri.h"
#include "mri.h"
#include "ldctor.h"
#include "ldctor.h"
#include "ldlex.h"
#include "ldlex.h"
#ifndef YYDEBUG
#ifndef YYDEBUG
#define YYDEBUG 1
#define YYDEBUG 1
#endif
#endif
static enum section_type sectype;
static enum section_type sectype;
static lang_memory_region_type *region;
static lang_memory_region_type *region;
bfd_boolean ldgram_had_keep = FALSE;
bfd_boolean ldgram_had_keep = FALSE;
char *ldgram_vers_current_lang = NULL;
char *ldgram_vers_current_lang = NULL;
#define ERROR_NAME_MAX 20
#define ERROR_NAME_MAX 20
static char *error_names[ERROR_NAME_MAX];
static char *error_names[ERROR_NAME_MAX];
static int error_index;
static int error_index;
#define PUSH_ERROR(x) if (error_index < ERROR_NAME_MAX) error_names[error_index] = x; error_index++;
#define PUSH_ERROR(x) if (error_index < ERROR_NAME_MAX) error_names[error_index] = x; error_index++;
#define POP_ERROR()   error_index--;
#define POP_ERROR()   error_index--;
%}
%}
%union {
%union {
  bfd_vma integer;
  bfd_vma integer;
  struct big_int
  struct big_int
    {
    {
      bfd_vma integer;
      bfd_vma integer;
      char *str;
      char *str;
    } bigint;
    } bigint;
  fill_type *fill;
  fill_type *fill;
  char *name;
  char *name;
  const char *cname;
  const char *cname;
  struct wildcard_spec wildcard;
  struct wildcard_spec wildcard;
  struct wildcard_list *wildcard_list;
  struct wildcard_list *wildcard_list;
  struct name_list *name_list;
  struct name_list *name_list;
  int token;
  int token;
  union etree_union *etree;
  union etree_union *etree;
  struct phdr_info
  struct phdr_info
    {
    {
      bfd_boolean filehdr;
      bfd_boolean filehdr;
      bfd_boolean phdrs;
      bfd_boolean phdrs;
      union etree_union *at;
      union etree_union *at;
      union etree_union *flags;
      union etree_union *flags;
    } phdr;
    } phdr;
  struct lang_nocrossref *nocrossref;
  struct lang_nocrossref *nocrossref;
  struct lang_output_section_phdr_list *section_phdr;
  struct lang_output_section_phdr_list *section_phdr;
  struct bfd_elf_version_deps *deflist;
  struct bfd_elf_version_deps *deflist;
  struct bfd_elf_version_expr *versyms;
  struct bfd_elf_version_expr *versyms;
  struct bfd_elf_version_tree *versnode;
  struct bfd_elf_version_tree *versnode;
}
}
%type  exp opt_exp_with_type mustbe_exp opt_at phdr_type phdr_val
%type  exp opt_exp_with_type mustbe_exp opt_at phdr_type phdr_val
%type  opt_exp_without_type opt_subalign opt_align
%type  opt_exp_without_type opt_subalign opt_align
%type  fill_opt fill_exp
%type  fill_opt fill_exp
%type  exclude_name_list
%type  exclude_name_list
%type  file_NAME_list
%type  file_NAME_list
%type  memspec_opt casesymlist
%type  memspec_opt casesymlist
%type  memspec_at_opt
%type  memspec_at_opt
%type  wildcard_name
%type  wildcard_name
%type  wildcard_spec
%type  wildcard_spec
%token  INT
%token  INT
%token  NAME LNAME
%token  NAME LNAME
%type  length
%type  length
%type  phdr_qualifiers
%type  phdr_qualifiers
%type  nocrossref_list
%type  nocrossref_list
%type  phdr_opt
%type  phdr_opt
%type  opt_nocrossrefs
%type  opt_nocrossrefs
%right  PLUSEQ MINUSEQ MULTEQ DIVEQ  '=' LSHIFTEQ RSHIFTEQ   ANDEQ OREQ
%right  PLUSEQ MINUSEQ MULTEQ DIVEQ  '=' LSHIFTEQ RSHIFTEQ   ANDEQ OREQ
%right  '?' ':'
%right  '?' ':'
%left  OROR
%left  OROR
%left   ANDAND
%left   ANDAND
%left  '|'
%left  '|'
%left   '^'
%left   '^'
%left   '&'
%left   '&'
%left   EQ NE
%left   EQ NE
%left   '<' '>' LE GE
%left   '<' '>' LE GE
%left   LSHIFT RSHIFT
%left   LSHIFT RSHIFT
%left   '+' '-'
%left   '+' '-'
%left   '*' '/' '%'
%left   '*' '/' '%'
%right UNARY
%right UNARY
%token END
%token END
%left  '('
%left  '('
%token  ALIGN_K BLOCK BIND QUAD SQUAD LONG SHORT BYTE
%token  ALIGN_K BLOCK BIND QUAD SQUAD LONG SHORT BYTE
%token SECTIONS PHDRS INSERT_K AFTER BEFORE
%token SECTIONS PHDRS INSERT_K AFTER BEFORE
%token DATA_SEGMENT_ALIGN DATA_SEGMENT_RELRO_END DATA_SEGMENT_END
%token DATA_SEGMENT_ALIGN DATA_SEGMENT_RELRO_END DATA_SEGMENT_END
%token SORT_BY_NAME SORT_BY_ALIGNMENT
%token SORT_BY_NAME SORT_BY_ALIGNMENT
%token '{' '}'
%token '{' '}'
%token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH
%token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH
%token INHIBIT_COMMON_ALLOCATION
%token INHIBIT_COMMON_ALLOCATION
%token SEGMENT_START
%token SEGMENT_START
%token INCLUDE
%token INCLUDE
%token MEMORY
%token MEMORY
%token NOLOAD DSECT COPY INFO OVERLAY
%token NOLOAD DSECT COPY INFO OVERLAY
%token DEFINED TARGET_K SEARCH_DIR MAP ENTRY
%token DEFINED TARGET_K SEARCH_DIR MAP ENTRY
%token  NEXT
%token  NEXT
%token SIZEOF ALIGNOF ADDR LOADADDR MAX_K MIN_K
%token SIZEOF ALIGNOF ADDR LOADADDR MAX_K MIN_K
%token STARTUP HLL SYSLIB FLOAT NOFLOAT NOCROSSREFS
%token STARTUP HLL SYSLIB FLOAT NOFLOAT NOCROSSREFS
%token ORIGIN FILL
%token ORIGIN FILL
%token LENGTH CREATE_OBJECT_SYMBOLS INPUT GROUP OUTPUT CONSTRUCTORS
%token LENGTH CREATE_OBJECT_SYMBOLS INPUT GROUP OUTPUT CONSTRUCTORS
%token ALIGNMOD AT SUBALIGN PROVIDE PROVIDE_HIDDEN AS_NEEDED
%token ALIGNMOD AT SUBALIGN PROVIDE PROVIDE_HIDDEN AS_NEEDED
%type  assign_op atype attributes_opt sect_constraint
%type  assign_op atype attributes_opt sect_constraint
%type   filename
%type   filename
%token CHIP LIST SECT ABSOLUTE  LOAD NEWLINE ENDWORD ORDER NAMEWORD ASSERT_K
%token CHIP LIST SECT ABSOLUTE  LOAD NEWLINE ENDWORD ORDER NAMEWORD ASSERT_K
%token FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE REL
%token FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE REL
%token INPUT_SCRIPT INPUT_MRI_SCRIPT INPUT_DEFSYM CASE EXTERN START
%token INPUT_SCRIPT INPUT_MRI_SCRIPT INPUT_DEFSYM CASE EXTERN START
%token  VERS_TAG VERS_IDENTIFIER
%token  VERS_TAG VERS_IDENTIFIER
%token GLOBAL LOCAL VERSIONK INPUT_VERSION_SCRIPT
%token GLOBAL LOCAL VERSIONK INPUT_VERSION_SCRIPT
%token KEEP ONLY_IF_RO ONLY_IF_RW SPECIAL
%token KEEP ONLY_IF_RO ONLY_IF_RW SPECIAL
%token EXCLUDE_FILE
%token EXCLUDE_FILE
%token CONSTANT
%token CONSTANT
%type  vers_defns
%type  vers_defns
%type  vers_tag
%type  vers_tag
%type  verdep
%type  verdep
%token INPUT_DYNAMIC_LIST
%token INPUT_DYNAMIC_LIST
%%
%%
file:
file:
                INPUT_SCRIPT script_file
                INPUT_SCRIPT script_file
        |       INPUT_MRI_SCRIPT mri_script_file
        |       INPUT_MRI_SCRIPT mri_script_file
        |       INPUT_VERSION_SCRIPT version_script_file
        |       INPUT_VERSION_SCRIPT version_script_file
        |       INPUT_DYNAMIC_LIST dynamic_list_file
        |       INPUT_DYNAMIC_LIST dynamic_list_file
        |       INPUT_DEFSYM defsym_expr
        |       INPUT_DEFSYM defsym_expr
        ;
        ;
filename:  NAME;
filename:  NAME;
defsym_expr:
defsym_expr:
                { ldlex_defsym(); }
                { ldlex_defsym(); }
                NAME '=' exp
                NAME '=' exp
                {
                {
                  ldlex_popstate();
                  ldlex_popstate();
                  lang_add_assignment(exp_assop($3,$2,$4));
                  lang_add_assignment(exp_assop($3,$2,$4));
                }
                }
        ;
        ;
/* SYNTAX WITHIN AN MRI SCRIPT FILE */
/* SYNTAX WITHIN AN MRI SCRIPT FILE */
mri_script_file:
mri_script_file:
                {
                {
                  ldlex_mri_script ();
                  ldlex_mri_script ();
                  PUSH_ERROR (_("MRI style script"));
                  PUSH_ERROR (_("MRI style script"));
                }
                }
             mri_script_lines
             mri_script_lines
                {
                {
                  ldlex_popstate ();
                  ldlex_popstate ();
                  mri_draw_tree ();
                  mri_draw_tree ();
                  POP_ERROR ();
                  POP_ERROR ();
                }
                }
        ;
        ;
mri_script_lines:
mri_script_lines:
                mri_script_lines mri_script_command NEWLINE
                mri_script_lines mri_script_command NEWLINE
          |
          |
        ;
        ;
mri_script_command:
mri_script_command:
                CHIP  exp
                CHIP  exp
        |       CHIP  exp ',' exp
        |       CHIP  exp ',' exp
        |       NAME    {
        |       NAME    {
                        einfo(_("%P%F: unrecognised keyword in MRI style script '%s'\n"),$1);
                        einfo(_("%P%F: unrecognised keyword in MRI style script '%s'\n"),$1);
                        }
                        }
        |       LIST    {
        |       LIST    {
                        config.map_filename = "-";
                        config.map_filename = "-";
                        }
                        }
        |       ORDER ordernamelist
        |       ORDER ordernamelist
        |       ENDWORD
        |       ENDWORD
        |       PUBLIC NAME '=' exp
        |       PUBLIC NAME '=' exp
                        { mri_public($2, $4); }
                        { mri_public($2, $4); }
        |       PUBLIC NAME ',' exp
        |       PUBLIC NAME ',' exp
                        { mri_public($2, $4); }
                        { mri_public($2, $4); }
        |       PUBLIC NAME  exp
        |       PUBLIC NAME  exp
                        { mri_public($2, $3); }
                        { mri_public($2, $3); }
        |       FORMAT NAME
        |       FORMAT NAME
                        { mri_format($2); }
                        { mri_format($2); }
        |       SECT NAME ',' exp
        |       SECT NAME ',' exp
                        { mri_output_section($2, $4);}
                        { mri_output_section($2, $4);}
        |       SECT NAME  exp
        |       SECT NAME  exp
                        { mri_output_section($2, $3);}
                        { mri_output_section($2, $3);}
        |       SECT NAME '=' exp
        |       SECT NAME '=' exp
                        { mri_output_section($2, $4);}
                        { mri_output_section($2, $4);}
        |       ALIGN_K NAME '=' exp
        |       ALIGN_K NAME '=' exp
                        { mri_align($2,$4); }
                        { mri_align($2,$4); }
        |       ALIGN_K NAME ',' exp
        |       ALIGN_K NAME ',' exp
                        { mri_align($2,$4); }
                        { mri_align($2,$4); }
        |       ALIGNMOD NAME '=' exp
        |       ALIGNMOD NAME '=' exp
                        { mri_alignmod($2,$4); }
                        { mri_alignmod($2,$4); }
        |       ALIGNMOD NAME ',' exp
        |       ALIGNMOD NAME ',' exp
                        { mri_alignmod($2,$4); }
                        { mri_alignmod($2,$4); }
        |       ABSOLUTE mri_abs_name_list
        |       ABSOLUTE mri_abs_name_list
        |       LOAD     mri_load_name_list
        |       LOAD     mri_load_name_list
        |       NAMEWORD NAME
        |       NAMEWORD NAME
                        { mri_name($2); }
                        { mri_name($2); }
        |       ALIAS NAME ',' NAME
        |       ALIAS NAME ',' NAME
                        { mri_alias($2,$4,0);}
                        { mri_alias($2,$4,0);}
        |       ALIAS NAME ',' INT
        |       ALIAS NAME ',' INT
                        { mri_alias ($2, 0, (int) $4.integer); }
                        { mri_alias ($2, 0, (int) $4.integer); }
        |       BASE     exp
        |       BASE     exp
                        { mri_base($2); }
                        { mri_base($2); }
        |       TRUNCATE INT
        |       TRUNCATE INT
                { mri_truncate ((unsigned int) $2.integer); }
                { mri_truncate ((unsigned int) $2.integer); }
        |       CASE casesymlist
        |       CASE casesymlist
        |       EXTERN extern_name_list
        |       EXTERN extern_name_list
        |       INCLUDE filename
        |       INCLUDE filename
                { ldlex_script (); ldfile_open_command_file($2); }
                { ldlex_script (); ldfile_open_command_file($2); }
                mri_script_lines END
                mri_script_lines END
                { ldlex_popstate (); }
                { ldlex_popstate (); }
        |       START NAME
        |       START NAME
                { lang_add_entry ($2, FALSE); }
                { lang_add_entry ($2, FALSE); }
        |
        |
        ;
        ;
ordernamelist:
ordernamelist:
              ordernamelist ',' NAME         { mri_order($3); }
              ordernamelist ',' NAME         { mri_order($3); }
        |     ordernamelist  NAME         { mri_order($2); }
        |     ordernamelist  NAME         { mri_order($2); }
        |
        |
        ;
        ;
mri_load_name_list:
mri_load_name_list:
                NAME
                NAME
                        { mri_load($1); }
                        { mri_load($1); }
        |       mri_load_name_list ',' NAME { mri_load($3); }
        |       mri_load_name_list ',' NAME { mri_load($3); }
        ;
        ;
mri_abs_name_list:
mri_abs_name_list:
                NAME
                NAME
                        { mri_only_load($1); }
                        { mri_only_load($1); }
        |       mri_abs_name_list ','  NAME
        |       mri_abs_name_list ','  NAME
                        { mri_only_load($3); }
                        { mri_only_load($3); }
        ;
        ;
casesymlist:
casesymlist:
          /* empty */ { $$ = NULL; }
          /* empty */ { $$ = NULL; }
        | NAME
        | NAME
        | casesymlist ',' NAME
        | casesymlist ',' NAME
        ;
        ;
/* Parsed as expressions so that commas separate entries */
/* Parsed as expressions so that commas separate entries */
extern_name_list:
extern_name_list:
        { ldlex_expression (); }
        { ldlex_expression (); }
        extern_name_list_body
        extern_name_list_body
        { ldlex_popstate (); }
        { ldlex_popstate (); }
extern_name_list_body:
extern_name_list_body:
          NAME
          NAME
                        { ldlang_add_undef ($1); }
                        { ldlang_add_undef ($1); }
        | extern_name_list_body NAME
        | extern_name_list_body NAME
                        { ldlang_add_undef ($2); }
                        { ldlang_add_undef ($2); }
        | extern_name_list_body ',' NAME
        | extern_name_list_body ',' NAME
                        { ldlang_add_undef ($3); }
                        { ldlang_add_undef ($3); }
        ;
        ;
script_file:
script_file:
        { ldlex_both(); }
        { ldlex_both(); }
        ifile_list
        ifile_list
        { ldlex_popstate(); }
        { ldlex_popstate(); }
        ;
        ;
ifile_list:
ifile_list:
        ifile_list ifile_p1
        ifile_list ifile_p1
        |
        |
        ;
        ;
ifile_p1:
ifile_p1:
                memory
                memory
        |       sections
        |       sections
        |       phdrs
        |       phdrs
        |       startup
        |       startup
        |       high_level_library
        |       high_level_library
        |       low_level_library
        |       low_level_library
        |       floating_point_support
        |       floating_point_support
        |       statement_anywhere
        |       statement_anywhere
        |       version
        |       version
        |        ';'
        |        ';'
        |       TARGET_K '(' NAME ')'
        |       TARGET_K '(' NAME ')'
                { lang_add_target($3); }
                { lang_add_target($3); }
        |       SEARCH_DIR '(' filename ')'
        |       SEARCH_DIR '(' filename ')'
                { ldfile_add_library_path ($3, FALSE); }
                { ldfile_add_library_path ($3, FALSE); }
        |       OUTPUT '(' filename ')'
        |       OUTPUT '(' filename ')'
                { lang_add_output($3, 1); }
                { lang_add_output($3, 1); }
        |       OUTPUT_FORMAT '(' NAME ')'
        |       OUTPUT_FORMAT '(' NAME ')'
                  { lang_add_output_format ($3, (char *) NULL,
                  { lang_add_output_format ($3, (char *) NULL,
                                            (char *) NULL, 1); }
                                            (char *) NULL, 1); }
        |       OUTPUT_FORMAT '(' NAME ',' NAME ',' NAME ')'
        |       OUTPUT_FORMAT '(' NAME ',' NAME ',' NAME ')'
                  { lang_add_output_format ($3, $5, $7, 1); }
                  { lang_add_output_format ($3, $5, $7, 1); }
        |       OUTPUT_ARCH '(' NAME ')'
        |       OUTPUT_ARCH '(' NAME ')'
                  { ldfile_set_output_arch ($3, bfd_arch_unknown); }
                  { ldfile_set_output_arch ($3, bfd_arch_unknown); }
        |       FORCE_COMMON_ALLOCATION
        |       FORCE_COMMON_ALLOCATION
                { command_line.force_common_definition = TRUE ; }
                { command_line.force_common_definition = TRUE ; }
        |       INHIBIT_COMMON_ALLOCATION
        |       INHIBIT_COMMON_ALLOCATION
                { command_line.inhibit_common_definition = TRUE ; }
                { command_line.inhibit_common_definition = TRUE ; }
        |       INPUT '(' input_list ')'
        |       INPUT '(' input_list ')'
        |       GROUP
        |       GROUP
                  { lang_enter_group (); }
                  { lang_enter_group (); }
                    '(' input_list ')'
                    '(' input_list ')'
                  { lang_leave_group (); }
                  { lang_leave_group (); }
        |       MAP '(' filename ')'
        |       MAP '(' filename ')'
                { lang_add_map($3); }
                { lang_add_map($3); }
        |       INCLUDE filename
        |       INCLUDE filename
                { ldlex_script (); ldfile_open_command_file($2); }
                { ldlex_script (); ldfile_open_command_file($2); }
                ifile_list END
                ifile_list END
                { ldlex_popstate (); }
                { ldlex_popstate (); }
        |       NOCROSSREFS '(' nocrossref_list ')'
        |       NOCROSSREFS '(' nocrossref_list ')'
                {
                {
                  lang_add_nocrossref ($3);
                  lang_add_nocrossref ($3);
                }
                }
        |       EXTERN '(' extern_name_list ')'
        |       EXTERN '(' extern_name_list ')'
        |       INSERT_K AFTER NAME
        |       INSERT_K AFTER NAME
                { lang_add_insert ($3, 0); }
                { lang_add_insert ($3, 0); }
        |       INSERT_K BEFORE NAME
        |       INSERT_K BEFORE NAME
                { lang_add_insert ($3, 1); }
                { lang_add_insert ($3, 1); }
        ;
        ;
input_list:
input_list:
                NAME
                NAME
                { lang_add_input_file($1,lang_input_file_is_search_file_enum,
                { lang_add_input_file($1,lang_input_file_is_search_file_enum,
                                 (char *)NULL); }
                                 (char *)NULL); }
        |       input_list ',' NAME
        |       input_list ',' NAME
                { lang_add_input_file($3,lang_input_file_is_search_file_enum,
                { lang_add_input_file($3,lang_input_file_is_search_file_enum,
                                 (char *)NULL); }
                                 (char *)NULL); }
        |       input_list NAME
        |       input_list NAME
                { lang_add_input_file($2,lang_input_file_is_search_file_enum,
                { lang_add_input_file($2,lang_input_file_is_search_file_enum,
                                 (char *)NULL); }
                                 (char *)NULL); }
        |       LNAME
        |       LNAME
                { lang_add_input_file($1,lang_input_file_is_l_enum,
                { lang_add_input_file($1,lang_input_file_is_l_enum,
                                 (char *)NULL); }
                                 (char *)NULL); }
        |       input_list ',' LNAME
        |       input_list ',' LNAME
                { lang_add_input_file($3,lang_input_file_is_l_enum,
                { lang_add_input_file($3,lang_input_file_is_l_enum,
                                 (char *)NULL); }
                                 (char *)NULL); }
        |       input_list LNAME
        |       input_list LNAME
                { lang_add_input_file($2,lang_input_file_is_l_enum,
                { lang_add_input_file($2,lang_input_file_is_l_enum,
                                 (char *)NULL); }
                                 (char *)NULL); }
        |       AS_NEEDED '('
        |       AS_NEEDED '('
                  { $$ = as_needed; as_needed = TRUE; }
                  { $$ = as_needed; as_needed = TRUE; }
                     input_list ')'
                     input_list ')'
                  { as_needed = $3; }
                  { as_needed = $3; }
        |       input_list ',' AS_NEEDED '('
        |       input_list ',' AS_NEEDED '('
                  { $$ = as_needed; as_needed = TRUE; }
                  { $$ = as_needed; as_needed = TRUE; }
                     input_list ')'
                     input_list ')'
                  { as_needed = $5; }
                  { as_needed = $5; }
        |       input_list AS_NEEDED '('
        |       input_list AS_NEEDED '('
                  { $$ = as_needed; as_needed = TRUE; }
                  { $$ = as_needed; as_needed = TRUE; }
                     input_list ')'
                     input_list ')'
                  { as_needed = $4; }
                  { as_needed = $4; }
        ;
        ;
sections:
sections:
                SECTIONS '{' sec_or_group_p1 '}'
                SECTIONS '{' sec_or_group_p1 '}'
        ;
        ;
sec_or_group_p1:
sec_or_group_p1:
                sec_or_group_p1 section
                sec_or_group_p1 section
        |       sec_or_group_p1 statement_anywhere
        |       sec_or_group_p1 statement_anywhere
        |
        |
        ;
        ;
statement_anywhere:
statement_anywhere:
                ENTRY '(' NAME ')'
                ENTRY '(' NAME ')'
                { lang_add_entry ($3, FALSE); }
                { lang_add_entry ($3, FALSE); }
        |       assignment end
        |       assignment end
        |       ASSERT_K  {ldlex_expression ();} '(' exp ',' NAME ')'
        |       ASSERT_K  {ldlex_expression ();} '(' exp ',' NAME ')'
                { ldlex_popstate ();
                { ldlex_popstate ();
                  lang_add_assignment (exp_assert ($4, $6)); }
                  lang_add_assignment (exp_assert ($4, $6)); }
        ;
        ;
/* The '*' and '?' cases are there because the lexer returns them as
/* The '*' and '?' cases are there because the lexer returns them as
   separate tokens rather than as NAME.  */
   separate tokens rather than as NAME.  */
wildcard_name:
wildcard_name:
                NAME
                NAME
                        {
                        {
                          $$ = $1;
                          $$ = $1;
                        }
                        }
        |       '*'
        |       '*'
                        {
                        {
                          $$ = "*";
                          $$ = "*";
                        }
                        }
        |       '?'
        |       '?'
                        {
                        {
                          $$ = "?";
                          $$ = "?";
                        }
                        }
        ;
        ;
wildcard_spec:
wildcard_spec:
                wildcard_name
                wildcard_name
                        {
                        {
                          $$.name = $1;
                          $$.name = $1;
                          $$.sorted = none;
                          $$.sorted = none;
                          $$.exclude_name_list = NULL;
                          $$.exclude_name_list = NULL;
                        }
                        }
        |       EXCLUDE_FILE '(' exclude_name_list ')' wildcard_name
        |       EXCLUDE_FILE '(' exclude_name_list ')' wildcard_name
                        {
                        {
                          $$.name = $5;
                          $$.name = $5;
                          $$.sorted = none;
                          $$.sorted = none;
                          $$.exclude_name_list = $3;
                          $$.exclude_name_list = $3;
                        }
                        }
        |       SORT_BY_NAME '(' wildcard_name ')'
        |       SORT_BY_NAME '(' wildcard_name ')'
                        {
                        {
                          $$.name = $3;
                          $$.name = $3;
                          $$.sorted = by_name;
                          $$.sorted = by_name;
                          $$.exclude_name_list = NULL;
                          $$.exclude_name_list = NULL;
                        }
                        }
        |       SORT_BY_ALIGNMENT '(' wildcard_name ')'
        |       SORT_BY_ALIGNMENT '(' wildcard_name ')'
                        {
                        {
                          $$.name = $3;
                          $$.name = $3;
                          $$.sorted = by_alignment;
                          $$.sorted = by_alignment;
                          $$.exclude_name_list = NULL;
                          $$.exclude_name_list = NULL;
                        }
                        }
        |       SORT_BY_NAME '(' SORT_BY_ALIGNMENT '(' wildcard_name ')' ')'
        |       SORT_BY_NAME '(' SORT_BY_ALIGNMENT '(' wildcard_name ')' ')'
                        {
                        {
                          $$.name = $5;
                          $$.name = $5;
                          $$.sorted = by_name_alignment;
                          $$.sorted = by_name_alignment;
                          $$.exclude_name_list = NULL;
                          $$.exclude_name_list = NULL;
                        }
                        }
        |       SORT_BY_NAME '(' SORT_BY_NAME '(' wildcard_name ')' ')'
        |       SORT_BY_NAME '(' SORT_BY_NAME '(' wildcard_name ')' ')'
                        {
                        {
                          $$.name = $5;
                          $$.name = $5;
                          $$.sorted = by_name;
                          $$.sorted = by_name;
                          $$.exclude_name_list = NULL;
                          $$.exclude_name_list = NULL;
                        }
                        }
        |       SORT_BY_ALIGNMENT '(' SORT_BY_NAME '(' wildcard_name ')' ')'
        |       SORT_BY_ALIGNMENT '(' SORT_BY_NAME '(' wildcard_name ')' ')'
                        {
                        {
                          $$.name = $5;
                          $$.name = $5;
                          $$.sorted = by_alignment_name;
                          $$.sorted = by_alignment_name;
                          $$.exclude_name_list = NULL;
                          $$.exclude_name_list = NULL;
                        }
                        }
        |       SORT_BY_ALIGNMENT '(' SORT_BY_ALIGNMENT '(' wildcard_name ')' ')'
        |       SORT_BY_ALIGNMENT '(' SORT_BY_ALIGNMENT '(' wildcard_name ')' ')'
                        {
                        {
                          $$.name = $5;
                          $$.name = $5;
                          $$.sorted = by_alignment;
                          $$.sorted = by_alignment;
                          $$.exclude_name_list = NULL;
                          $$.exclude_name_list = NULL;
                        }
                        }
        |       SORT_BY_NAME '(' EXCLUDE_FILE '(' exclude_name_list ')' wildcard_name ')'
        |       SORT_BY_NAME '(' EXCLUDE_FILE '(' exclude_name_list ')' wildcard_name ')'
                        {
                        {
                          $$.name = $7;
                          $$.name = $7;
                          $$.sorted = by_name;
                          $$.sorted = by_name;
                          $$.exclude_name_list = $5;
                          $$.exclude_name_list = $5;
                        }
                        }
        ;
        ;
exclude_name_list:
exclude_name_list:
                exclude_name_list wildcard_name
                exclude_name_list wildcard_name
                        {
                        {
                          struct name_list *tmp;
                          struct name_list *tmp;
                          tmp = (struct name_list *) xmalloc (sizeof *tmp);
                          tmp = (struct name_list *) xmalloc (sizeof *tmp);
                          tmp->name = $2;
                          tmp->name = $2;
                          tmp->next = $1;
                          tmp->next = $1;
                          $$ = tmp;
                          $$ = tmp;
                        }
                        }
        |
        |
                wildcard_name
                wildcard_name
                        {
                        {
                          struct name_list *tmp;
                          struct name_list *tmp;
                          tmp = (struct name_list *) xmalloc (sizeof *tmp);
                          tmp = (struct name_list *) xmalloc (sizeof *tmp);
                          tmp->name = $1;
                          tmp->name = $1;
                          tmp->next = NULL;
                          tmp->next = NULL;
                          $$ = tmp;
                          $$ = tmp;
                        }
                        }
        ;
        ;
file_NAME_list:
file_NAME_list:
                file_NAME_list opt_comma wildcard_spec
                file_NAME_list opt_comma wildcard_spec
                        {
                        {
                          struct wildcard_list *tmp;
                          struct wildcard_list *tmp;
                          tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
                          tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
                          tmp->next = $1;
                          tmp->next = $1;
                          tmp->spec = $3;
                          tmp->spec = $3;
                          $$ = tmp;
                          $$ = tmp;
                        }
                        }
        |
        |
                wildcard_spec
                wildcard_spec
                        {
                        {
                          struct wildcard_list *tmp;
                          struct wildcard_list *tmp;
                          tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
                          tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
                          tmp->next = NULL;
                          tmp->next = NULL;
                          tmp->spec = $1;
                          tmp->spec = $1;
                          $$ = tmp;
                          $$ = tmp;
                        }
                        }
        ;
        ;
input_section_spec_no_keep:
input_section_spec_no_keep:
                NAME
                NAME
                        {
                        {
                          struct wildcard_spec tmp;
                          struct wildcard_spec tmp;
                          tmp.name = $1;
                          tmp.name = $1;
                          tmp.exclude_name_list = NULL;
                          tmp.exclude_name_list = NULL;
                          tmp.sorted = none;
                          tmp.sorted = none;
                          lang_add_wild (&tmp, NULL, ldgram_had_keep);
                          lang_add_wild (&tmp, NULL, ldgram_had_keep);
                        }
                        }
        |       '[' file_NAME_list ']'
        |       '[' file_NAME_list ']'
                        {
                        {
                          lang_add_wild (NULL, $2, ldgram_had_keep);
                          lang_add_wild (NULL, $2, ldgram_had_keep);
                        }
                        }
        |       wildcard_spec '(' file_NAME_list ')'
        |       wildcard_spec '(' file_NAME_list ')'
                        {
                        {
                          lang_add_wild (&$1, $3, ldgram_had_keep);
                          lang_add_wild (&$1, $3, ldgram_had_keep);
                        }
                        }
        ;
        ;
input_section_spec:
input_section_spec:
                input_section_spec_no_keep
                input_section_spec_no_keep
        |       KEEP '('
        |       KEEP '('
                        { ldgram_had_keep = TRUE; }
                        { ldgram_had_keep = TRUE; }
                input_section_spec_no_keep ')'
                input_section_spec_no_keep ')'
                        { ldgram_had_keep = FALSE; }
                        { ldgram_had_keep = FALSE; }
        ;
        ;
statement:
statement:
                assignment end
                assignment end
        |       CREATE_OBJECT_SYMBOLS
        |       CREATE_OBJECT_SYMBOLS
                {
                {
                lang_add_attribute(lang_object_symbols_statement_enum);
                lang_add_attribute(lang_object_symbols_statement_enum);
                }
                }
        |       ';'
        |       ';'
        |       CONSTRUCTORS
        |       CONSTRUCTORS
                {
                {
                  lang_add_attribute(lang_constructors_statement_enum);
                  lang_add_attribute(lang_constructors_statement_enum);
                }
                }
        | SORT_BY_NAME '(' CONSTRUCTORS ')'
        | SORT_BY_NAME '(' CONSTRUCTORS ')'
                {
                {
                  constructors_sorted = TRUE;
                  constructors_sorted = TRUE;
                  lang_add_attribute (lang_constructors_statement_enum);
                  lang_add_attribute (lang_constructors_statement_enum);
                }
                }
        | input_section_spec
        | input_section_spec
        | length '(' mustbe_exp ')'
        | length '(' mustbe_exp ')'
                        {
                        {
                          lang_add_data ((int) $1, $3);
                          lang_add_data ((int) $1, $3);
                        }
                        }
        | FILL '(' fill_exp ')'
        | FILL '(' fill_exp ')'
                        {
                        {
                          lang_add_fill ($3);
                          lang_add_fill ($3);
                        }
                        }
        | ASSERT_K  {ldlex_expression ();} '(' exp ',' NAME ')' end
        | ASSERT_K  {ldlex_expression ();} '(' exp ',' NAME ')' end
                        { ldlex_popstate ();
                        { ldlex_popstate ();
                          lang_add_assignment (exp_assert ($4, $6)); }
                          lang_add_assignment (exp_assert ($4, $6)); }
        ;
        ;
statement_list:
statement_list:
                statement_list statement
                statement_list statement
        |       statement
        |       statement
        ;
        ;
statement_list_opt:
statement_list_opt:
                /* empty */
                /* empty */
        |       statement_list
        |       statement_list
        ;
        ;
length:
length:
                QUAD
                QUAD
                        { $$ = $1; }
                        { $$ = $1; }
        |       SQUAD
        |       SQUAD
                        { $$ = $1; }
                        { $$ = $1; }
        |       LONG
        |       LONG
                        { $$ = $1; }
                        { $$ = $1; }
        |       SHORT
        |       SHORT
                        { $$ = $1; }
                        { $$ = $1; }
        |       BYTE
        |       BYTE
                        { $$ = $1; }
                        { $$ = $1; }
        ;
        ;
fill_exp:
fill_exp:
        mustbe_exp
        mustbe_exp
                {
                {
                  $$ = exp_get_fill ($1, 0, "fill value");
                  $$ = exp_get_fill ($1, 0, "fill value");
                }
                }
        ;
        ;
fill_opt:
fill_opt:
          '=' fill_exp
          '=' fill_exp
                { $$ = $2; }
                { $$ = $2; }
        |       { $$ = (fill_type *) 0; }
        |       { $$ = (fill_type *) 0; }
        ;
        ;
assign_op:
assign_op:
                PLUSEQ
                PLUSEQ
                        { $$ = '+'; }
                        { $$ = '+'; }
        |       MINUSEQ
        |       MINUSEQ
                        { $$ = '-'; }
                        { $$ = '-'; }
        |       MULTEQ
        |       MULTEQ
                        { $$ = '*'; }
                        { $$ = '*'; }
        |       DIVEQ
        |       DIVEQ
                        { $$ = '/'; }
                        { $$ = '/'; }
        |       LSHIFTEQ
        |       LSHIFTEQ
                        { $$ = LSHIFT; }
                        { $$ = LSHIFT; }
        |       RSHIFTEQ
        |       RSHIFTEQ
                        { $$ = RSHIFT; }
                        { $$ = RSHIFT; }
        |       ANDEQ
        |       ANDEQ
                        { $$ = '&'; }
                        { $$ = '&'; }
        |       OREQ
        |       OREQ
                        { $$ = '|'; }
                        { $$ = '|'; }
        ;
        ;
end:    ';' | ','
end:    ';' | ','
        ;
        ;
assignment:
assignment:
                NAME '=' mustbe_exp
                NAME '=' mustbe_exp
                {
                {
                  lang_add_assignment (exp_assop ($2, $1, $3));
                  lang_add_assignment (exp_assop ($2, $1, $3));
                }
                }
        |       NAME assign_op mustbe_exp
        |       NAME assign_op mustbe_exp
                {
                {
                  lang_add_assignment (exp_assop ('=', $1,
                  lang_add_assignment (exp_assop ('=', $1,
                                                  exp_binop ($2,
                                                  exp_binop ($2,
                                                             exp_nameop (NAME,
                                                             exp_nameop (NAME,
                                                                         $1),
                                                                         $1),
                                                             $3)));
                                                             $3)));
                }
                }
        |       PROVIDE '(' NAME '=' mustbe_exp ')'
        |       PROVIDE '(' NAME '=' mustbe_exp ')'
                {
                {
                  lang_add_assignment (exp_provide ($3, $5, FALSE));
                  lang_add_assignment (exp_provide ($3, $5, FALSE));
                }
                }
        |       PROVIDE_HIDDEN '(' NAME '=' mustbe_exp ')'
        |       PROVIDE_HIDDEN '(' NAME '=' mustbe_exp ')'
                {
                {
                  lang_add_assignment (exp_provide ($3, $5, TRUE));
                  lang_add_assignment (exp_provide ($3, $5, TRUE));
                }
                }
        ;
        ;
opt_comma:
opt_comma:
                ','     |       ;
                ','     |       ;
memory:
memory:
                MEMORY '{' memory_spec memory_spec_list '}'
                MEMORY '{' memory_spec memory_spec_list '}'
        ;
        ;
memory_spec_list:
memory_spec_list:
                memory_spec_list memory_spec
                memory_spec_list memory_spec
        |       memory_spec_list ',' memory_spec
        |       memory_spec_list ',' memory_spec
        |
        |
        ;
        ;
memory_spec:    NAME
memory_spec:    NAME
                { region = lang_memory_region_lookup ($1, TRUE); }
                { region = lang_memory_region_lookup ($1, TRUE); }
                attributes_opt ':'
                attributes_opt ':'
                origin_spec opt_comma length_spec
                origin_spec opt_comma length_spec
                {}
                {}
        ;
        ;
origin_spec:
origin_spec:
        ORIGIN '=' mustbe_exp
        ORIGIN '=' mustbe_exp
                {
                {
                  region->origin = exp_get_vma ($3, 0, "origin");
                  region->origin = exp_get_vma ($3, 0, "origin");
                  region->current = region->origin;
                  region->current = region->origin;
                }
                }
        ;
        ;
length_spec:
length_spec:
             LENGTH '=' mustbe_exp
             LENGTH '=' mustbe_exp
                {
                {
                  region->length = exp_get_vma ($3, -1, "length");
                  region->length = exp_get_vma ($3, -1, "length");
                }
                }
        ;
        ;
attributes_opt:
attributes_opt:
                /* empty */
                /* empty */
                  { /* dummy action to avoid bison 1.25 error message */ }
                  { /* dummy action to avoid bison 1.25 error message */ }
        |       '(' attributes_list ')'
        |       '(' attributes_list ')'
        ;
        ;
attributes_list:
attributes_list:
                attributes_string
                attributes_string
        |       attributes_list attributes_string
        |       attributes_list attributes_string
        ;
        ;
attributes_string:
attributes_string:
                NAME
                NAME
                  { lang_set_flags (region, $1, 0); }
                  { lang_set_flags (region, $1, 0); }
        |       '!' NAME
        |       '!' NAME
                  { lang_set_flags (region, $2, 1); }
                  { lang_set_flags (region, $2, 1); }
        ;
        ;
startup:
startup:
        STARTUP '(' filename ')'
        STARTUP '(' filename ')'
                { lang_startup($3); }
                { lang_startup($3); }
        ;
        ;
high_level_library:
high_level_library:
                HLL '(' high_level_library_NAME_list ')'
                HLL '(' high_level_library_NAME_list ')'
        |       HLL '(' ')'
        |       HLL '(' ')'
                        { ldemul_hll((char *)NULL); }
                        { ldemul_hll((char *)NULL); }
        ;
        ;
high_level_library_NAME_list:
high_level_library_NAME_list:
                high_level_library_NAME_list opt_comma filename
                high_level_library_NAME_list opt_comma filename
                        { ldemul_hll($3); }
                        { ldemul_hll($3); }
        |       filename
        |       filename
                        { ldemul_hll($1); }
                        { ldemul_hll($1); }
        ;
        ;
low_level_library:
low_level_library:
        SYSLIB '(' low_level_library_NAME_list ')'
        SYSLIB '(' low_level_library_NAME_list ')'
        ; low_level_library_NAME_list:
        ; low_level_library_NAME_list:
                low_level_library_NAME_list opt_comma filename
                low_level_library_NAME_list opt_comma filename
                        { ldemul_syslib($3); }
                        { ldemul_syslib($3); }
        |
        |
        ;
        ;
floating_point_support:
floating_point_support:
                FLOAT
                FLOAT
                        { lang_float(TRUE); }
                        { lang_float(TRUE); }
        |       NOFLOAT
        |       NOFLOAT
                        { lang_float(FALSE); }
                        { lang_float(FALSE); }
        ;
        ;
nocrossref_list:
nocrossref_list:
                /* empty */
                /* empty */
                {
                {
                  $$ = NULL;
                  $$ = NULL;
                }
                }
        |       NAME nocrossref_list
        |       NAME nocrossref_list
                {
                {
                  struct lang_nocrossref *n;
                  struct lang_nocrossref *n;
                  n = (struct lang_nocrossref *) xmalloc (sizeof *n);
                  n = (struct lang_nocrossref *) xmalloc (sizeof *n);
                  n->name = $1;
                  n->name = $1;
                  n->next = $2;
                  n->next = $2;
                  $$ = n;
                  $$ = n;
                }
                }
        |       NAME ',' nocrossref_list
        |       NAME ',' nocrossref_list
                {
                {
                  struct lang_nocrossref *n;
                  struct lang_nocrossref *n;
                  n = (struct lang_nocrossref *) xmalloc (sizeof *n);
                  n = (struct lang_nocrossref *) xmalloc (sizeof *n);
                  n->name = $1;
                  n->name = $1;
                  n->next = $3;
                  n->next = $3;
                  $$ = n;
                  $$ = n;
                }
                }
        ;
        ;
mustbe_exp:              { ldlex_expression (); }
mustbe_exp:              { ldlex_expression (); }
                exp
                exp
                         { ldlex_popstate (); $$=$2;}
                         { ldlex_popstate (); $$=$2;}
        ;
        ;
exp     :
exp     :
                '-' exp %prec UNARY
                '-' exp %prec UNARY
                        { $$ = exp_unop ('-', $2); }
                        { $$ = exp_unop ('-', $2); }
        |       '(' exp ')'
        |       '(' exp ')'
                        { $$ = $2; }
                        { $$ = $2; }
        |       NEXT '(' exp ')' %prec UNARY
        |       NEXT '(' exp ')' %prec UNARY
                        { $$ = exp_unop ((int) $1,$3); }
                        { $$ = exp_unop ((int) $1,$3); }
        |       '!' exp %prec UNARY
        |       '!' exp %prec UNARY
                        { $$ = exp_unop ('!', $2); }
                        { $$ = exp_unop ('!', $2); }
        |       '+' exp %prec UNARY
        |       '+' exp %prec UNARY
                        { $$ = $2; }
                        { $$ = $2; }
        |       '~' exp %prec UNARY
        |       '~' exp %prec UNARY
                        { $$ = exp_unop ('~', $2);}
                        { $$ = exp_unop ('~', $2);}
        |       exp '*' exp
        |       exp '*' exp
                        { $$ = exp_binop ('*', $1, $3); }
                        { $$ = exp_binop ('*', $1, $3); }
        |       exp '/' exp
        |       exp '/' exp
                        { $$ = exp_binop ('/', $1, $3); }
                        { $$ = exp_binop ('/', $1, $3); }
        |       exp '%' exp
        |       exp '%' exp
                        { $$ = exp_binop ('%', $1, $3); }
                        { $$ = exp_binop ('%', $1, $3); }
        |       exp '+' exp
        |       exp '+' exp
                        { $$ = exp_binop ('+', $1, $3); }
                        { $$ = exp_binop ('+', $1, $3); }
        |       exp '-' exp
        |       exp '-' exp
                        { $$ = exp_binop ('-' , $1, $3); }
                        { $$ = exp_binop ('-' , $1, $3); }
        |       exp LSHIFT exp
        |       exp LSHIFT exp
                        { $$ = exp_binop (LSHIFT , $1, $3); }
                        { $$ = exp_binop (LSHIFT , $1, $3); }
        |       exp RSHIFT exp
        |       exp RSHIFT exp
                        { $$ = exp_binop (RSHIFT , $1, $3); }
                        { $$ = exp_binop (RSHIFT , $1, $3); }
        |       exp EQ exp
        |       exp EQ exp
                        { $$ = exp_binop (EQ , $1, $3); }
                        { $$ = exp_binop (EQ , $1, $3); }
        |       exp NE exp
        |       exp NE exp
                        { $$ = exp_binop (NE , $1, $3); }
                        { $$ = exp_binop (NE , $1, $3); }
        |       exp LE exp
        |       exp LE exp
                        { $$ = exp_binop (LE , $1, $3); }
                        { $$ = exp_binop (LE , $1, $3); }
        |       exp GE exp
        |       exp GE exp
                        { $$ = exp_binop (GE , $1, $3); }
                        { $$ = exp_binop (GE , $1, $3); }
        |       exp '<' exp
        |       exp '<' exp
                        { $$ = exp_binop ('<' , $1, $3); }
                        { $$ = exp_binop ('<' , $1, $3); }
        |       exp '>' exp
        |       exp '>' exp
                        { $$ = exp_binop ('>' , $1, $3); }
                        { $$ = exp_binop ('>' , $1, $3); }
        |       exp '&' exp
        |       exp '&' exp
                        { $$ = exp_binop ('&' , $1, $3); }
                        { $$ = exp_binop ('&' , $1, $3); }
        |       exp '^' exp
        |       exp '^' exp
                        { $$ = exp_binop ('^' , $1, $3); }
                        { $$ = exp_binop ('^' , $1, $3); }
        |       exp '|' exp
        |       exp '|' exp
                        { $$ = exp_binop ('|' , $1, $3); }
                        { $$ = exp_binop ('|' , $1, $3); }
        |       exp '?' exp ':' exp
        |       exp '?' exp ':' exp
                        { $$ = exp_trinop ('?' , $1, $3, $5); }
                        { $$ = exp_trinop ('?' , $1, $3, $5); }
        |       exp ANDAND exp
        |       exp ANDAND exp
                        { $$ = exp_binop (ANDAND , $1, $3); }
                        { $$ = exp_binop (ANDAND , $1, $3); }
        |       exp OROR exp
        |       exp OROR exp
                        { $$ = exp_binop (OROR , $1, $3); }
                        { $$ = exp_binop (OROR , $1, $3); }
        |       DEFINED '(' NAME ')'
        |       DEFINED '(' NAME ')'
                        { $$ = exp_nameop (DEFINED, $3); }
                        { $$ = exp_nameop (DEFINED, $3); }
        |       INT
        |       INT
                        { $$ = exp_bigintop ($1.integer, $1.str); }
                        { $$ = exp_bigintop ($1.integer, $1.str); }
        |       SIZEOF_HEADERS
        |       SIZEOF_HEADERS
                        { $$ = exp_nameop (SIZEOF_HEADERS,0); }
                        { $$ = exp_nameop (SIZEOF_HEADERS,0); }
        |       ALIGNOF '(' NAME ')'
        |       ALIGNOF '(' NAME ')'
                        { $$ = exp_nameop (ALIGNOF,$3); }
                        { $$ = exp_nameop (ALIGNOF,$3); }
        |       SIZEOF '(' NAME ')'
        |       SIZEOF '(' NAME ')'
                        { $$ = exp_nameop (SIZEOF,$3); }
                        { $$ = exp_nameop (SIZEOF,$3); }
        |       ADDR '(' NAME ')'
        |       ADDR '(' NAME ')'
                        { $$ = exp_nameop (ADDR,$3); }
                        { $$ = exp_nameop (ADDR,$3); }
        |       LOADADDR '(' NAME ')'
        |       LOADADDR '(' NAME ')'
                        { $$ = exp_nameop (LOADADDR,$3); }
                        { $$ = exp_nameop (LOADADDR,$3); }
        |       CONSTANT '(' NAME ')'
        |       CONSTANT '(' NAME ')'
                        { $$ = exp_nameop (CONSTANT,$3); }
                        { $$ = exp_nameop (CONSTANT,$3); }
        |       ABSOLUTE '(' exp ')'
        |       ABSOLUTE '(' exp ')'
                        { $$ = exp_unop (ABSOLUTE, $3); }
                        { $$ = exp_unop (ABSOLUTE, $3); }
        |       ALIGN_K '(' exp ')'
        |       ALIGN_K '(' exp ')'
                        { $$ = exp_unop (ALIGN_K,$3); }
                        { $$ = exp_unop (ALIGN_K,$3); }
        |       ALIGN_K '(' exp ',' exp ')'
        |       ALIGN_K '(' exp ',' exp ')'
                        { $$ = exp_binop (ALIGN_K,$3,$5); }
                        { $$ = exp_binop (ALIGN_K,$3,$5); }
        |       DATA_SEGMENT_ALIGN '(' exp ',' exp ')'
        |       DATA_SEGMENT_ALIGN '(' exp ',' exp ')'
                        { $$ = exp_binop (DATA_SEGMENT_ALIGN, $3, $5); }
                        { $$ = exp_binop (DATA_SEGMENT_ALIGN, $3, $5); }
        |       DATA_SEGMENT_RELRO_END '(' exp ',' exp ')'
        |       DATA_SEGMENT_RELRO_END '(' exp ',' exp ')'
                        { $$ = exp_binop (DATA_SEGMENT_RELRO_END, $5, $3); }
                        { $$ = exp_binop (DATA_SEGMENT_RELRO_END, $5, $3); }
        |       DATA_SEGMENT_END '(' exp ')'
        |       DATA_SEGMENT_END '(' exp ')'
                        { $$ = exp_unop (DATA_SEGMENT_END, $3); }
                        { $$ = exp_unop (DATA_SEGMENT_END, $3); }
        |       SEGMENT_START '(' NAME ',' exp ')'
        |       SEGMENT_START '(' NAME ',' exp ')'
                        { /* The operands to the expression node are
                        { /* The operands to the expression node are
                             placed in the opposite order from the way
                             placed in the opposite order from the way
                             in which they appear in the script as
                             in which they appear in the script as
                             that allows us to reuse more code in
                             that allows us to reuse more code in
                             fold_binary.  */
                             fold_binary.  */
                          $$ = exp_binop (SEGMENT_START,
                          $$ = exp_binop (SEGMENT_START,
                                          $5,
                                          $5,
                                          exp_nameop (NAME, $3)); }
                                          exp_nameop (NAME, $3)); }
        |       BLOCK '(' exp ')'
        |       BLOCK '(' exp ')'
                        { $$ = exp_unop (ALIGN_K,$3); }
                        { $$ = exp_unop (ALIGN_K,$3); }
        |       NAME
        |       NAME
                        { $$ = exp_nameop (NAME,$1); }
                        { $$ = exp_nameop (NAME,$1); }
        |       MAX_K '(' exp ',' exp ')'
        |       MAX_K '(' exp ',' exp ')'
                        { $$ = exp_binop (MAX_K, $3, $5 ); }
                        { $$ = exp_binop (MAX_K, $3, $5 ); }
        |       MIN_K '(' exp ',' exp ')'
        |       MIN_K '(' exp ',' exp ')'
                        { $$ = exp_binop (MIN_K, $3, $5 ); }
                        { $$ = exp_binop (MIN_K, $3, $5 ); }
        |       ASSERT_K '(' exp ',' NAME ')'
        |       ASSERT_K '(' exp ',' NAME ')'
                        { $$ = exp_assert ($3, $5); }
                        { $$ = exp_assert ($3, $5); }
        |       ORIGIN '(' NAME ')'
        |       ORIGIN '(' NAME ')'
                        { $$ = exp_nameop (ORIGIN, $3); }
                        { $$ = exp_nameop (ORIGIN, $3); }
        |       LENGTH '(' NAME ')'
        |       LENGTH '(' NAME ')'
                        { $$ = exp_nameop (LENGTH, $3); }
                        { $$ = exp_nameop (LENGTH, $3); }
        ;
        ;
memspec_at_opt:
memspec_at_opt:
                AT '>' NAME { $$ = $3; }
                AT '>' NAME { $$ = $3; }
        |       { $$ = 0; }
        |       { $$ = 0; }
        ;
        ;
opt_at:
opt_at:
                AT '(' exp ')' { $$ = $3; }
                AT '(' exp ')' { $$ = $3; }
        |       { $$ = 0; }
        |       { $$ = 0; }
        ;
        ;
opt_align:
opt_align:
                ALIGN_K '(' exp ')' { $$ = $3; }
                ALIGN_K '(' exp ')' { $$ = $3; }
        |       { $$ = 0; }
        |       { $$ = 0; }
        ;
        ;
opt_subalign:
opt_subalign:
                SUBALIGN '(' exp ')' { $$ = $3; }
                SUBALIGN '(' exp ')' { $$ = $3; }
        |       { $$ = 0; }
        |       { $$ = 0; }
        ;
        ;
sect_constraint:
sect_constraint:
                ONLY_IF_RO { $$ = ONLY_IF_RO; }
                ONLY_IF_RO { $$ = ONLY_IF_RO; }
        |       ONLY_IF_RW { $$ = ONLY_IF_RW; }
        |       ONLY_IF_RW { $$ = ONLY_IF_RW; }
        |       SPECIAL { $$ = SPECIAL; }
        |       SPECIAL { $$ = SPECIAL; }
        |       { $$ = 0; }
        |       { $$ = 0; }
        ;
        ;
section:        NAME            { ldlex_expression(); }
section:        NAME            { ldlex_expression(); }
                opt_exp_with_type
                opt_exp_with_type
                opt_at
                opt_at
                opt_align
                opt_align
                opt_subalign    { ldlex_popstate (); ldlex_script (); }
                opt_subalign    { ldlex_popstate (); ldlex_script (); }
                sect_constraint
                sect_constraint
                '{'
                '{'
                        {
                        {
                          lang_enter_output_section_statement($1, $3,
                          lang_enter_output_section_statement($1, $3,
                                                              sectype,
                                                              sectype,
                                                              $5, $6, $4, $8);
                                                              $5, $6, $4, $8);
                        }
                        }
                statement_list_opt
                statement_list_opt
                '}' { ldlex_popstate (); ldlex_expression (); }
                '}' { ldlex_popstate (); ldlex_expression (); }
                memspec_opt memspec_at_opt phdr_opt fill_opt
                memspec_opt memspec_at_opt phdr_opt fill_opt
                {
                {
                  ldlex_popstate ();
                  ldlex_popstate ();
                  lang_leave_output_section_statement ($17, $14, $16, $15);
                  lang_leave_output_section_statement ($17, $14, $16, $15);
                }
                }
                opt_comma
                opt_comma
                {}
                {}
        |       OVERLAY
        |       OVERLAY
                        { ldlex_expression (); }
                        { ldlex_expression (); }
                opt_exp_without_type opt_nocrossrefs opt_at opt_subalign
                opt_exp_without_type opt_nocrossrefs opt_at opt_subalign
                        { ldlex_popstate (); ldlex_script (); }
                        { ldlex_popstate (); ldlex_script (); }
                '{'
                '{'
                        {
                        {
                          lang_enter_overlay ($3, $6);
                          lang_enter_overlay ($3, $6);
                        }
                        }
                overlay_section
                overlay_section
                '}'
                '}'
                        { ldlex_popstate (); ldlex_expression (); }
                        { ldlex_popstate (); ldlex_expression (); }
                memspec_opt memspec_at_opt phdr_opt fill_opt
                memspec_opt memspec_at_opt phdr_opt fill_opt
                        {
                        {
                          ldlex_popstate ();
                          ldlex_popstate ();
                          lang_leave_overlay ($5, (int) $4,
                          lang_leave_overlay ($5, (int) $4,
                                              $16, $13, $15, $14);
                                              $16, $13, $15, $14);
                        }
                        }
                opt_comma
                opt_comma
        |       /* The GROUP case is just enough to support the gcc
        |       /* The GROUP case is just enough to support the gcc
                   svr3.ifile script.  It is not intended to be full
                   svr3.ifile script.  It is not intended to be full
                   support.  I'm not even sure what GROUP is supposed
                   support.  I'm not even sure what GROUP is supposed
                   to mean.  */
                   to mean.  */
                GROUP { ldlex_expression (); }
                GROUP { ldlex_expression (); }
                opt_exp_with_type
                opt_exp_with_type
                {
                {
                  ldlex_popstate ();
                  ldlex_popstate ();
                  lang_add_assignment (exp_assop ('=', ".", $3));
                  lang_add_assignment (exp_assop ('=', ".", $3));
                }
                }
                '{' sec_or_group_p1 '}'
                '{' sec_or_group_p1 '}'
        ;
        ;
type:
type:
           NOLOAD  { sectype = noload_section; }
           NOLOAD  { sectype = noload_section; }
        |  DSECT   { sectype = noalloc_section; }
        |  DSECT   { sectype = noalloc_section; }
        |  COPY    { sectype = noalloc_section; }
        |  COPY    { sectype = noalloc_section; }
        |  INFO    { sectype = noalloc_section; }
        |  INFO    { sectype = noalloc_section; }
        |  OVERLAY { sectype = noalloc_section; }
        |  OVERLAY { sectype = noalloc_section; }
        ;
        ;
atype:
atype:
                '(' type ')'
                '(' type ')'
        |       /* EMPTY */ { sectype = normal_section; }
        |       /* EMPTY */ { sectype = normal_section; }
        |       '(' ')' { sectype = normal_section; }
        |       '(' ')' { sectype = normal_section; }
        ;
        ;
opt_exp_with_type:
opt_exp_with_type:
                exp atype ':'           { $$ = $1; }
                exp atype ':'           { $$ = $1; }
        |       atype ':'               { $$ = (etree_type *)NULL;  }
        |       atype ':'               { $$ = (etree_type *)NULL;  }
        |       /* The BIND cases are to support the gcc svr3.ifile
        |       /* The BIND cases are to support the gcc svr3.ifile
                   script.  They aren't intended to implement full
                   script.  They aren't intended to implement full
                   support for the BIND keyword.  I'm not even sure
                   support for the BIND keyword.  I'm not even sure
                   what BIND is supposed to mean.  */
                   what BIND is supposed to mean.  */
                BIND '(' exp ')' atype ':' { $$ = $3; }
                BIND '(' exp ')' atype ':' { $$ = $3; }
        |       BIND '(' exp ')' BLOCK '(' exp ')' atype ':'
        |       BIND '(' exp ')' BLOCK '(' exp ')' atype ':'
                { $$ = $3; }
                { $$ = $3; }
        ;
        ;
opt_exp_without_type:
opt_exp_without_type:
                exp ':'         { $$ = $1; }
                exp ':'         { $$ = $1; }
        |       ':'             { $$ = (etree_type *) NULL;  }
        |       ':'             { $$ = (etree_type *) NULL;  }
        ;
        ;
opt_nocrossrefs:
opt_nocrossrefs:
                /* empty */
                /* empty */
                        { $$ = 0; }
                        { $$ = 0; }
        |       NOCROSSREFS
        |       NOCROSSREFS
                        { $$ = 1; }
                        { $$ = 1; }
        ;
        ;
memspec_opt:
memspec_opt:
                '>' NAME
                '>' NAME
                { $$ = $2; }
                { $$ = $2; }
        |       { $$ = DEFAULT_MEMORY_REGION; }
        |       { $$ = DEFAULT_MEMORY_REGION; }
        ;
        ;
phdr_opt:
phdr_opt:
                /* empty */
                /* empty */
                {
                {
                  $$ = NULL;
                  $$ = NULL;
                }
                }
        |       phdr_opt ':' NAME
        |       phdr_opt ':' NAME
                {
                {
                  struct lang_output_section_phdr_list *n;
                  struct lang_output_section_phdr_list *n;
                  n = ((struct lang_output_section_phdr_list *)
                  n = ((struct lang_output_section_phdr_list *)
                       xmalloc (sizeof *n));
                       xmalloc (sizeof *n));
                  n->name = $3;
                  n->name = $3;
                  n->used = FALSE;
                  n->used = FALSE;
                  n->next = $1;
                  n->next = $1;
                  $$ = n;
                  $$ = n;
                }
                }
        ;
        ;
overlay_section:
overlay_section:
                /* empty */
                /* empty */
        |       overlay_section
        |       overlay_section
                NAME
                NAME
                        {
                        {
                          ldlex_script ();
                          ldlex_script ();
                          lang_enter_overlay_section ($2);
                          lang_enter_overlay_section ($2);
                        }
                        }
                '{' statement_list_opt '}'
                '{' statement_list_opt '}'
                        { ldlex_popstate (); ldlex_expression (); }
                        { ldlex_popstate (); ldlex_expression (); }
                phdr_opt fill_opt
                phdr_opt fill_opt
                        {
                        {
                          ldlex_popstate ();
                          ldlex_popstate ();
                          lang_leave_overlay_section ($9, $8);
                          lang_leave_overlay_section ($9, $8);
                        }
                        }
                opt_comma
                opt_comma
        ;
        ;
phdrs:
phdrs:
                PHDRS '{' phdr_list '}'
                PHDRS '{' phdr_list '}'
        ;
        ;
phdr_list:
phdr_list:
                /* empty */
                /* empty */
        |       phdr_list phdr
        |       phdr_list phdr
        ;
        ;
phdr:
phdr:
                NAME { ldlex_expression (); }
                NAME { ldlex_expression (); }
                  phdr_type phdr_qualifiers { ldlex_popstate (); }
                  phdr_type phdr_qualifiers { ldlex_popstate (); }
                  ';'
                  ';'
                {
                {
                  lang_new_phdr ($1, $3, $4.filehdr, $4.phdrs, $4.at,
                  lang_new_phdr ($1, $3, $4.filehdr, $4.phdrs, $4.at,
                                 $4.flags);
                                 $4.flags);
                }
                }
        ;
        ;
phdr_type:
phdr_type:
                exp
                exp
                {
                {
                  $$ = $1;
                  $$ = $1;
                  if ($1->type.node_class == etree_name
                  if ($1->type.node_class == etree_name
                      && $1->type.node_code == NAME)
                      && $1->type.node_code == NAME)
                    {
                    {
                      const char *s;
                      const char *s;
                      unsigned int i;
                      unsigned int i;
                      static const char * const phdr_types[] =
                      static const char * const phdr_types[] =
                        {
                        {
                          "PT_NULL", "PT_LOAD", "PT_DYNAMIC",
                          "PT_NULL", "PT_LOAD", "PT_DYNAMIC",
                          "PT_INTERP", "PT_NOTE", "PT_SHLIB",
                          "PT_INTERP", "PT_NOTE", "PT_SHLIB",
                          "PT_PHDR", "PT_TLS"
                          "PT_PHDR", "PT_TLS"
                        };
                        };
                      s = $1->name.name;
                      s = $1->name.name;
                      for (i = 0;
                      for (i = 0;
                           i < sizeof phdr_types / sizeof phdr_types[0];
                           i < sizeof phdr_types / sizeof phdr_types[0];
                           i++)
                           i++)
                        if (strcmp (s, phdr_types[i]) == 0)
                        if (strcmp (s, phdr_types[i]) == 0)
                          {
                          {
                            $$ = exp_intop (i);
                            $$ = exp_intop (i);
                            break;
                            break;
                          }
                          }
                      if (i == sizeof phdr_types / sizeof phdr_types[0])
                      if (i == sizeof phdr_types / sizeof phdr_types[0])
                        {
                        {
                          if (strcmp (s, "PT_GNU_EH_FRAME") == 0)
                          if (strcmp (s, "PT_GNU_EH_FRAME") == 0)
                            $$ = exp_intop (0x6474e550);
                            $$ = exp_intop (0x6474e550);
                          else if (strcmp (s, "PT_GNU_STACK") == 0)
                          else if (strcmp (s, "PT_GNU_STACK") == 0)
                            $$ = exp_intop (0x6474e551);
                            $$ = exp_intop (0x6474e551);
                          else
                          else
                            {
                            {
                              einfo (_("\
                              einfo (_("\
%X%P:%S: unknown phdr type `%s' (try integer literal)\n"),
%X%P:%S: unknown phdr type `%s' (try integer literal)\n"),
                                     s);
                                     s);
                              $$ = exp_intop (0);
                              $$ = exp_intop (0);
                            }
                            }
                        }
                        }
                    }
                    }
                }
                }
        ;
        ;
phdr_qualifiers:
phdr_qualifiers:
                /* empty */
                /* empty */
                {
                {
                  memset (&$$, 0, sizeof (struct phdr_info));
                  memset (&$$, 0, sizeof (struct phdr_info));
                }
                }
        |       NAME phdr_val phdr_qualifiers
        |       NAME phdr_val phdr_qualifiers
                {
                {
                  $$ = $3;
                  $$ = $3;
                  if (strcmp ($1, "FILEHDR") == 0 && $2 == NULL)
                  if (strcmp ($1, "FILEHDR") == 0 && $2 == NULL)
                    $$.filehdr = TRUE;
                    $$.filehdr = TRUE;
                  else if (strcmp ($1, "PHDRS") == 0 && $2 == NULL)
                  else if (strcmp ($1, "PHDRS") == 0 && $2 == NULL)
                    $$.phdrs = TRUE;
                    $$.phdrs = TRUE;
                  else if (strcmp ($1, "FLAGS") == 0 && $2 != NULL)
                  else if (strcmp ($1, "FLAGS") == 0 && $2 != NULL)
                    $$.flags = $2;
                    $$.flags = $2;
                  else
                  else
                    einfo (_("%X%P:%S: PHDRS syntax error at `%s'\n"), $1);
                    einfo (_("%X%P:%S: PHDRS syntax error at `%s'\n"), $1);
                }
                }
        |       AT '(' exp ')' phdr_qualifiers
        |       AT '(' exp ')' phdr_qualifiers
                {
                {
                  $$ = $5;
                  $$ = $5;
                  $$.at = $3;
                  $$.at = $3;
                }
                }
        ;
        ;
phdr_val:
phdr_val:
                /* empty */
                /* empty */
                {
                {
                  $$ = NULL;
                  $$ = NULL;
                }
                }
        | '(' exp ')'
        | '(' exp ')'
                {
                {
                  $$ = $2;
                  $$ = $2;
                }
                }
        ;
        ;
dynamic_list_file:
dynamic_list_file:
                {
                {
                  ldlex_version_file ();
                  ldlex_version_file ();
                  PUSH_ERROR (_("dynamic list"));
                  PUSH_ERROR (_("dynamic list"));
                }
                }
                dynamic_list_nodes
                dynamic_list_nodes
                {
                {
                  ldlex_popstate ();
                  ldlex_popstate ();
                  POP_ERROR ();
                  POP_ERROR ();
                }
                }
        ;
        ;
dynamic_list_nodes:
dynamic_list_nodes:
                dynamic_list_node
                dynamic_list_node
        |       dynamic_list_nodes dynamic_list_node
        |       dynamic_list_nodes dynamic_list_node
        ;
        ;
dynamic_list_node:
dynamic_list_node:
                '{' dynamic_list_tag '}' ';'
                '{' dynamic_list_tag '}' ';'
        ;
        ;
dynamic_list_tag:
dynamic_list_tag:
                vers_defns ';'
                vers_defns ';'
                {
                {
                  lang_append_dynamic_list ($1);
                  lang_append_dynamic_list ($1);
                }
                }
        ;
        ;
/* This syntax is used within an external version script file.  */
/* This syntax is used within an external version script file.  */
version_script_file:
version_script_file:
                {
                {
                  ldlex_version_file ();
                  ldlex_version_file ();
                  PUSH_ERROR (_("VERSION script"));
                  PUSH_ERROR (_("VERSION script"));
                }
                }
                vers_nodes
                vers_nodes
                {
                {
                  ldlex_popstate ();
                  ldlex_popstate ();
                  POP_ERROR ();
                  POP_ERROR ();
                }
                }
        ;
        ;
/* This is used within a normal linker script file.  */
/* This is used within a normal linker script file.  */
version:
version:
                {
                {
                  ldlex_version_script ();
                  ldlex_version_script ();
                }
                }
                VERSIONK '{' vers_nodes '}'
                VERSIONK '{' vers_nodes '}'
                {
                {
                  ldlex_popstate ();
                  ldlex_popstate ();
                }
                }
        ;
        ;
vers_nodes:
vers_nodes:
                vers_node
                vers_node
        |       vers_nodes vers_node
        |       vers_nodes vers_node
        ;
        ;
vers_node:
vers_node:
                '{' vers_tag '}' ';'
                '{' vers_tag '}' ';'
                {
                {
                  lang_register_vers_node (NULL, $2, NULL);
                  lang_register_vers_node (NULL, $2, NULL);
                }
                }
        |       VERS_TAG '{' vers_tag '}' ';'
        |       VERS_TAG '{' vers_tag '}' ';'
                {
                {
                  lang_register_vers_node ($1, $3, NULL);
                  lang_register_vers_node ($1, $3, NULL);
                }
                }
        |       VERS_TAG '{' vers_tag '}' verdep ';'
        |       VERS_TAG '{' vers_tag '}' verdep ';'
                {
                {
                  lang_register_vers_node ($1, $3, $5);
                  lang_register_vers_node ($1, $3, $5);
                }
                }
        ;
        ;
verdep:
verdep:
                VERS_TAG
                VERS_TAG
                {
                {
                  $$ = lang_add_vers_depend (NULL, $1);
                  $$ = lang_add_vers_depend (NULL, $1);
                }
                }
        |       verdep VERS_TAG
        |       verdep VERS_TAG
                {
                {
                  $$ = lang_add_vers_depend ($1, $2);
                  $$ = lang_add_vers_depend ($1, $2);
                }
                }
        ;
        ;
vers_tag:
vers_tag:
                /* empty */
                /* empty */
                {
                {
                  $$ = lang_new_vers_node (NULL, NULL);
                  $$ = lang_new_vers_node (NULL, NULL);
                }
                }
        |       vers_defns ';'
        |       vers_defns ';'
                {
                {
                  $$ = lang_new_vers_node ($1, NULL);
                  $$ = lang_new_vers_node ($1, NULL);
                }
                }
        |       GLOBAL ':' vers_defns ';'
        |       GLOBAL ':' vers_defns ';'
                {
                {
                  $$ = lang_new_vers_node ($3, NULL);
                  $$ = lang_new_vers_node ($3, NULL);
                }
                }
        |       LOCAL ':' vers_defns ';'
        |       LOCAL ':' vers_defns ';'
                {
                {
                  $$ = lang_new_vers_node (NULL, $3);
                  $$ = lang_new_vers_node (NULL, $3);
                }
                }
        |       GLOBAL ':' vers_defns ';' LOCAL ':' vers_defns ';'
        |       GLOBAL ':' vers_defns ';' LOCAL ':' vers_defns ';'
                {
                {
                  $$ = lang_new_vers_node ($3, $7);
                  $$ = lang_new_vers_node ($3, $7);
                }
                }
        ;
        ;
vers_defns:
vers_defns:
                VERS_IDENTIFIER
                VERS_IDENTIFIER
                {
                {
                  $$ = lang_new_vers_pattern (NULL, $1, ldgram_vers_current_lang, FALSE);
                  $$ = lang_new_vers_pattern (NULL, $1, ldgram_vers_current_lang, FALSE);
                }
                }
        |       NAME
        |       NAME
                {
                {
                  $$ = lang_new_vers_pattern (NULL, $1, ldgram_vers_current_lang, TRUE);
                  $$ = lang_new_vers_pattern (NULL, $1, ldgram_vers_current_lang, TRUE);
                }
                }
        |       vers_defns ';' VERS_IDENTIFIER
        |       vers_defns ';' VERS_IDENTIFIER
                {
                {
                  $$ = lang_new_vers_pattern ($1, $3, ldgram_vers_current_lang, FALSE);
                  $$ = lang_new_vers_pattern ($1, $3, ldgram_vers_current_lang, FALSE);
                }
                }
        |       vers_defns ';' NAME
        |       vers_defns ';' NAME
                {
                {
                  $$ = lang_new_vers_pattern ($1, $3, ldgram_vers_current_lang, TRUE);
                  $$ = lang_new_vers_pattern ($1, $3, ldgram_vers_current_lang, TRUE);
                }
                }
        |       vers_defns ';' EXTERN NAME '{'
        |       vers_defns ';' EXTERN NAME '{'
                        {
                        {
                          $$ = ldgram_vers_current_lang;
                          $$ = ldgram_vers_current_lang;
                          ldgram_vers_current_lang = $4;
                          ldgram_vers_current_lang = $4;
                        }
                        }
                vers_defns opt_semicolon '}'
                vers_defns opt_semicolon '}'
                        {
                        {
                          struct bfd_elf_version_expr *pat;
                          struct bfd_elf_version_expr *pat;
                          for (pat = $7; pat->next != NULL; pat = pat->next);
                          for (pat = $7; pat->next != NULL; pat = pat->next);
                          pat->next = $1;
                          pat->next = $1;
                          $$ = $7;
                          $$ = $7;
                          ldgram_vers_current_lang = $6;
                          ldgram_vers_current_lang = $6;
                        }
                        }
        |       EXTERN NAME '{'
        |       EXTERN NAME '{'
                        {
                        {
                          $$ = ldgram_vers_current_lang;
                          $$ = ldgram_vers_current_lang;
                          ldgram_vers_current_lang = $2;
                          ldgram_vers_current_lang = $2;
                        }
                        }
                vers_defns opt_semicolon '}'
                vers_defns opt_semicolon '}'
                        {
                        {
                          $$ = $5;
                          $$ = $5;
                          ldgram_vers_current_lang = $4;
                          ldgram_vers_current_lang = $4;
                        }
                        }
        |       GLOBAL
        |       GLOBAL
                {
                {
                  $$ = lang_new_vers_pattern (NULL, "global", ldgram_vers_current_lang, FALSE);
                  $$ = lang_new_vers_pattern (NULL, "global", ldgram_vers_current_lang, FALSE);
                }
                }
        |       vers_defns ';' GLOBAL
        |       vers_defns ';' GLOBAL
                {
                {
                  $$ = lang_new_vers_pattern ($1, "global", ldgram_vers_current_lang, FALSE);
                  $$ = lang_new_vers_pattern ($1, "global", ldgram_vers_current_lang, FALSE);
                }
                }
        |       LOCAL
        |       LOCAL
                {
                {
                  $$ = lang_new_vers_pattern (NULL, "local", ldgram_vers_current_lang, FALSE);
                  $$ = lang_new_vers_pattern (NULL, "local", ldgram_vers_current_lang, FALSE);
                }
                }
        |       vers_defns ';' LOCAL
        |       vers_defns ';' LOCAL
                {
                {
                  $$ = lang_new_vers_pattern ($1, "local", ldgram_vers_current_lang, FALSE);
                  $$ = lang_new_vers_pattern ($1, "local", ldgram_vers_current_lang, FALSE);
                }
                }
        |       EXTERN
        |       EXTERN
                {
                {
                  $$ = lang_new_vers_pattern (NULL, "extern", ldgram_vers_current_lang, FALSE);
                  $$ = lang_new_vers_pattern (NULL, "extern", ldgram_vers_current_lang, FALSE);
                }
                }
        |       vers_defns ';' EXTERN
        |       vers_defns ';' EXTERN
                {
                {
                  $$ = lang_new_vers_pattern ($1, "extern", ldgram_vers_current_lang, FALSE);
                  $$ = lang_new_vers_pattern ($1, "extern", ldgram_vers_current_lang, FALSE);
                }
                }
        ;
        ;
opt_semicolon:
opt_semicolon:
                /* empty */
                /* empty */
        |       ';'
        |       ';'
        ;
        ;
%%
%%
void
void
yyerror(arg)
yyerror(arg)
     const char *arg;
     const char *arg;
{
{
  if (ldfile_assumed_script)
  if (ldfile_assumed_script)
    einfo (_("%P:%s: file format not recognized; treating as linker script\n"),
    einfo (_("%P:%s: file format not recognized; treating as linker script\n"),
           ldfile_input_filename);
           ldfile_input_filename);
  if (error_index > 0 && error_index < ERROR_NAME_MAX)
  if (error_index > 0 && error_index < ERROR_NAME_MAX)
     einfo ("%P%F:%S: %s in %s\n", arg, error_names[error_index-1]);
     einfo ("%P%F:%S: %s in %s\n", arg, error_names[error_index-1]);
  else
  else
     einfo ("%P%F:%S: %s\n", arg);
     einfo ("%P%F:%S: %s\n", arg);
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.