aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/ChangeLog8
-rw-r--r--ld/ldgram.y11
-rw-r--r--ld/ldlex.h1
-rw-r--r--ld/ldlex.l12
4 files changed, 30 insertions, 2 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 5b6ead7..c5f73f8 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,5 +1,13 @@
2021-02-01 Alan Modra <amodra@gmail.com>
+ * ldgram.y (section): Call ldlex_backup. Remove empty action.
+ * ldlex.h (ldlex_backup): Declare.
+ * ldlex.l (<EXPRESSION>NAME): Don't use NOCFILENAMECHAR set of
+ chars, use SYMBOLNAMECHAR.
+ (ldlex_backup): New function.
+
+2021-02-01 Alan Modra <amodra@gmail.com>
+
* ldgram.y: Whitespace fixes.
2021-02-01 Alan Modra <amodra@gmail.com>
diff --git a/ld/ldgram.y b/ld/ldgram.y
index b0a4619..08dc110 100644
--- a/ld/ldgram.y
+++ b/ld/ldgram.y
@@ -1071,11 +1071,15 @@ section: NAME { 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
@@ -1089,6 +1093,11 @@ section: NAME { 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_overlay ($5, (int) $4,
$16, $13, $15, $14);
diff --git a/ld/ldlex.h b/ld/ldlex.h
index b010102..d9b36ea 100644
--- a/ld/ldlex.h
+++ b/ld/ldlex.h
@@ -191,6 +191,7 @@ extern void ldlex_defsym (void);
extern void ldlex_expression (void);
extern void ldlex_both (void);
extern void ldlex_popstate (void);
+extern void ldlex_backup (void);
extern const char* ldlex_filename (void);
/* In lexsup.c. */
diff --git a/ld/ldlex.l b/ld/ldlex.l
index 237892c..7652e8d 100644
--- a/ld/ldlex.l
+++ b/ld/ldlex.l
@@ -385,7 +385,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
yylval.name = xstrdup (yytext + 2);
return LNAME;
}
-<EXPRESSION>{SYMBOLNAMECHAR1}{NOCFILENAMECHAR}* {
+<EXPRESSION>{SYMBOLNAMECHAR1}{SYMBOLNAMECHAR}* {
yylval.name = xstrdup (yytext);
return NAME;
}
@@ -636,6 +636,16 @@ ldlex_popstate (void)
yy_start = *(--state_stack_p);
}
+/* In cases where the parser needs to look ahead and the context
+ changes from expression to script or vice-versa, throw away a
+ NAME. What constitutes a NAME depends on context. */
+
+void
+ldlex_backup (void)
+{
+ yyless (0);
+}
+
/* Return the current file name, or the previous file if no file is
current. */