diff options
author | Hans-Peter Nilsson <hp@bitrange.com> | 2014-10-15 03:10:25 +0200 |
---|---|---|
committer | Hans-Peter Nilsson <hp@bitrange.com> | 2014-10-15 03:10:25 +0200 |
commit | eeed9cc785ca447868967e5c84dae63e9ca8e6c2 (patch) | |
tree | 6e3b704c2f61b465b83ec2c5b2b5331b6c1e2b30 | |
parent | bfa234344327776fb3b16e8bfd9c8de6ec73ae31 (diff) | |
download | fsf-binutils-gdb-eeed9cc785ca447868967e5c84dae63e9ca8e6c2.zip fsf-binutils-gdb-eeed9cc785ca447868967e5c84dae63e9ca8e6c2.tar.gz fsf-binutils-gdb-eeed9cc785ca447868967e5c84dae63e9ca8e6c2.tar.bz2 |
Allow unquoted = as the first character in ldscript input_list names
* ldlex.l (INPUTLIST): New start condition.
(comment pattern, ",", "(", ")", "AS_NEEDED")
({FILENAMECHAR1}{FILENAMECHAR}*, "-l"{FILENAMECHAR}+)
(quoted string pattern, whitespace pattern): Add INPUTLIST to
valid start conditions.
(<INPUTLIST>"="{FILENAMECHAR1}{FILENAMECHAR}*): New NAME rule.
(ldlex_inputlist): New start-condition-setter function.
* ldgram.y (input_list1): Rename from input_list. All recursive
use changed.
(input_list): New wrapper rule for input_list1, setting
INPUTLIST lexer state for the duration of parsing input_list1.
All this to say INPUT(=/path/to/file) and not be forced to use
INPUT("=/path/to/file") whenever there's a need to force a sysroot-
prefix. Still, IMHO it seems better to make use of a previously
invalid syntax and not only change the meaning of quoted =-prefixed
paths (though arguably that's not very useful before this patchset).
This got a little bit hairier than I'd expected: I had to add a new
lexer state (aka. start condition) to avoid a first "=" being lexed as
the token "=", despite that not making sense in constructs expecting
file-names in the first place. (The grammar doesn't allow for
expressions in any part of those lists.) I guess I *could* have made
it work using that token anyway, but I didn't like the idea that you
would be able to separate the "=" from the rest of the file-name with
whitespace.
-rw-r--r-- | ld/ChangeLog | 11 | ||||
-rw-r--r-- | ld/ldgram.y | 23 | ||||
-rw-r--r-- | ld/ldlex.h | 1 | ||||
-rw-r--r-- | ld/ldlex.l | 32 |
4 files changed, 49 insertions, 18 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index 49a0a66..6a91a25 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,5 +1,16 @@ 2014-10-15 Hans-Peter Nilsson <hp@axis.com> + * ldlex.l (INPUTLIST): New start condition. + (comment pattern, ",", "(", ")", "AS_NEEDED") + ({FILENAMECHAR1}{FILENAMECHAR}*, "-l"{FILENAMECHAR}+) + (quoted string pattern, whitespace pattern): Add INPUTLIST to + valid start conditions. + (<INPUTLIST>"="{FILENAMECHAR1}{FILENAMECHAR}*): New NAME rule. + (ldlex_inputlist): New start-condition-setter function. + * ldgram.y (input_list1): Rename from input_list. All recursive + use changed. + (input_list): New wrapper rule for input_list1, setting + INPUTLIST lexer state for the duration of parsing input_list1. * ldlang.c (lang_add_input_file): If the first character in the filename is '=', prepend the sysroot and force the context of that input file to non-sysroot. diff --git a/ld/ldgram.y b/ld/ldgram.y index 4875fa7..e76a0a3 100644 --- a/ld/ldgram.y +++ b/ld/ldgram.y @@ -365,38 +365,43 @@ ifile_p1: ; input_list: + { ldlex_inputlist(); } + input_list1 + { ldlex_popstate(); } + +input_list1: NAME { lang_add_input_file($1,lang_input_file_is_search_file_enum, (char *)NULL); } - | input_list ',' NAME + | input_list1 ',' NAME { lang_add_input_file($3,lang_input_file_is_search_file_enum, (char *)NULL); } - | input_list NAME + | input_list1 NAME { lang_add_input_file($2,lang_input_file_is_search_file_enum, (char *)NULL); } | LNAME { lang_add_input_file($1,lang_input_file_is_l_enum, (char *)NULL); } - | input_list ',' LNAME + | input_list1 ',' LNAME { lang_add_input_file($3,lang_input_file_is_l_enum, (char *)NULL); } - | input_list LNAME + | input_list1 LNAME { lang_add_input_file($2,lang_input_file_is_l_enum, (char *)NULL); } | AS_NEEDED '(' { $<integer>$ = input_flags.add_DT_NEEDED_for_regular; input_flags.add_DT_NEEDED_for_regular = TRUE; } - input_list ')' + input_list1 ')' { input_flags.add_DT_NEEDED_for_regular = $<integer>3; } - | input_list ',' AS_NEEDED '(' + | input_list1 ',' AS_NEEDED '(' { $<integer>$ = input_flags.add_DT_NEEDED_for_regular; input_flags.add_DT_NEEDED_for_regular = TRUE; } - input_list ')' + input_list1 ')' { input_flags.add_DT_NEEDED_for_regular = $<integer>5; } - | input_list AS_NEEDED '(' + | input_list1 AS_NEEDED '(' { $<integer>$ = input_flags.add_DT_NEEDED_for_regular; input_flags.add_DT_NEEDED_for_regular = TRUE; } - input_list ')' + input_list1 ')' { input_flags.add_DT_NEEDED_for_regular = $<integer>4; } ; @@ -161,6 +161,7 @@ extern int yylex (void); extern void lex_push_file (FILE *, const char *, unsigned int); extern void lex_redirect (const char *, const char *, unsigned int); extern void ldlex_script (void); +extern void ldlex_inputlist (void); extern void ldlex_mri_script (void); extern void ldlex_version_script (void); extern void ldlex_version_file (void); @@ -77,6 +77,7 @@ static void lex_warn_invalid (char *where, char *what); /* STATES EXPRESSION definitely in an expression SCRIPT definitely in a script + INPUTLIST definitely in a script, a filename-list BOTH either EXPRESSION or SCRIPT DEFSYMEXP in an argument to -defsym MRI in an MRI script @@ -109,6 +110,7 @@ V_TAG [.$_a-zA-Z][._a-zA-Z0-9]* V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* %s SCRIPT +%s INPUTLIST %s EXPRESSION %s BOTH %s DEFSYMEXP @@ -134,7 +136,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* } } -<BOTH,SCRIPT,EXPRESSION,VERS_START,VERS_NODE,VERS_SCRIPT>"/*" { comment (); } +<BOTH,SCRIPT,EXPRESSION,VERS_START,VERS_NODE,VERS_SCRIPT,INPUTLIST>"/*" { comment (); } <DEFSYMEXP>"-" { RTOKEN('-');} @@ -221,7 +223,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* <BOTH,SCRIPT,EXPRESSION,MRI>"|=" { RTOKEN(OREQ);} <BOTH,SCRIPT,EXPRESSION,MRI>"&&" { RTOKEN(ANDAND);} <BOTH,SCRIPT,EXPRESSION,MRI>">" { RTOKEN('>');} -<BOTH,SCRIPT,EXPRESSION,MRI>"," { RTOKEN(',');} +<BOTH,SCRIPT,EXPRESSION,MRI,INPUTLIST>"," { RTOKEN(',');} <BOTH,SCRIPT,EXPRESSION,MRI>"&" { RTOKEN('&');} <BOTH,SCRIPT,EXPRESSION,MRI>"|" { RTOKEN('|');} <BOTH,SCRIPT,EXPRESSION,MRI>"~" { RTOKEN('~');} @@ -236,8 +238,8 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* <BOTH,SCRIPT,EXPRESSION,MRI>"=" { RTOKEN('=');} <BOTH,SCRIPT,EXPRESSION,MRI>"}" { RTOKEN('}') ; } <BOTH,SCRIPT,EXPRESSION,MRI>"{" { RTOKEN('{'); } -<BOTH,SCRIPT,EXPRESSION,MRI>")" { RTOKEN(')');} -<BOTH,SCRIPT,EXPRESSION,MRI>"(" { RTOKEN('(');} +<BOTH,SCRIPT,EXPRESSION,MRI,INPUTLIST>")" { RTOKEN(')');} +<BOTH,SCRIPT,EXPRESSION,MRI,INPUTLIST>"(" { RTOKEN('(');} <BOTH,SCRIPT,EXPRESSION,MRI>":" { RTOKEN(':'); } <BOTH,SCRIPT,EXPRESSION,MRI>";" { RTOKEN(';');} <BOTH,SCRIPT>"MEMORY" { RTOKEN(MEMORY);} @@ -272,7 +274,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* <BOTH,SCRIPT>"OUTPUT" { RTOKEN(OUTPUT);} <BOTH,SCRIPT>"INPUT" { RTOKEN(INPUT);} <EXPRESSION,BOTH,SCRIPT>"GROUP" { RTOKEN(GROUP);} -<EXPRESSION,BOTH,SCRIPT>"AS_NEEDED" { RTOKEN(AS_NEEDED);} +<EXPRESSION,BOTH,SCRIPT,INPUTLIST>"AS_NEEDED" { RTOKEN(AS_NEEDED);} <EXPRESSION,BOTH,SCRIPT>"DEFINED" { RTOKEN(DEFINED);} <BOTH,SCRIPT>"CREATE_OBJECT_SYMBOLS" { RTOKEN(CREATE_OBJECT_SYMBOLS);} <BOTH,SCRIPT>"CONSTRUCTORS" { RTOKEN( CONSTRUCTORS);} @@ -373,11 +375,16 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* } -<BOTH>{FILENAMECHAR1}{FILENAMECHAR}* { +<BOTH,INPUTLIST>{FILENAMECHAR1}{FILENAMECHAR}* { yylval.name = xstrdup (yytext); return NAME; } -<BOTH>"-l"{FILENAMECHAR}+ { +<INPUTLIST>"="{FILENAMECHAR1}{FILENAMECHAR}* { +/* Filename to be prefixed by --sysroot or when non-sysrooted, nothing. */ + yylval.name = xstrdup (yytext); + return NAME; + } +<BOTH,INPUTLIST>"-l"{FILENAMECHAR}+ { yylval.name = xstrdup (yytext + 2); return LNAME; } @@ -406,7 +413,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* } } -<EXPRESSION,BOTH,SCRIPT,VERS_NODE>"\""[^\"]*"\"" { +<EXPRESSION,BOTH,SCRIPT,VERS_NODE,INPUTLIST>"\""[^\"]*"\"" { /* No matter the state, quotes give what's inside */ yylval.name = xstrdup (yytext + 1); @@ -447,7 +454,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* <VERS_START,VERS_NODE,VERS_SCRIPT>#.* { /* Eat up comments */ } -<VERS_START,VERS_NODE,VERS_SCRIPT>[ \t\r]+ { /* Eat up whitespace */ } +<VERS_START,VERS_NODE,VERS_SCRIPT,INPUTLIST>[ \t\r]+ { /* Eat up whitespace */ } <<EOF>> { include_stack_ptr--; @@ -566,6 +573,13 @@ ldlex_script (void) } void +ldlex_inputlist (void) +{ + *(state_stack_p)++ = yy_start; + BEGIN (INPUTLIST); +} + +void ldlex_mri_script (void) { *(state_stack_p)++ = yy_start; |