Ignore:
Timestamp:
Aug 16, 2003, 6:59:22 PM (22 years ago)
Author:
bird
Message:

binutils v2.14 - offical sources.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/GNU/src/binutils/ld/ldgram.y

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r608 r609  
    11/* A YACC grammar to parse a superset of the AT&T linker scripting language.
    22   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
    3    2001 Free Software Foundation, Inc.
     3   2001, 2002 Free Software Foundation, Inc.
    44   Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com).
    55
     
    3030#include "sysdep.h"
    3131#include "bfdlink.h"
    32 #include "ld.h"   
     32#include "ld.h"
    3333#include "ldexp.h"
    3434#include "ldver.h"
     
    5050lang_memory_region_type *region;
    5151
    52 struct wildcard_spec current_file;
    53 boolean ldgram_want_filename = true;
    54 boolean had_script = false;
    55 boolean force_make_executable = false;
    56 
    57 boolean ldgram_in_script = false;
    58 boolean ldgram_had_equals = false;
    59 boolean ldgram_had_keep = false;
     52bfd_boolean ldgram_want_filename = TRUE;
     53FILE *saved_script_handle = NULL;
     54bfd_boolean force_make_executable = FALSE;
     55
     56bfd_boolean ldgram_in_script = FALSE;
     57bfd_boolean ldgram_had_equals = FALSE;
     58bfd_boolean ldgram_had_keep = FALSE;
    6059char *ldgram_vers_current_lang = NULL;
    6160
     
    6867%union {
    6968  bfd_vma integer;
     69  struct big_int
     70    {
     71      bfd_vma integer;
     72      char *str;
     73    } bigint;
     74  fill_type *fill;
    7075  char *name;
    7176  const char *cname;
    7277  struct wildcard_spec wildcard;
     78  struct wildcard_list *wildcard_list;
    7379  struct name_list *name_list;
    7480  int token;
     
    7682  struct phdr_info
    7783    {
    78       boolean filehdr;
    79       boolean phdrs;
     84      bfd_boolean filehdr;
     85      bfd_boolean phdrs;
    8086      union etree_union *at;
    8187      union etree_union *flags;
     
    9096%type <etree> exp opt_exp_with_type mustbe_exp opt_at phdr_type phdr_val
    9197%type <etree> opt_exp_without_type
    92 %type <integer> fill_opt
     98%type <fill> fill_opt fill_exp
    9399%type <name_list> exclude_name_list
     100%type <wildcard_list> file_NAME_list
    94101%type <name> memspec_opt casesymlist
    95102%type <name> memspec_at_opt
    96103%type <cname> wildcard_name
    97104%type <wildcard> wildcard_spec
    98 %token <integer> INT 
     105%token <bigint> INT
    99106%token <name> NAME LNAME
    100107%type <integer> length
     
    104111%type <integer> opt_nocrossrefs
    105112
    106 %right <token> PLUSEQ MINUSEQ MULTEQ DIVEQ  '=' LSHIFTEQ RSHIFTEQ   ANDEQ OREQ 
     113%right <token> PLUSEQ MINUSEQ MULTEQ DIVEQ  '=' LSHIFTEQ RSHIFTEQ   ANDEQ OREQ
    107114%right <token> '?' ':'
    108115%left <token> OROR
     
    119126
    120127%right UNARY
    121 %token END 
     128%token END
    122129%left <token> '('
    123130%token <token> ALIGN_K BLOCK BIND QUAD SQUAD LONG SHORT BYTE
    124 %token SECTIONS PHDRS SORT
     131%token SECTIONS PHDRS SORT DATA_SEGMENT_ALIGN DATA_SEGMENT_END
    125132%token '{' '}'
    126133%token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH
     134%token INHIBIT_COMMON_ALLOCATION
    127135%token SIZEOF_HEADERS
    128136%token INCLUDE
     
    151159%%
    152160
    153 file:   
     161file:
    154162                INPUT_SCRIPT script_file
    155163        |       INPUT_MRI_SCRIPT mri_script_file
     
    169177                  lang_add_assignment(exp_assop($3,$2,$4));
    170178                }
    171 
    172 /* SYNTAX WITHIN AN MRI SCRIPT FILE */ 
     179        ;
     180
     181/* SYNTAX WITHIN AN MRI SCRIPT FILE */
    173182mri_script_file:
    174183                {
     
    190199
    191200mri_script_command:
    192                 CHIP  exp 
     201                CHIP  exp
    193202        |       CHIP  exp ',' exp
    194203        |       NAME    {
     
    199208                        }
    200209        |       ORDER ordernamelist
    201         |       ENDWORD 
     210        |       ENDWORD
    202211        |       PUBLIC NAME '=' exp
    203212                        { mri_public($2, $4); }
    204213        |       PUBLIC NAME ',' exp
    205214                        { mri_public($2, $4); }
    206         |       PUBLIC NAME  exp 
     215        |       PUBLIC NAME  exp
    207216                        { mri_public($2, $3); }
    208217        |       FORMAT NAME
     
    224233        |       ABSOLUTE mri_abs_name_list
    225234        |       LOAD     mri_load_name_list
    226         |       NAMEWORD NAME 
    227                         { mri_name($2); }   
     235        |       NAMEWORD NAME
     236                        { mri_name($2); }
    228237        |       ALIAS NAME ',' NAME
    229238                        { mri_alias($2,$4,0);}
    230239        |       ALIAS NAME ',' INT
    231                         { mri_alias($2,0,(int) $4);}
     240                        { mri_alias ($2, 0, (int) $4.integer); }
    232241        |       BASE     exp
    233242                        { mri_base($2); }
    234         |       TRUNCATE INT
    235                 {  mri_truncate((unsigned int) $2); }
     243        |       TRUNCATE INT
     244                { mri_truncate ((unsigned int) $2.integer); }
    236245        |       CASE casesymlist
    237246        |       EXTERN extern_name_list
    238247        |       INCLUDE filename
    239                 { ldfile_open_command_file ($2); } mri_script_lines END
     248                { ldlex_script (); ldfile_open_command_file($2); }
     249                mri_script_lines END
     250                { ldlex_popstate (); }
    240251        |       START NAME
    241                 { lang_add_entry ($2, false); }
     252                { lang_add_entry ($2, FALSE); }
    242253        |
    243254        ;
     
    309320                { lang_add_target($3); }
    310321        |       SEARCH_DIR '(' filename ')'
    311                 { ldfile_add_library_path ($3, false); }
     322                { ldfile_add_library_path ($3, FALSE); }
    312323        |       OUTPUT '(' filename ')'
    313324                { lang_add_output($3, 1); }
     
    320331                  { ldfile_set_output_arch($3); }
    321332        |       FORCE_COMMON_ALLOCATION
    322                 { command_line.force_common_definition = true ; }
     333                { command_line.force_common_definition = TRUE ; }
     334        |       INHIBIT_COMMON_ALLOCATION
     335                { command_line.inhibit_common_definition = TRUE ; }
    323336        |       INPUT '(' input_list ')'
    324337        |       GROUP
     
    328341        |       MAP '(' filename ')'
    329342                { lang_add_map($3); }
    330         |       INCLUDE filename
    331                 { ldfile_open_command_file($2); } ifile_list END
     343        |       INCLUDE filename
     344                { ldlex_script (); ldfile_open_command_file($2); }
     345                ifile_list END
     346                { ldlex_popstate (); }
    332347        |       NOCROSSREFS '(' nocrossref_list ')'
    333348                {
     
    370385statement_anywhere:
    371386                ENTRY '(' NAME ')'
    372                 { lang_add_entry ($3, false); }
     387                { lang_add_entry ($3, FALSE); }
    373388        |       assignment end
    374389        ;
     
    395410                        {
    396411                          $$.name = $1;
    397                           $$.sorted = false;
     412                          $$.sorted = FALSE;
    398413                          $$.exclude_name_list = NULL;
    399414                        }
     
    401416                        {
    402417                          $$.name = $5;
    403                           $$.sorted = false;
     418                          $$.sorted = FALSE;
    404419                          $$.exclude_name_list = $3;
    405420                        }
     
    407422                        {
    408423                          $$.name = $3;
    409                           $$.sorted = true;
     424                          $$.sorted = TRUE;
    410425                          $$.exclude_name_list = NULL;
    411426                        }
     
    413428                        {
    414429                          $$.name = $7;
    415                           $$.sorted = true;
     430                          $$.sorted = TRUE;
    416431                          $$.exclude_name_list = $5;
    417432                        }
    418433        ;
    419 
    420 
    421434
    422435exclude_name_list:
     
    427440                          tmp->name = $2;
    428441                          tmp->next = $1;
    429                           $$ = tmp;     
     442                          $$ = tmp;
    430443                        }
    431444        |
     
    441454
    442455file_NAME_list:
     456                file_NAME_list opt_comma wildcard_spec
     457                        {
     458                          struct wildcard_list *tmp;
     459                          tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
     460                          tmp->next = $1;
     461                          tmp->spec = $3;
     462                          $$ = tmp;
     463                        }
     464        |
    443465                wildcard_spec
    444466                        {
    445                           lang_add_wild ($1.name, $1.sorted,
    446                                          current_file.name,
    447                                          current_file.sorted,
    448                                          ldgram_had_keep, $1.exclude_name_list);
    449                         }
    450         |       file_NAME_list opt_comma wildcard_spec
    451                         {
    452                           lang_add_wild ($3.name, $3.sorted,
    453                                          current_file.name,
    454                                          current_file.sorted,
    455                                          ldgram_had_keep, $3.exclude_name_list);
     467                          struct wildcard_list *tmp;
     468                          tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
     469                          tmp->next = NULL;
     470                          tmp->spec = $1;
     471                          $$ = tmp;
    456472                        }
    457473        ;
     
    460476                NAME
    461477                        {
    462                           lang_add_wild (NULL, false, $1, false,
    463                                          ldgram_had_keep, NULL);
    464                         }
    465         |       '['
    466                         {
    467                           current_file.name = NULL;
    468                           current_file.sorted = false;
    469                         }
    470                 file_NAME_list ']'
    471         |       wildcard_spec
    472                         {
    473                           current_file = $1;
    474                           /* '*' matches any file name.  */
    475                           if (strcmp (current_file.name, "*") == 0)
    476                             current_file.name = NULL;
    477                         }
    478                 '(' file_NAME_list ')'
     478                          struct wildcard_spec tmp;
     479                          tmp.name = $1;
     480                          tmp.exclude_name_list = NULL;
     481                          tmp.sorted = FALSE;
     482                          lang_add_wild (&tmp, NULL, ldgram_had_keep);
     483                        }
     484        |       '[' file_NAME_list ']'
     485                        {
     486                          lang_add_wild (NULL, $2, ldgram_had_keep);
     487                        }
     488        |       wildcard_spec '(' file_NAME_list ')'
     489                        {
     490                          lang_add_wild (&$1, $3, ldgram_had_keep);
     491                        }
    479492        ;
    480493
     
    482495                input_section_spec_no_keep
    483496        |       KEEP '('
    484                         { ldgram_had_keep = true; }
     497                        { ldgram_had_keep = TRUE; }
    485498                input_section_spec_no_keep ')'
    486                         { ldgram_had_keep = false; }
     499                        { ldgram_had_keep = FALSE; }
    487500        ;
    488501
     
    491504        |       CREATE_OBJECT_SYMBOLS
    492505                {
    493                 lang_add_attribute(lang_object_symbols_statement_enum); 
     506                lang_add_attribute(lang_object_symbols_statement_enum);
    494507                }
    495508        |       ';'
    496509        |       CONSTRUCTORS
    497510                {
    498                
    499                   lang_add_attribute(lang_constructors_statement_enum); 
     511
     512                  lang_add_attribute(lang_constructors_statement_enum);
    500513                }
    501514        | SORT '(' CONSTRUCTORS ')'
    502515                {
    503                   constructors_sorted = true;
     516                  constructors_sorted = TRUE;
    504517                  lang_add_attribute (lang_constructors_statement_enum);
    505518                }
     
    507520        | length '(' mustbe_exp ')'
    508521                        {
    509                         lang_add_data((int) $1,$3);
    510                         }
    511  
    512         | FILL '(' mustbe_exp ')'
    513                         {
    514                           lang_add_fill
    515                             (exp_get_value_int($3,
    516                                                0,
    517                                                "fill value",
    518                                                lang_first_phase_enum));
     522                          lang_add_data ((int) $1, $3);
     523                        }
     524
     525        | FILL '(' fill_exp ')'
     526                        {
     527                          lang_add_fill ($3);
    519528                        }
    520529        ;
     
    524533        |       statement
    525534        ;
    526  
     535
    527536statement_list_opt:
    528537                /* empty */
     
    543552        ;
    544553
     554fill_exp:
     555        mustbe_exp
     556                {
     557                  $$ = exp_get_fill ($1,
     558                                     0,
     559                                     "fill value",
     560                                     lang_first_phase_enum);
     561                }
     562        ;
     563
    545564fill_opt:
    546           '=' mustbe_exp
    547                 {
    548                   $$ =   exp_get_value_int($2,
    549                                            0,
    550                                            "fill value",
    551                                            lang_first_phase_enum);
    552                 }
    553         |       { $$ = 0; }
    554         ;
    555 
    556                
     565          '=' fill_exp
     566                { $$ = $2; }
     567        |       { $$ = (fill_type *) 0; }
     568        ;
    557569
    558570assign_op:
     
    615627
    616628
    617 memory_spec:            NAME
    618                         { region = lang_memory_region_lookup($1); }
     629memory_spec:    NAME
     630                { region = lang_memory_region_lookup($1); }
    619631                attributes_opt ':'
    620632                origin_spec opt_comma length_spec
    621 
     633                {}
    622634        ;
    623635
     
    686698floating_point_support:
    687699                FLOAT
    688                         { lang_float(true); }
     700                        { lang_float(TRUE); }
    689701        |       NOFLOAT
    690                         { lang_float(false); }
    691         ;
    692                
     702                        { lang_float(FALSE); }
     703        ;
     704
    693705nocrossref_list:
    694706                /* empty */
     
    776788                        { $$ = exp_nameop(DEFINED, $3); }
    777789        |       INT
    778                         { $$ = exp_intop($1); }
     790                        { $$ = exp_bigintop ($1.integer, $1.str); }
    779791        |       SIZEOF_HEADERS
    780792                        { $$ = exp_nameop(SIZEOF_HEADERS,0); }
     
    790802        |       ALIGN_K '(' exp ')'
    791803                        { $$ = exp_unop(ALIGN_K,$3); }
     804        |       DATA_SEGMENT_ALIGN '(' exp ',' exp ')'
     805                        { $$ = exp_binop (DATA_SEGMENT_ALIGN, $3, $5); }
     806        |       DATA_SEGMENT_END '(' exp ')'
     807                        { $$ = exp_unop(DATA_SEGMENT_END, $3); }
    792808        |       BLOCK '(' exp ')'
    793809                        { $$ = exp_unop(ALIGN_K,$3); }
     
    805821memspec_at_opt:
    806822                AT '>' NAME { $$ = $3; }
    807         |       { $$ = "*default*"; }
     823        |       { $$ = 0; }
    808824        ;
    809825
     
    814830
    815831section:        NAME            { ldlex_expression(); }
    816                 opt_exp_with_type 
     832                opt_exp_with_type
    817833                opt_at          { ldlex_popstate (); ldlex_script (); }
    818834                '{'
     
    822838                                                              0, 0, 0, $4);
    823839                        }
    824                 statement_list_opt     
     840                statement_list_opt
    825841                '}' { ldlex_popstate (); ldlex_expression (); }
    826842                memspec_opt memspec_at_opt phdr_opt fill_opt
     
    830846                }
    831847                opt_comma
     848                {}
    832849        |       OVERLAY
    833850                        { ldlex_expression (); }
    834851                opt_exp_without_type opt_nocrossrefs opt_at
    835852                        { ldlex_popstate (); ldlex_script (); }
    836                 '{' 
    837                         {
    838                           lang_enter_overlay ($3, $5, (int) $4);
     853                '{'
     854                        {
     855                          lang_enter_overlay ($3);
    839856                        }
    840857                overlay_section
     
    844861                        {
    845862                          ldlex_popstate ();
    846                           lang_leave_overlay ($15, $12, $14, $13);
     863                          lang_leave_overlay ($5, (int) $4,
     864                                              $15, $12, $14, $13);
    847865                        }
    848866                opt_comma
     
    916934                       xmalloc (sizeof *n));
    917935                  n->name = $3;
    918                   n->used = false;
     936                  n->used = FALSE;
    919937                  n->next = $1;
    920938                  $$ = n;
     
    973991                          "PT_NULL", "PT_LOAD", "PT_DYNAMIC",
    974992                          "PT_INTERP", "PT_NOTE", "PT_SHLIB",
    975                           "PT_PHDR"
     993                          "PT_PHDR", "PT_TLS"
    976994                        };
    977995
     
    9851003                            break;
    9861004                          }
     1005                      if (i == sizeof phdr_types / sizeof phdr_types[0])
     1006                        {
     1007                          if (strcmp (s, "PT_GNU_EH_FRAME") == 0)
     1008                            $$ = exp_intop (0x6474e550);
     1009                          else
     1010                            {
     1011                              einfo (_("\
     1012%X%P:%S: unknown phdr type `%s' (try integer literal)\n"),
     1013                                     s);
     1014                              $$ = exp_intop (0);
     1015                            }
     1016                        }
    9871017                    }
    9881018                }
     
    9981028                  $$ = $3;
    9991029                  if (strcmp ($1, "FILEHDR") == 0 && $2 == NULL)
    1000                     $$.filehdr = true;
     1030                    $$.filehdr = TRUE;
    10011031                  else if (strcmp ($1, "PHDRS") == 0 && $2 == NULL)
    1002                     $$.phdrs = true;
     1032                    $$.phdrs = TRUE;
    10031033                  else if (strcmp ($1, "FLAGS") == 0 && $2 != NULL)
    10041034                    $$.flags = $2;
     
    10561086
    10571087vers_node:
    1058                 VERS_TAG '{' vers_tag '}' ';'
     1088                '{' vers_tag '}' ';'
     1089                {
     1090                  lang_register_vers_node (NULL, $2, NULL);
     1091                }
     1092        |       VERS_TAG '{' vers_tag '}' ';'
    10591093                {
    10601094                  lang_register_vers_node ($1, $3, NULL);
     
    11031137                VERS_IDENTIFIER
    11041138                {
    1105                   $$ = lang_new_vers_regex (NULL, $1, ldgram_vers_current_lang);
     1139                  $$ = lang_new_vers_pattern (NULL, $1, ldgram_vers_current_lang);
    11061140                }
    11071141        |       vers_defns ';' VERS_IDENTIFIER
    11081142                {
    1109                   $$ = lang_new_vers_regex ($1, $3, ldgram_vers_current_lang);
    1110                 }
     1143                  $$ = lang_new_vers_pattern ($1, $3, ldgram_vers_current_lang);
     1144                }
     1145        |       vers_defns ';' EXTERN NAME '{'
     1146                        {
     1147                          $<name>$ = ldgram_vers_current_lang;
     1148                          ldgram_vers_current_lang = $4;
     1149                        }
     1150                vers_defns opt_semicolon '}'
     1151                        {
     1152                          $$ = $7;
     1153                          ldgram_vers_current_lang = $<name>6;
     1154                        }
    11111155        |       EXTERN NAME '{'
    11121156                        {
     
    11141158                          ldgram_vers_current_lang = $2;
    11151159                        }
    1116                 vers_defns '}'
     1160                vers_defns opt_semicolon '}'
    11171161                        {
    11181162                          $$ = $5;
     
    11211165        ;
    11221166
     1167opt_semicolon:
     1168                /* empty */
     1169        |       ';'
     1170        ;
     1171
    11231172%%
    11241173void
    1125 yyerror(arg) 
     1174yyerror(arg)
    11261175     const char *arg;
    1127 { 
     1176{
    11281177  if (ldfile_assumed_script)
    11291178    einfo (_("%P:%s: file format not recognized; treating as linker script\n"),
Note: See TracChangeset for help on using the changeset viewer.