Allow unquoted = as the first character in ldscript input_list names
authorHans-Peter Nilsson <hp@bitrange.com>
Wed, 15 Oct 2014 01:10:25 +0000 (03:10 +0200)
committerHans-Peter Nilsson <hp@bitrange.com>
Wed, 15 Oct 2014 01:10:25 +0000 (03:10 +0200)
* 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.

ld/ChangeLog
ld/ldgram.y
ld/ldlex.h
ld/ldlex.l

index 49a0a669280ddf2a632ecf23cfc8feb4c842858b..6a91a25942c856275ebd59ec3ad09f1c53c69214 100644 (file)
@@ -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.
index 4875fa7eb79a9e2367ab6e4113b9912179899610..e76a0a3079f6f2fdc83b4a240a0f7fcd9a7195c2 100644 (file)
@@ -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; }
        ;
 
index 63f4c8160230dec32ebd1b0773786d173b30fda9..56cd12162af6b8911896e71453997e51f9de4529 100644 (file)
@@ -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);
index 234867c2ad039a7c57d0cb2defeb32d3583c556f..d1621289d6ee11322defa12844308e012a059e84 100644 (file)
@@ -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--;
@@ -565,6 +572,13 @@ ldlex_script (void)
   BEGIN (SCRIPT);
 }
 
+void
+ldlex_inputlist (void)
+{
+  *(state_stack_p)++ = yy_start;
+  BEGIN (INPUTLIST);
+}
+
 void
 ldlex_mri_script (void)
 {