gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gold / yyscript.y
index 34b8b556b9631cd8d566d1a4c1a0e759550fb433..d645dac2608c46de36a79765d29aab58a0892d8d 100644 (file)
@@ -1,6 +1,6 @@
 /* yyscript.y -- linker script grammar for gold.  */
 
-/* Copyright 2006, 2007, 2008 Free Software Foundation, Inc.
+/* Copyright (C) 2006-2020 Free Software Foundation, Inc.
    Written by Ian Lance Taylor <iant@google.com>.
 
    This file is part of gold.
@@ -77,6 +77,7 @@
   struct Version_dependency_list* deplist;
   struct Version_expression_list* versyms;
   struct Version_tree* versnode;
+  enum Script_section_type section_type;
 }
 
 /* Operators, including a precedence table for expressions.  */
 %token BYTE
 %token CONSTANT
 %token CONSTRUCTORS
+%token COPY
 %token CREATE_OBJECT_SYMBOLS
 %token DATA_SEGMENT_ALIGN
 %token DATA_SEGMENT_END
 %token DATA_SEGMENT_RELRO_END
 %token DEFINED
+%token DSECT
 %token ENTRY
 %token EXCLUDE_FILE
 %token EXTERN
 %token FORCE_COMMON_ALLOCATION
 %token GLOBAL          /* global */
 %token GROUP
+%token HIDDEN
 %token HLL
 %token INCLUDE
 %token INHIBIT_COMMON_ALLOCATION
+%token INFO
 %token INPUT
 %token KEEP
+%token LEN
 %token LENGTH          /* LENGTH, l, len */
 %token LOADADDR
 %token LOCAL           /* local */
 %token NEXT
 %token NOCROSSREFS
 %token NOFLOAT
+%token NOLOAD
 %token ONLY_IF_RO
 %token ONLY_IF_RW
+%token ORG
 %token ORIGIN          /* ORIGIN, o, org */
 %token OUTPUT
 %token OUTPUT_ARCH
 %token SIZEOF
 %token SIZEOF_HEADERS  /* SIZEOF_HEADERS, sizeof_headers */
 %token SORT_BY_ALIGNMENT
+%token SORT_BY_INIT_PRIORITY
 %token SORT_BY_NAME
 %token SPECIAL
 %token SQUAD
 %token PARSING_VERSION_SCRIPT
 %token PARSING_DEFSYM
 %token PARSING_DYNAMIC_LIST
+%token PARSING_SECTIONS_BLOCK
+%token PARSING_SECTION_COMMANDS
+%token PARSING_MEMORY_DEF
 
 /* Non-terminal types, where needed.  */
 
-%type <expr> parse_exp exp opt_address_and_section_type
+%type <expr> parse_exp exp
 %type <expr> opt_at opt_align opt_subalign opt_fill
-%type <output_section_header> section_header
+%type <output_section_header> section_header opt_address_and_section_type
+%type <section_type> section_type
 %type <output_section_trailer> section_trailer
 %type <constraint> opt_constraint
 %type <string_list> opt_phdr
 %type <wildcard_section> wildcard_file wildcard_section
 %type <string_list> exclude_names
 %type <string> wildcard_name
-%type <integer> phdr_type
+%type <integer> phdr_type memory_attr
 %type <phdr_info> phdr_info
 %type <versyms> vers_defns
 %type <versnode> vers_tag
@@ -224,6 +237,9 @@ top:
        | PARSING_VERSION_SCRIPT version_script
        | PARSING_DEFSYM defsym_expr
         | PARSING_DYNAMIC_LIST dynamic_list_expr
+        | PARSING_SECTIONS_BLOCK sections_block
+        | PARSING_SECTION_COMMANDS section_cmds
+        | PARSING_MEMORY_DEF memory_defs
        ;
 
 /* A file contains a list of commands.  */
@@ -244,6 +260,7 @@ file_cmd:
        | INHIBIT_COMMON_ALLOCATION
            { script_set_common_allocation(closure, 0); }
        | INPUT '(' input_list ')'
+       | MEMORY '{' memory_defs '}'
         | OPTION '(' string ')'
            { script_parse_option(closure, $3.value, $3.length); }
        | OUTPUT_FORMAT '(' string ')'
@@ -266,11 +283,20 @@ file_cmd:
            { script_start_sections(closure); }
          sections_block '}'
            { script_finish_sections(closure); }
+       | TARGET_K '(' string ')'
+           { script_set_target(closure, $3.value, $3.length); }
         | VERSIONK '{'
             { script_push_lex_into_version_mode(closure); }
           version_script '}'
             { script_pop_lex_mode(closure); }
