#include "mri.h"
#include "ldlex.h"
-#define YYDEBUG 1
-
static int typebits;
lang_memory_region_type *region;
%token <integer> SIZEOF NEXT ADDR
%token STARTUP HLL SYSLIB FLOAT NOFLOAT
%token ORIGIN FILL
-%token LENGTH CREATE_OBJECT_SYMBOLS INPUT OUTPUT CONSTRUCTORS
-%token ALIGNMOD AT
+%token LENGTH CREATE_OBJECT_SYMBOLS INPUT GROUP OUTPUT CONSTRUCTORS
+%token ALIGNMOD AT PROVIDE
%type <token> assign_op
%type <name> filename
%token CHIP LIST SECT ABSOLUTE LOAD NEWLINE ENDWORD ORDER NAMEWORD
einfo("%P%F: unrecognised keyword in MRI style script '%s'\n",$1);
}
| LIST {
- write_map = true;
config.map_filename = "-";
}
| ORDER ordernamelist
| TARGET_K '(' NAME ')'
{ lang_add_target($3); }
| SEARCH_DIR '(' filename ')'
- { ldfile_add_library_path($3); }
+ { ldfile_add_library_path ($3, false); }
| OUTPUT '(' filename ')'
{ lang_add_output($3, 1); }
| OUTPUT_FORMAT '(' NAME ')'
| FORCE_COMMON_ALLOCATION
{ command_line.force_common_definition = true ; }
| INPUT '(' input_list ')'
+ | GROUP
+ { lang_enter_group (); }
+ '(' input_list ')'
+ { lang_leave_group (); }
| MAP '(' filename ')'
{ lang_add_map($3); }
| INCLUDE filename
statement_anywhere:
ENTRY '(' NAME ')'
- { lang_add_entry($3); }
+ { lang_add_entry ($3, 0); }
| assignment end
;
assignment:
NAME '=' mustbe_exp
{
- lang_add_assignment(exp_assop($2,$1,$3));
+ lang_add_assignment (exp_assop ($2, $1, $3));
}
| NAME assign_op mustbe_exp
{
-
-lang_add_assignment(exp_assop('=',$1,exp_binop($2,exp_nameop(NAME,$1),$3)));
+ lang_add_assignment (exp_assop ('=', $1,
+ exp_binop ($2,
+ exp_nameop (NAME,
+ $1),
+ $3)));
+ }
+ | PROVIDE '(' NAME '=' mustbe_exp ')'
+ {
+ lang_add_assignment (exp_provide ($3, $5));
}
-
;
{ $$ = exp_unop(ABSOLUTE, $3); }
| ALIGN_K '(' exp ')'
{ $$ = exp_unop(ALIGN_K,$3); }
+ | BLOCK '(' exp ')'
+ { $$ = exp_unop(ALIGN_K,$3); }
| NAME
{ $$ = exp_nameop(NAME,$1); }
;
lang_enter_output_section_statement($1,$3,typebits,0,0,0,$4);
}
statement_list_opt
- '}' {ldlex_expression();} fill_opt memspec_opt
+ '}' {ldlex_expression();} memspec_opt fill_opt
{
ldlex_popstate();
- lang_leave_output_section_statement($11, $12);
+ lang_leave_output_section_statement($12, $11);
}
opt_comma
yyerror(arg)
const char *arg;
{
+ if (ldfile_assumed_script)
+ einfo ("%P:%s: file format not recognized; treating as linker script\n",
+ ldfile_input_filename);
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
- einfo("%P%F: %S %s\n", arg);
+ einfo ("%P%F:%S: %s\n", arg);
}