Fix support for NOLOAD, add INCLUDE

* ldfile.c (ldfile_open_command_file): pass file name to
	lex_push_file.
	* ldlex.l, ldgram.y: tidy up, parse INCLUDE and NOLOAD
	* ldlang.c (wild_doit): make output sections inherit NEVER_LOAD
	attribute.
This commit is contained in:
Steve Chamberlain 1993-01-08 22:42:42 +00:00
parent c1d53021ae
commit dadd414a89
3 changed files with 112 additions and 73 deletions

View File

@ -1,3 +1,21 @@
Fri Jan 8 14:39:07 1993 Steve Chamberlain (sac@thepub.cygnus.com)
Fix support for NOLOAD, add INCLUDE
* ldfile.c (ldfile_open_command_file): pass file name to
lex_push_file.
* ldlex.l, ldgram.y: tidy up, parse INCLUDE and NOLOAD
* ldlang.c (wild_doit): make output sections inherit NEVER_LOAD
attribute.
Thu Jan 7 10:22:19 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com)
* Makefile.in, config.h: no more default emulation. Make the lack
of emulation a compile time error
Wed Jan 6 01:08:37 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com)
* configure.in: recognise all sparclite variants, not just 'sparclite'
Mon Dec 28 11:15:35 1992 Ian Lance Taylor (ian@cygnus.com)
* m68kcoff.sc-sh: define _end as well as end, for consistency with

View File