-       | file_or_sections_cmd
+       | ENTRY '(' string ')'
+           { script_set_entry(closure, $3.value, $3.length); }
+       | assignment end
+       | ASSERT_K '(' parse_exp ',' string ')'
+           { script_add_assertion(closure, $3, $5.value, $5.length); }
+       | INCLUDE string
+           { script_include_directive(PARSING_LINKER_SCRIPT, closure,
+                                      $2.value, $2.length); }
        | ignore_cmd
        | ';'
        ;
@@ -312,6 +338,8 @@ input_list:
 input_list_element:
          string
            { script_add_file(closure, $1.value, $1.length); }
+       | '-' STRING
+           { script_add_library(closure, $2.value, $2.length); }
        | AS_NEEDED
            { script_start_as_needed(closure); }
          '(' input_list ')'
@@ -326,7 +354,14 @@ sections_block:
 
 /* A command which may appear within a SECTIONS block.  */
 section_block_cmd:
-         file_or_sections_cmd
+         ENTRY '(' string ')'
+           { script_set_entry(closure, $3.value, $3.length); }
+       | assignment end
+       | ASSERT_K '(' parse_exp ',' string ')'
+           { script_add_assertion(closure, $3, $5.value, $5.length); }
+       | INCLUDE string
+           { script_include_directive(PARSING_SECTIONS_BLOCK, closure,
+                                      $2.value, $2.length); }
        | string section_header
            { script_start_output_section(closure, $1.value, $1.length, &$2); }
          '{' section_cmds '}' section_trailer
@@ -341,7 +376,8 @@ section_header:
            { script_pop_lex_mode(closure); }
          opt_constraint
            {
-             $$.address = $2;
+             $$.address = $2.address;
+             $$.section_type = $2.section_type;
              $$.load_address = $3;
              $$.align = $4;
              $$.subalign = $5;
@@ -354,18 +390,61 @@ section_header:
    '(' in section_header.  */
 
 opt_address_and_section_type:
-         ':'
-           { $$ = NULL; }
+       ':'
+           {
+             $$.address = NULL;
+             $$.section_type = SCRIPT_SECTION_TYPE_NONE;
+           }
        | '(' ')' ':'
-           { $$ = NULL; }
+           {
+             $$.address = NULL;
+             $$.section_type = SCRIPT_SECTION_TYPE_NONE;
+           }
        | exp ':'
-           { $$ = $1; }
+           {
+             $$.address = $1;
+             $$.section_type = SCRIPT_SECTION_TYPE_NONE;
+           }
        | exp '(' ')' ':'
-           { $$ = $1; }
-       | exp '(' string ')' ':'
            {
-             yyerror(closure, "section types are not supported");
-             $$ = $1;
+             $$.address = $1;
+             $$.section_type = SCRIPT_SECTION_TYPE_NONE;
+           }
+       | '(' section_type ')' ':'
+           {
+             $$.address = NULL;
+             $$.section_type = $2;
+           }
+       | exp '(' section_type ')' ':'
+           {
+             $$.address = $1;
+             $$.section_type = $3;
+           }
+       ;
+
+/* We only support NOLOAD.  */
+section_type:
+       NOLOAD
+           { $$ = SCRIPT_SECTION_TYPE_NOLOAD; }
+       | DSECT
+           {
+             yyerror(closure, "DSECT section type is unsupported");
+             $$ = SCRIPT_SECTION_TYPE_DSECT;
+           }
+       | COPY
+           {
+             yyerror(closure, "COPY section type is unsupported");
+             $$ = SCRIPT_SECTION_TYPE_COPY;
+           }
+       | INFO
+           {
+             yyerror(closure, "INFO section type is unsupported");
+             $$ = SCRIPT_SECTION_TYPE_INFO;
+           }
+       | OVERLAY
+           {
+             yyerror(closure, "OVERLAY section type is unsupported");
+             $$ = SCRIPT_SECTION_TYPE_OVERLAY;
            }
        ;
 
@@ -417,14 +496,14 @@ section_trailer:
 /* A memory specification for an output section.  */
 opt_memspec:
          '>' string
-           { yyerror(closure, "memory regions are not supported"); }
+           { script_set_section_region(closure, $2.value, $2.length, 1); }
        | /* empty */
        ;
 
 /* A memory specification for where to load an output section.  */
 opt_at_memspec:
          AT '>' string
-           { yyerror(closure, "memory regions are not supported"); }
+           { script_set_section_region(closure, $3.value, $3.length, 0); }
        | /* empty */
        ;
 
@@ -471,6 +550,9 @@ section_cmd:
                 nothing, we accept it and ignore it.  */
            }
        | SORT_BY_NAME '(' CONSTRUCTORS ')'
