/* A YACC grammar to parse a superset of the AT&T linker scripting language.
- Copyright (C) 1991-2017 Free Software Foundation, Inc.
+ Copyright (C) 1991-2021 Free Software Foundation, Inc.
Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com).
This file is part of the GNU Binutils.
#include "sysdep.h"
#include "bfd.h"
#include "bfdlink.h"
+#include "ctf-api.h"
#include "ld.h"
#include "ldexp.h"
#include "ldver.h"
static enum section_type sectype;
static lang_memory_region_type *region;
-static bfd_boolean ldgram_had_keep = FALSE;
+static bool ldgram_had_keep = false;
static char *ldgram_vers_current_lang = NULL;
#define ERROR_NAME_MAX 20
union etree_union *etree;
struct phdr_info
{
- bfd_boolean filehdr;
- bfd_boolean phdrs;
+ bool filehdr;
+ bool phdrs;
union etree_union *at;
union etree_union *flags;
} phdr;
defsym_expr:
- { ldlex_defsym(); }
- NAME '=' exp
- {
- ldlex_popstate();
- lang_add_assignment (exp_defsym ($2, $4));
- }
+ { ldlex_expression(); }
+ assignment
+ { ldlex_popstate(); }
;
/* SYNTAX WITHIN AN MRI SCRIPT FILE */
mri_script_lines:
mri_script_lines mri_script_command NEWLINE
- |
+ |
;
mri_script_command:
CHIP exp
| CHIP exp ',' exp
- | NAME {
- einfo(_("%P%F: unrecognised keyword in MRI style script '%s'\n"),$1);
+ | NAME {
+ einfo(_("%F%P: unrecognised keyword in MRI style script '%s'\n"),$1);
}
- | LIST {
+ | LIST {
config.map_filename = "-";
}
- | ORDER ordernamelist
- | ENDWORD
- | PUBLIC NAME '=' exp
- { mri_public($2, $4); }
- | PUBLIC NAME ',' exp
- { mri_public($2, $4); }
- | PUBLIC NAME exp
- { mri_public($2, $3); }
- | FORMAT NAME
+ | ORDER ordernamelist
+ | ENDWORD
+ | PUBLIC NAME '=' exp
+ { mri_public($2, $4); }
+ | PUBLIC NAME ',' exp
+ { mri_public($2, $4); }
+ | PUBLIC NAME exp
+ { mri_public($2, $3); }
+ | FORMAT NAME
{ mri_format($2); }
| SECT NAME ',' exp
{ mri_output_section($2, $4);}
{ mri_alignmod($2,$4); }
| ABSOLUTE mri_abs_name_list
| LOAD mri_load_name_list
- | NAMEWORD NAME
+ | NAMEWORD NAME
{ mri_name($2); }
| ALIAS NAME ',' NAME
{ mri_alias($2,$4,0);}
| ALIAS NAME ',' INT
{ mri_alias ($2, 0, (int) $4.integer); }
- | BASE exp
+ | BASE exp
{ mri_base($2); }
| TRUNCATE INT
{ mri_truncate ((unsigned int) $2.integer); }
mri_script_lines END
{ ldlex_popstate (); }
| START NAME
- { lang_add_entry ($2, FALSE); }
- |
+ { lang_add_entry ($2, false); }
+ |
;
ordernamelist:
- ordernamelist ',' NAME { mri_order($3); }
- | ordernamelist NAME { mri_order($2); }
- |
+ ordernamelist ',' NAME { mri_order($3); }
+ | ordernamelist NAME { mri_order($2); }
+ |
;
mri_load_name_list:
;
mri_abs_name_list:
- NAME
- { mri_only_load($1); }
+ NAME
+ { mri_only_load($1); }
| mri_abs_name_list ',' NAME
- { mri_only_load($3); }
+ { mri_only_load($3); }
;
casesymlist:
extern_name_list_body:
NAME
- { ldlang_add_undef ($1, FALSE); }
+ { ldlang_add_undef ($1, false); }
| extern_name_list_body NAME
- { ldlang_add_undef ($2, FALSE); }
+ { ldlang_add_undef ($2, false); }
| extern_name_list_body ',' NAME
- { ldlang_add_undef ($3, FALSE); }
+ { ldlang_add_undef ($3, false); }
;
script_file:
{ ldlex_both(); }
ifile_list
{ ldlex_popstate(); }
- ;
+ ;
ifile_list:
ifile_list ifile_p1
- |
+ |
;
| floating_point_support
| statement_anywhere
| version
- | ';'
+ | ';'
| TARGET_K '(' NAME ')'
{ lang_add_target($3); }
| SEARCH_DIR '(' filename ')'
- { ldfile_add_library_path ($3, FALSE); }
+ { ldfile_add_library_path ($3, false); }
| OUTPUT '(' filename ')'
{ lang_add_output($3, 1); }
- | OUTPUT_FORMAT '(' NAME ')'
+ | OUTPUT_FORMAT '(' NAME ')'
{ lang_add_output_format ($3, (char *) NULL,
(char *) NULL, 1); }
| OUTPUT_FORMAT '(' NAME ',' NAME ',' NAME ')'
{ lang_add_output_format ($3, $5, $7, 1); }
- | OUTPUT_ARCH '(' NAME ')'
+ | OUTPUT_ARCH '(' NAME ')'
{ ldfile_set_output_arch ($3, bfd_arch_unknown); }
| FORCE_COMMON_ALLOCATION
- { command_line.force_common_definition = TRUE ; }
+ { command_line.force_common_definition = true ; }
| FORCE_GROUP_ALLOCATION
- { command_line.force_group_allocation = TRUE ; }
+ { command_line.force_group_allocation = true ; }
| INHIBIT_COMMON_ALLOCATION
- { command_line.inhibit_common_definition = TRUE ; }
+ { link_info.inhibit_common_definition = true ; }
| INPUT '(' input_list ')'
| GROUP
{ lang_enter_group (); }
'(' input_list ')'
{ lang_leave_group (); }
- | MAP '(' filename ')'
+ | MAP '(' filename ')'
{ lang_add_map($3); }
| INCLUDE filename
{ ldlex_script (); ldfile_open_command_file($2); }
(char *)NULL); }
| AS_NEEDED '('
{ $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
- input_flags.add_DT_NEEDED_for_regular = TRUE; }
+ input_flags.add_DT_NEEDED_for_regular = true; }
input_list1 ')'
{ input_flags.add_DT_NEEDED_for_regular = $<integer>3; }
| input_list1 ',' AS_NEEDED '('
{ $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
- input_flags.add_DT_NEEDED_for_regular = TRUE; }
+ input_flags.add_DT_NEEDED_for_regular = true; }
input_list1 ')'
{ input_flags.add_DT_NEEDED_for_regular = $<integer>5; }
| input_list1 AS_NEEDED '('
{ $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
- input_flags.add_DT_NEEDED_for_regular = TRUE; }
+ input_flags.add_DT_NEEDED_for_regular = true; }
input_list1 ')'
{ input_flags.add_DT_NEEDED_for_regular = $<integer>4; }
;
statement_anywhere:
ENTRY '(' NAME ')'
- { lang_add_entry ($3, FALSE); }
+ { lang_add_entry ($3, false); }
| assignment end
| ASSERT_K {ldlex_expression ();} '(' exp ',' NAME ')'
{ ldlex_popstate ();
$$.exclude_name_list = NULL;
$$.section_flag_list = NULL;
}
- | EXCLUDE_FILE '(' exclude_name_list ')' wildcard_name
+ | EXCLUDE_FILE '(' exclude_name_list ')' wildcard_name
{
$$.name = $5;
$$.sorted = none;
n->with = with_flags;
n->name = $1;
}
- n->valid = FALSE;
+ n->valid = false;
n->next = NULL;
$$ = n;
}
n->with = with_flags;
n->name = $3;
}
- n->valid = FALSE;
+ n->valid = false;
n->next = $1;
$$ = n;
}
struct flag_info *n;
n = ((struct flag_info *) xmalloc (sizeof *n));
n->flag_list = $3;
- n->flags_initialized = FALSE;
+ n->flags_initialized = false;
n->not_with_flags = 0;
n->only_with_flags = 0;
$$ = n;
tmp.section_flag_list = $1;
lang_add_wild (&tmp, NULL, ldgram_had_keep);
}
- | '[' section_name_list ']'
+ | '[' section_name_list ']'
{
lang_add_wild (NULL, $2, ldgram_had_keep);
}
- | sect_flags '[' section_name_list ']'
+ | sect_flags '[' section_name_list ']'
{
struct wildcard_spec tmp;
tmp.name = NULL;
input_section_spec:
input_section_spec_no_keep
| KEEP '('
- { ldgram_had_keep = TRUE; }
+ { ldgram_had_keep = true; }
input_section_spec_no_keep ')'
- { ldgram_had_keep = FALSE; }
+ { ldgram_had_keep = false; }
;
statement:
- assignment end
+ assignment end
| CREATE_OBJECT_SYMBOLS
{
- lang_add_attribute(lang_object_symbols_statement_enum);
- }
- | ';'
- | CONSTRUCTORS
+ lang_add_attribute(lang_object_symbols_statement_enum);
+ }
+ | ';'
+ | CONSTRUCTORS
{
lang_add_attribute(lang_constructors_statement_enum);
}
| SORT_BY_NAME '(' CONSTRUCTORS ')'
{
- constructors_sorted = TRUE;
+ constructors_sorted = true;
lang_add_attribute (lang_constructors_statement_enum);
}
| input_section_spec
- | length '(' mustbe_exp ')'
- {
- lang_add_data ((int) $1, $3);
- }
+ | length '(' mustbe_exp ')'
+ {
+ lang_add_data ((int) $1, $3);
+ }
| FILL '(' fill_exp ')'
- {
- lang_add_fill ($3);
- }
+ {
+ lang_add_fill ($3);
+ }
| ASSERT_K {ldlex_expression ();} '(' exp ',' NAME ')' end
{ ldlex_popstate ();
lang_add_assignment (exp_assert ($4, $6)); }
statement_list:
statement_list statement
- | statement
+ | statement
;
statement_list_opt:
{ $$ = $1; }
| LONG
{ $$ = $1; }
- | SHORT
+ | SHORT
{ $$ = $1; }
| BYTE
{ $$ = $1; }
fill_opt:
'=' fill_exp
{ $$ = $2; }
- | { $$ = (fill_type *) 0; }
+ | { $$ = (fill_type *) 0; }
;
assign_op:
{ $$ = '+'; }
| MINUSEQ
{ $$ = '-'; }
- | MULTEQ
+ | MULTEQ
{ $$ = '*'; }
- | DIVEQ
+ | DIVEQ
{ $$ = '/'; }
- | LSHIFTEQ
+ | LSHIFTEQ
{ $$ = LSHIFT; }
- | RSHIFTEQ
+ | RSHIFTEQ
{ $$ = RSHIFT; }
- | ANDEQ
+ | ANDEQ
{ $$ = '&'; }
- | OREQ
+ | OREQ
{ $$ = '|'; }
;
assignment:
NAME '=' mustbe_exp
{
- lang_add_assignment (exp_assign ($1, $3, FALSE));
+ lang_add_assignment (exp_assign ($1, $3, false));
}
| NAME assign_op mustbe_exp
{
exp_binop ($2,
exp_nameop (NAME,
$1),
- $3), FALSE));
+ $3), false));
}
| HIDDEN '(' NAME '=' mustbe_exp ')'
{
- lang_add_assignment (exp_assign ($3, $5, TRUE));
+ lang_add_assignment (exp_assign ($3, $5, true));
}
| 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 ')'
{
- lang_add_assignment (exp_provide ($3, $5, TRUE));
+ lang_add_assignment (exp_provide ($3, $5, true));
}
;
;
-memory_spec: NAME
- { region = lang_memory_region_lookup ($1, TRUE); }
+memory_spec: NAME
+ { region = lang_memory_region_lookup ($1, true); }
attributes_opt ':'
origin_spec opt_comma length_spec
{}
ORIGIN '=' mustbe_exp
{
region->origin_exp = $3;
- region->current = region->origin;
}
;
length_spec:
- LENGTH '=' mustbe_exp
+ LENGTH '=' mustbe_exp
{
region->length_exp = $3;
}
{ ldemul_hll($3); }
| filename
{ ldemul_hll($1); }
-
;
low_level_library:
SYSLIB '(' low_level_library_NAME_list ')'
- ; low_level_library_NAME_list:
+ ;
+
+low_level_library_NAME_list:
low_level_library_NAME_list opt_comma filename
{ ldemul_syslib($3); }
|
floating_point_support:
FLOAT
- { lang_float(TRUE); }
+ { lang_float(true); }
| NOFLOAT
- { lang_float(FALSE); }
+ { lang_float(false); }
;
nocrossref_list:
{ $$ = exp_binop (NE , $1, $3); }
| exp LE exp
{ $$ = exp_binop (LE , $1, $3); }
- | exp GE exp
+ | exp GE exp
{ $$ = exp_binop (GE , $1, $3); }
| exp '<' exp
{ $$ = exp_binop ('<' , $1, $3); }
{ $$ = exp_nameop (DEFINED, $3); }
| INT
{ $$ = exp_bigintop ($1.integer, $1.str); }
- | SIZEOF_HEADERS
+ | SIZEOF_HEADERS
{ $$ = exp_nameop (SIZEOF_HEADERS,0); }
| ALIGNOF '(' NAME ')'
{ $$ = exp_binop (DATA_SEGMENT_RELRO_END, $5, $3); }
| DATA_SEGMENT_END '(' exp ')'
{ $$ = exp_unop (DATA_SEGMENT_END, $3); }
- | SEGMENT_START '(' NAME ',' exp ')'
- { /* The operands to the expression node are
+ | SEGMENT_START '(' NAME ',' exp ')'
+ { /* The operands to the expression node are
placed in the opposite order from the way
in which they appear in the script as
that allows us to reuse more code in
memspec_at_opt:
- AT '>' NAME { $$ = $3; }
- | { $$ = 0; }
- ;
+ AT '>' NAME { $$ = $3; }
+ | { $$ = 0; }
+ ;
opt_at:
AT '(' exp ')' { $$ = $3; }
| { $$ = 0; }
;
-section: NAME { ldlex_expression(); }
+section: NAME { ldlex_expression(); }
opt_exp_with_type
opt_at
opt_align
$5, $7, $4, $9, $6);
}
statement_list_opt
- '}' { ldlex_popstate (); ldlex_expression (); }
+ '}' { ldlex_popstate (); ldlex_expression (); }
memspec_opt memspec_at_opt phdr_opt fill_opt
{
+ if (yychar == NAME)
+ {
+ yyclearin;
+ ldlex_backup ();
+ }
ldlex_popstate ();
lang_leave_output_section_statement ($18, $15, $17, $16);
}
opt_comma
- {}
| OVERLAY
{ ldlex_expression (); }
opt_exp_without_type opt_nocrossrefs opt_at opt_subalign
{ ldlex_popstate (); ldlex_expression (); }
memspec_opt memspec_at_opt phdr_opt fill_opt
{
+ if (yychar == NAME)
+ {
+ yyclearin;
+ ldlex_backup ();
+ }
ldlex_popstate ();
lang_leave_overlay ($5, (int) $4,
$16, $13, $15, $14);
opt_exp_with_type
{
ldlex_popstate ();
- lang_add_assignment (exp_assign (".", $3, FALSE));
+ lang_add_assignment (exp_assign (".", $3, false));
}
'{' sec_or_group_p1 '}'
| INCLUDE filename
;
atype:
- '(' type ')'
- | /* EMPTY */ { sectype = normal_section; }
- | '(' ')' { sectype = normal_section; }
+ '(' type ')'
+ | /* EMPTY */ { sectype = normal_section; }
+ | '(' ')' { sectype = normal_section; }
;
opt_exp_with_type:
n = ((struct lang_output_section_phdr_list *)
xmalloc (sizeof *n));
n->name = $3;
- n->used = FALSE;
+ n->used = false;
n->next = $1;
$$ = n;
}
else
{
einfo (_("\
-%X%P:%S: unknown phdr type `%s' (try integer literal)\n"),
+%X%P:%pS: unknown phdr type `%s' (try integer literal)\n"),
NULL, s);
$$ = exp_intop (0);
}
{
$$ = $3;
if (strcmp ($1, "FILEHDR") == 0 && $2 == NULL)
- $$.filehdr = TRUE;
+ $$.filehdr = true;
else if (strcmp ($1, "PHDRS") == 0 && $2 == NULL)
- $$.phdrs = TRUE;
+ $$.phdrs = true;
else if (strcmp ($1, "FLAGS") == 0 && $2 != NULL)
$$.flags = $2;
else
- einfo (_("%X%P:%S: PHDRS syntax error at `%s'\n"),
+ einfo (_("%X%P:%pS: PHDRS syntax error at `%s'\n"),
NULL, $1);
}
| AT '(' exp ')' phdr_qualifiers
dynamic_list_tag:
vers_defns ';'
{
- lang_append_dynamic_list ($1);
+ lang_append_dynamic_list (current_dynamic_list_p, $1);
}
;
vers_defns:
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
{
- $$ = 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
{
- $$ = 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 '{'
{
}
| 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
{
- $$ = lang_new_vers_pattern ($1, "global", ldgram_vers_current_lang, FALSE);
+ $$ = lang_new_vers_pattern ($1, "global", ldgram_vers_current_lang, false);
}
| 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
{
- $$ = lang_new_vers_pattern ($1, "local", ldgram_vers_current_lang, FALSE);
+ $$ = lang_new_vers_pattern ($1, "local", ldgram_vers_current_lang, false);
}
| 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
{
- $$ = lang_new_vers_pattern ($1, "extern", ldgram_vers_current_lang, FALSE);
+ $$ = lang_new_vers_pattern ($1, "extern", ldgram_vers_current_lang, false);
}
;
einfo (_("%P:%s: file format not recognized; treating as linker script\n"),
ldlex_filename ());
if (error_index > 0 && error_index < ERROR_NAME_MAX)
- einfo ("%P%F:%S: %s in %s\n", NULL, arg, error_names[error_index - 1]);
+ einfo ("%F%P:%pS: %s in %s\n", NULL, arg, error_names[error_index - 1]);
else
- einfo ("%P%F:%S: %s\n", NULL, arg);
+ einfo ("%F%P:%pS: %s\n", NULL, arg);
}