@ -44,7 +44,7 @@ extern boolean trace_files;
extern boolean write_map;
extern boolean option_longmap;
boolean hex_mode;
static int typebits;
strip_symbols_type strip_symbols=STRIP_NONE;
discard_locals_type discard_locals=DISCARD_NONE;
@ -58,7 +58,7 @@ lang_output_section_statement_type *lang_output_section_statement_lookup();
#ifdef __STDC__
void lang_add_data(int type, union etree_union *exp);
void lang_enter_output_section_statement(char *output_section_statement_name, etree_type *address_exp, int flags, bfd_vma block_value);
void lang_enter_output_section_statement(char *output_section_statement_name, etree_type *address_exp, int flags, bfd_vma block_value,etree_type*,etree_type*);
#else
@ -103,8 +103,8 @@ struct sec *section;
}
%type <etree> exp opt_exp mustbe_exp
%type <integer> fill_opt opt_block opt_type
%type <etree> exp opt_exp_with_type mustbe_exp
%type <integer> fill_opt
%type <name> memspec_opt
%token <integer> INT
%token <name> NAME
@ -133,6 +133,7 @@ struct sec *section;
%token '{' '}'
%token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH
%token SIZEOF_HEADERS
%token INCLUDE
%token MEMORY DEFSYMEND
%token NOLOAD DSECT COPY INFO OVERLAY
%token NAME DEFINED TARGET_K SEARCH_DIR MAP ENTRY
@ -143,17 +144,20 @@ struct sec *section;
%token OPTION_v OPTION_V OPTION_M OPTION_t STARTUP HLL SYSLIB FLOAT NOFLOAT
%token OPTION_Map
%token OPTION_n OPTION_r OPTION_o OPTION_b OPTION_R OPTION_relax
%token <name> OPTION_l OPTION_L OPTION_T OPTION_Aarch OPTION_Tfile OPTION_Texp
%token <name> OPTION_l OPTION_L OPTION_T OPTION_Aarch OPTION_Tfile OPTION_Texp
%token <name> OPTION_y
%token OPTION_Ur
%token ORIGIN FILL OPTION_g
%token LENGTH CREATE_OBJECT_SYMBOLS INPUT OUTPUT CONSTRUCTORS
%token LENGTH CREATE_OBJECT_SYMBOLS INPUT OUTPUT CONSTRUCTORS
%token OPTION_RETAIN_SYMBOLS_FILE ALIGNMOD
%type <token> assign_op
%type <name> filename
%token CHIP LIST SECT ABSOLUTE LOAD NEWLINE ENDWORD ORDER NAMEWORD
%token FORMAT PUBLIC DEFSYMEND BASE ALIAS
%token FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE
%{
ld_config_type config;
@ -278,7 +282,10 @@ command_line_option:
lang_section_start($1,exp_intop($3));
hex_mode = 0;
}
| OPTION_y
{
add_ysym($1);
}
| OPTION_Aarch
{
ldfile_add_arch($1);
@ -307,7 +314,7 @@ command_line_option:
| OPTION_T filename
{ ldfile_open_command_file($2); } script_file
END { ldlex_command();}
END { ldlex_command();}
| OPTION_l
{
@ -325,7 +332,9 @@ END { ldlex_command();}
| OPTION_defsym { ldlex_defsym(); }
NAME '=' exp DEFSYMEND { ldlex_popstate();
lang_add_assignment(exp_assop($4,$3,$5));
}
}
| OPTION_RETAIN_SYMBOLS_FILE filename
{ lang_add_keepsyms_file ($2); }
| '-' NAME
{ info("%P%F Unrecognized option -%s\n", $2); }
@ -375,6 +384,10 @@ mri_script_command:
{ mri_output_section($2, $3);}
| SECT NAME '=' exp
{ mri_output_section($2, $4);}
| ALIGN_K NAME '=' exp
{ mri_align($2,$4); }
| ALIGNMOD NAME '=' exp
{ mri_alignmod($2,$4); }
| ABSOLUTE mri_abs_name_list
| LOAD mri_load_name_list
| NAMEWORD NAME
@ -385,6 +398,8 @@ mri_script_command:
{ mri_alias($2,0,$4);}
| BASE exp
{ mri_base($2); }
| TRUNCATE INT
{ mri_truncate($2); }
|
;
@ -449,6 +464,8 @@ ifile_p1:
| INPUT '(' input_list ')'
| MAP '(' filename ')'
{ lang_add_map($3); }
| INCLUDE filename
{ ldfile_open_command_file($2); } ifile_list END
;
input_list:
@ -759,50 +776,37 @@ exp :
section: NAME { ldlex_expression(); }
opt_exp { ldlex_popstate(); }
opt_type opt_block ':' opt_things'{'
opt_exp_with_type { ldlex_popstate(); }
'{'
{
lang_enter_output_section_statement($1,$3,$5,$6);
lang_enter_output_section_statement($1,$3,typebits,0,0,0);
}
statement '}' {ldlex_expression();} fill_opt memspec_opt
statement
'}' {ldlex_expression();} fill_opt memspec_opt
{
ldlex_popstate();
lang_leave_output_section_statement($14, $15);
lang_leave_output_section_statement($10, $11);
}
opt_comma
;
opt_type:
NOLOAD { $$ = SEC_NEVER_LOAD; }
| DSECT { $$ = 0; }
| COPY { $$ = 0; }
| INFO { $$ = 0; }
| OVERLAY { $$ = 0; }
| { $$ = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS; }
type:
NOLOAD { typebits = SEC_NEVER_LOAD; }
| DSECT { typebits = 0; }
| COPY { typebits = 0; }
| INFO { typebits = 0; }
| OVERLAY { typebits = 0; }
| { typebits = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS; }
;
opt_things:
{
};
opt_exp:
exp
{ $$ = $1; }
| { $$= (etree_type *)NULL; }
opt_exp_with_type:
exp ':' { $$ = $1; typebits =0;}
| exp '(' type ')' ':' { $$ = $1; }
| ':' { $$= (etree_type *)NULL; typebits = 0}
;
opt_block:
BLOCK '(' exp ')'
{ $$ = exp_get_value_int($3,
1L,
"block",
lang_first_phase_enum);
}
| { $$ = 1; }
;
memspec_opt:
'>' NAME
{ $$ = $2; }

View File

@ -51,6 +51,7 @@ static comment();
#define YY_FATAL_ERROR ;
#define MAX_INCLUDE_DEPTH 10
YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
char *file_name_stack[MAX_INCLUDE_DEPTH];
unsigned int include_stack_ptr = 0;
@ -278,7 +279,7 @@ NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
<BOTH,SCRIPT>"SEARCH_DIR" { RTOKEN(SEARCH_DIR);}
<BOTH,SCRIPT>"OUTPUT" { RTOKEN(OUTPUT);}
<BOTH,SCRIPT>"INPUT" { RTOKEN(INPUT);}
<BOTH,SCRIPT>"DEFINED" { RTOKEN(DEFINED);}
<EXPRESSION,BOTH,SCRIPT>"DEFINED" { RTOKEN(DEFINED);}
<BOTH,SCRIPT>"CREATE_OBJECT_SYMBOLS" { RTOKEN(CREATE_OBJECT_SYMBOLS);}
<BOTH,SCRIPT>"CONSTRUCTORS" { RTOKEN( CONSTRUCTORS);}
<BOTH,SCRIPT>"FORCE_COMMON_ALLOCATION" { RTOKEN(FORCE_COMMON_ALLOCATION);}
@ -294,7 +295,7 @@ NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
<BOTH,SCRIPT>"SHORT" { RTOKEN( SHORT);}
<BOTH,SCRIPT>"BYTE" { RTOKEN( BYTE);}
<BOTH,SCRIPT>"NOFLOAT" { RTOKEN(NOFLOAT);}
<BOTH,SCRIPT>"NOLOAD" { RTOKEN(NOLOAD);}
<EXPRESSION,BOTH,SCRIPT>"NOLOAD" { RTOKEN(NOLOAD);}
<BOTH,SCRIPT>"DSECT" { RTOKEN(DSECT);}
<BOTH,SCRIPT>"COPY" { RTOKEN(COPY);}
<BOTH,SCRIPT>"INFO" { RTOKEN(INFO);}
@ -303,6 +304,7 @@ NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
<BOTH,SCRIPT>"org" { RTOKEN(ORIGIN);}
<BOTH,SCRIPT>"l" { RTOKEN( LENGTH);}
<BOTH,SCRIPT>"len" { RTOKEN( LENGTH);}
<BOTH,SCRIPT>"INCLUDE" { RTOKEN(INCLUDE);}
<MRI>"\n" { ++ lineno; RTOKEN(NEWLINE); }
<MRI>"*".* { /* Mri comment line */ }
<MRI>"END" { RTOKEN(ENDWORD); }
@ -363,31 +365,45 @@ NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
<MRI,COMMAND,BOTH,SCRIPT,EXPRESSION>[ \t]
<<EOF>> {
include_stack_ptr--;
extern char *ldfile_input_filename;
include_stack_ptr--;
if (include_stack_ptr == 0)
{
yyterminate();
}
else
{
yy_switch_to_buffer(include_stack[include_stack_ptr]);
}
BEGIN(COMMAND);
return END;
if (include_stack_ptr == 0)
{
yyterminate();
}
else
{
yy_switch_to_buffer(include_stack[include_stack_ptr]);
}
if (include_stack_ptr==1)
{
BEGIN(COMMAND);
}
else
{
ldfile_input_filename = file_name_stack[include_stack_ptr-1];
}
return END;
}
%%
void
DEFUN(lex_push_file,(file),
FILE *file)
DEFUN(lex_push_file,(file,name),
FILE *file AND
char *name)
{
if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
{
einfo("%F:includes nested too deeply");
}
include_stack[include_stack_ptr++] = YY_CURRENT_BUFFER;
file_name_stack[include_stack_ptr] = name;
include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
include_stack_ptr++;
yyin = file;
yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
@ -439,18 +455,19 @@ DEFUN(lex_redirect,( string),
YY_BUFFER_STATE tmp;
int len = strlen(string);
yy_init = 0 ;
yy_init = 0 ;
if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
{
einfo("%F: macros nested too deeply");
}
include_stack[include_stack_ptr++] = YY_CURRENT_BUFFER;
file_name_stack[include_stack_ptr] = "redirect";
include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
include_stack_ptr++;
tmp = yy_create_string_buffer(string, len);
yy_switch_to_buffer(tmp);
BEGIN(COMMAND);
yyout = stdout;
yyout = stdout;
}
int state_stack[20];
@ -459,50 +476,50 @@ int *state_stack_p = state_stack;
void
DEFUN_VOID(ldlex_script)
{
*(state_stack_p)++ = yy_start;
*(state_stack_p)++ = yy_start;
BEGIN(SCRIPT);
BEGIN(SCRIPT);
}
void
DEFUN_VOID(ldlex_mri_script)
{
*(state_stack_p)++ = yy_start;
BEGIN(MRI);
*(state_stack_p)++ = yy_start;
BEGIN(MRI);
}
void
DEFUN_VOID(ldlex_defsym)
{
*(state_stack_p)++ = yy_start;
BEGIN(DEFSYMEXP);
*(state_stack_p)++ = yy_start;
BEGIN(DEFSYMEXP);
}
void
DEFUN_VOID(ldlex_expression)
{
*(state_stack_p)++ = yy_start;
BEGIN(EXPRESSION);
*(state_stack_p)++ = yy_start;
BEGIN(EXPRESSION);
}
void
DEFUN_VOID(ldlex_both)
{
*(state_stack_p)++ = yy_start;
BEGIN(BOTH);
*(state_stack_p)++ = yy_start;
BEGIN(BOTH);
}
void
DEFUN_VOID(ldlex_command)
{
*(state_stack_p)++ = yy_start;
BEGIN(COMMAND);
*(state_stack_p)++ = yy_start;
BEGIN(COMMAND);
}
void
DEFUN_VOID(ldlex_popstate)
{
yy_start = *(--state_stack_p);
yy_start = *(--state_stack_p);
}
yy_input(buf, result, max_size)