+       | INCLUDE string
+           { script_include_directive(PARSING_SECTION_COMMANDS, closure,
+                                      $2.value, $2.length); }
        | ';'
        ;
 
@@ -597,6 +679,11 @@ wildcard_section:
                  abort();
                }
            }
+       | SORT_BY_INIT_PRIORITY '(' wildcard_name ')'
+           {
+             $$.name = $3;
+             $$.sort = SORT_WILDCARD_BY_INIT_PRIORITY;
+           }
        ;
 
 /* A list of file names to exclude.  */
@@ -624,14 +711,48 @@ wildcard_name:
            }
        ;
 
-/* A command which may appear at the top level of a linker script, or
-   within a SECTIONS block.  */
-file_or_sections_cmd:
-         ENTRY '(' string ')'
-           { script_set_entry(closure, $3.value, $3.length); }
-       | assignment end
-       | ASSERT_K '(' parse_exp ',' string ')'
-           { script_add_assertion(closure, $3, $5.value, $5.length); }
+/* A list of MEMORY definitions.  */
+memory_defs:
+         memory_defs opt_comma memory_def
+       | /* empty */
+       ;
+
+/* A single MEMORY definition.  */
+memory_def:
+         string memory_attr ':' memory_origin '=' parse_exp opt_comma memory_length '=' parse_exp
+         { script_add_memory(closure, $1.value, $1.length, $2, $6, $10); }
+       |
+         INCLUDE string
+         { script_include_directive(PARSING_MEMORY_DEF, closure,
+                                    $2.value, $2.length); }
+       |
+       ;
+
+/* The (optional) attributes of a MEMORY region.  */
+memory_attr:
+         '(' string ')'
+         { $$ = script_parse_memory_attr(closure, $2.value, $2.length, 0); }
+        | /* Inverted attributes. */
+         '(' '!' string ')'
+         { $$ = script_parse_memory_attr(closure, $3.value, $3.length, 1); }
+       | /* empty */
+           { $$ = 0; }
+       ;
+
+memory_origin:
+          ORIGIN
+       |
+         ORG
+       |
+         'o'
+       ;
+
+memory_length:
+          LENGTH
+       |
+         LEN
+       |
+         'l'
        ;
 
 /* A list of program header definitions.  */
@@ -744,6 +865,8 @@ assignment:
              Expression_ptr e = script_exp_binary_bitwise_or(s, $3);
              script_set_symbol(closure, $1.value, $1.length, e, 0, 0);
            }
+       | HIDDEN '(' string '=' parse_exp ')'
+           { script_set_symbol(closure, $3.value, $3.length, $5, 0, 1); }
        | PROVIDE '(' string '=' parse_exp ')'
            { script_set_symbol(closure, $3.value, $3.length, $5, 1, 0); }
        | PROVIDE_HIDDEN '(' string '=' parse_exp ')'
@@ -813,7 +936,7 @@ exp:
        | INTEGER
            { $$ = script_exp_integer($1); }
        | string
-           { $$ = script_exp_string($1.value, $1.length); }
+           { $$ = script_symbol(closure, $1.value, $1.length); }
        | MAX_K '(' exp ',' exp ')'
            { $$ = script_exp_function_max($3, $5); }
        | MIN_K '(' exp ',' exp ')'
@@ -831,9 +954,9 @@ exp:
        | LOADADDR '(' string ')'
            { $$ = script_exp_function_loadaddr($3.value, $3.length); }
        | ORIGIN '(' string ')'
-           { $$ = script_exp_function_origin($3.value, $3.length); }
+           { $$ = script_exp_function_origin(closure, $3.value, $3.length); }
        | LENGTH '(' string ')'
-           { $$ = script_exp_function_length($3.value, $3.length); }
+           { $$ = script_exp_function_length(closure, $3.value, $3.length); }
        | CONSTANT '(' string ')'
            { $$ = script_exp_function_constant($3.value, $3.length); }
        | ABSOLUTE '(' exp ')'
@@ -859,6 +982,10 @@ exp:
        | SEGMENT_START '(' string ',' exp ')'
            {
              $$ = script_exp_function_segment_start($3.value, $3.length, $5);
+             /* We need to take note of any SEGMENT_START expressions
+                because they change the behaviour of -Ttext, -Tdata and
+                -Tbss options.  */
+             script_saw_segment_start_expression(closure);
            }
        | ASSERT_K '(' exp ',' string ')'
            { $$ = script_exp_function_assert($3, $5.value, $5.length); }
This page took 0.029631 seconds and 4 git commands to generate.