diff options
-rw-r--r-- | ld/ChangeLog | 8 | ||||
-rw-r--r-- | ld/ldgram.y | 11 | ||||
-rw-r--r-- | ld/ldlex.h | 1 | ||||
-rw-r--r-- | ld/ldlex.l | 12 |
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); @@ -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. */ @@ -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. */ |