aboutsummaryrefslogtreecommitdiff
path: root/ld/ldlex.l
diff options
context:
space:
mode:
Diffstat (limited to 'ld/ldlex.l')
-rw-r--r--ld/ldlex.l83
1 files changed, 50 insertions, 33 deletions
diff --git a/ld/ldlex.l b/ld/ldlex.l
index 3a4158d..d43cf49 100644
--- a/ld/ldlex.l
+++ b/ld/ldlex.l
@@ -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)