X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=ld%2Fldlex.l;h=0fcbe84c8b589db28ef9689cda816a7b89d71b6a;hb=53215f214c61b850085196a8d69774eed026ecd9;hp=abe31c01f50377ca2a056390f8576badb96a65c2;hpb=eb8476a6e2fc115c0a953392e61ab27c7568a2a8;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/ldlex.l b/ld/ldlex.l index abe31c01f5..0fcbe84c8b 100644 --- a/ld/ldlex.l +++ b/ld/ldlex.l @@ -1,10 +1,8 @@ -%option nounput +%option nounput noyywrap %{ -/* Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 - Free Software Foundation, Inc. +/* Copyright (C) 1991-2020 Free Software Foundation, Inc. Written by Steve Chamberlain of Cygnus Support. This file is part of the GNU Binutils. @@ -27,6 +25,7 @@ #include "bfd.h" #include "safe-ctype.h" #include "bfdlink.h" +#include "ctf-api.h" #include "ld.h" #include "ldmisc.h" #include "ldexp.h" @@ -41,9 +40,8 @@ yylex and yyparse (indirectly) both check this. */ input_type parser_input; -/* Line number in the current input file. - (FIXME Actually, it doesn't appear to get reset for each file?) */ -unsigned int lineno = 1; +/* Line number in the current input file. */ +unsigned int lineno; /* The string we are currently lexing, or NULL if we are reading a file. */ @@ -79,38 +77,34 @@ 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 + MRI in an MRI script VERS_START starting a Sun style mapfile VERS_SCRIPT a Sun style mapfile VERS_NODE a node within a Sun style mapfile */ #define RTOKEN(x) { yylval.token = x; return x; } -/* Some versions of flex want this. */ -#ifndef yywrap -int yywrap (void) { return 1; } -#endif %} %a 4000 %o 5000 -CMDFILENAMECHAR [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\-\~] -CMDFILENAMECHAR1 [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\~] -FILENAMECHAR1 [_a-zA-Z\/\.\\\$\_\~] -SYMBOLCHARN [_a-zA-Z\/\.\\\$\_\~0-9] -FILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\\,\~] -WILDCHAR [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\\,\~\?\*\^\!] +WILDCHAR [_a-zA-Z0-9\/\.\\\$\~\-\+\:\[\]\,\=\?\*\^\!] +FILENAMECHAR [_a-zA-Z0-9\/\.\\\$\~\-\+\:\[\]\,\=] +NOCFILENAMECHAR [_a-zA-Z0-9\/\.\\\$\~\-\+\:\[\]] +SYMBOLNAMECHAR [_a-zA-Z0-9\/\.\\\$\~] +FILENAMECHAR1 [_a-zA-Z\/\.\\\$\~] +SYMBOLNAMECHAR1 [_a-zA-Z\.\\\$] WHITE [ \t\n\r]+ -NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~] - 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 @@ -136,16 +130,17 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* } } -"/*" { comment (); } +"/*" { comment (); } -"-" { RTOKEN('-');} -"+" { RTOKEN('+');} -{FILENAMECHAR1}{SYMBOLCHARN}* { yylval.name = xstrdup (yytext); return NAME; } -"=" { RTOKEN('='); } +"-" { RTOKEN('-');} +"+" { RTOKEN('+');} +{SYMBOLNAMECHAR1}{SYMBOLNAMECHAR}* { yylval.name = xstrdup (yytext); + return NAME; } +"=" { RTOKEN('='); } "$"([0-9A-Fa-f])+ { - yylval.integer = bfd_scan_vma (yytext + 1, 0, 16); + yylval.integer = bfd_scan_vma (yytext + 1, 0, 16); yylval.bigint.str = NULL; return INT; } @@ -223,7 +218,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* "|=" { RTOKEN(OREQ);} "&&" { RTOKEN(ANDAND);} ">" { RTOKEN('>');} -"," { RTOKEN(',');} +"," { RTOKEN(',');} "&" { RTOKEN('&');} "|" { RTOKEN('|');} "~" { RTOKEN('~');} @@ -235,11 +230,11 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* "/" { RTOKEN('/');} "%" { RTOKEN('%');} "<" { RTOKEN('<');} -"=" { RTOKEN('=');} +"=" { RTOKEN('=');} "}" { RTOKEN('}') ; } "{" { RTOKEN('{'); } -")" { RTOKEN(')');} -"(" { RTOKEN('(');} +")" { RTOKEN(')');} +"(" { RTOKEN('(');} ":" { RTOKEN(':'); } ";" { RTOKEN(';');} "MEMORY" { RTOKEN(MEMORY);} @@ -259,6 +254,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* "ALIGNOF" { RTOKEN(ALIGNOF); } "MAX" { RTOKEN(MAX_K); } "MIN" { RTOKEN(MIN_K); } +"LOG2CEIL" { RTOKEN(LOG2CEIL); } "ASSERT" { RTOKEN(ASSERT_K); } "ENTRY" { RTOKEN(ENTRY);} "EXTERN" { RTOKEN(EXTERN);} @@ -273,11 +269,12 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* "OUTPUT" { RTOKEN(OUTPUT);} "INPUT" { RTOKEN(INPUT);} "GROUP" { RTOKEN(GROUP);} -"AS_NEEDED" { RTOKEN(AS_NEEDED);} +"AS_NEEDED" { RTOKEN(AS_NEEDED);} "DEFINED" { RTOKEN(DEFINED);} "CREATE_OBJECT_SYMBOLS" { RTOKEN(CREATE_OBJECT_SYMBOLS);} "CONSTRUCTORS" { RTOKEN( CONSTRUCTORS);} "FORCE_COMMON_ALLOCATION" { RTOKEN(FORCE_COMMON_ALLOCATION);} +"FORCE_GROUP_ALLOCATION" { RTOKEN(FORCE_GROUP_ALLOCATION);} "INHIBIT_COMMON_ALLOCATION" { RTOKEN(INHIBIT_COMMON_ALLOCATION);} "SECTIONS" { RTOKEN(SECTIONS);} "INSERT" { RTOKEN(INSERT_K);} @@ -297,6 +294,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* "BYTE" { RTOKEN( BYTE);} "NOFLOAT" { RTOKEN(NOFLOAT);} "NOCROSSREFS" { RTOKEN(NOCROSSREFS);} +"NOCROSSREFS_TO" { RTOKEN(NOCROSSREFS_TO);} "OVERLAY" { RTOKEN(OVERLAY); } "SORT_BY_NAME" { RTOKEN(SORT_BY_NAME); } "SORT_BY_ALIGNMENT" { RTOKEN(SORT_BY_ALIGNMENT); } @@ -319,6 +317,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* "INCLUDE" { RTOKEN(INCLUDE);} "PHDRS" { RTOKEN (PHDRS); } "AT" { RTOKEN(AT);} +"ALIGN_WITH_INPUT" { RTOKEN(ALIGN_WITH_INPUT);} "SUBALIGN" { RTOKEN(SUBALIGN);} "HIDDEN" { RTOKEN(HIDDEN); } "PROVIDE" { RTOKEN(PROVIDE); } @@ -327,62 +326,71 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* "EXCLUDE_FILE" { RTOKEN(EXCLUDE_FILE); } "CONSTANT" { RTOKEN(CONSTANT);} "#".*\n? { ++ lineno; } -"\n" { ++ lineno; RTOKEN(NEWLINE); } +"\n" { ++ lineno; RTOKEN(NEWLINE); } "*".* { /* Mri comment line */ } ";".* { /* Mri comment line */ } -"END" { RTOKEN(ENDWORD); } +"END" { RTOKEN(ENDWORD); } "ALIGNMOD" { RTOKEN(ALIGNMOD);} "ALIGN" { RTOKEN(ALIGN_K);} -"CHIP" { RTOKEN(CHIP); } -"BASE" { RTOKEN(BASE); } -"ALIAS" { RTOKEN(ALIAS); } -"TRUNCATE" { RTOKEN(TRUNCATE); } -"LOAD" { RTOKEN(LOAD); } -"PUBLIC" { RTOKEN(PUBLIC); } -"ORDER" { RTOKEN(ORDER); } -"NAME" { RTOKEN(NAMEWORD); } -"FORMAT" { RTOKEN(FORMAT); } -"CASE" { RTOKEN(CASE); } -"START" { RTOKEN(START); } -"LIST".* { RTOKEN(LIST); /* LIST and ignore to end of line */ } +"CHIP" { RTOKEN(CHIP); } +"BASE" { RTOKEN(BASE); } +"ALIAS" { RTOKEN(ALIAS); } +"TRUNCATE" { RTOKEN(TRUNCATE); } +"LOAD" { RTOKEN(LOAD); } +"PUBLIC" { RTOKEN(PUBLIC); } +"ORDER" { RTOKEN(ORDER); } +"NAME" { RTOKEN(NAMEWORD); } +"FORMAT" { RTOKEN(FORMAT); } +"CASE" { RTOKEN(CASE); } +"START" { RTOKEN(START); } +"LIST".* { RTOKEN(LIST); /* LIST and ignore to end of line */ } "SECT" { RTOKEN(SECT); } "ABSOLUTE" { RTOKEN(ABSOLUTE); } -"end" { RTOKEN(ENDWORD); } +"end" { RTOKEN(ENDWORD); } "alignmod" { RTOKEN(ALIGNMOD);} "align" { RTOKEN(ALIGN_K);} -"chip" { RTOKEN(CHIP); } -"base" { RTOKEN(BASE); } -"alias" { RTOKEN(ALIAS); } -"truncate" { RTOKEN(TRUNCATE); } -"load" { RTOKEN(LOAD); } -"public" { RTOKEN(PUBLIC); } -"order" { RTOKEN(ORDER); } -"name" { RTOKEN(NAMEWORD); } -"format" { RTOKEN(FORMAT); } -"case" { RTOKEN(CASE); } -"extern" { RTOKEN(EXTERN); } -"start" { RTOKEN(START); } -"list".* { RTOKEN(LIST); /* LIST and ignore to end of line */ } +"chip" { RTOKEN(CHIP); } +"base" { RTOKEN(BASE); } +"alias" { RTOKEN(ALIAS); } +"truncate" { RTOKEN(TRUNCATE); } +"load" { RTOKEN(LOAD); } +"public" { RTOKEN(PUBLIC); } +"order" { RTOKEN(ORDER); } +"name" { RTOKEN(NAMEWORD); } +"format" { RTOKEN(FORMAT); } +"case" { RTOKEN(CASE); } +"extern" { RTOKEN(EXTERN); } +"start" { RTOKEN(START); } +"list".* { RTOKEN(LIST); /* LIST and ignore to end of line */ } "sect" { RTOKEN(SECT); } "absolute" { RTOKEN(ABSOLUTE); } {FILENAMECHAR1}{NOCFILENAMECHAR}* { /* Filename without commas, needed to parse mri stuff */ - yylval.name = xstrdup (yytext); + yylval.name = xstrdup (yytext); return NAME; } -{FILENAMECHAR1}{FILENAMECHAR}* { - yylval.name = xstrdup (yytext); +{FILENAMECHAR1}{FILENAMECHAR}* { + yylval.name = xstrdup (yytext); + return NAME; + } +"="{FILENAMECHAR1}{FILENAMECHAR}* { +/* Filename to be prefixed by --sysroot or when non-sysrooted, nothing. */ + yylval.name = xstrdup (yytext); return NAME; } -"-l"{FILENAMECHAR}+ { +"-l"{FILENAMECHAR}+ { yylval.name = xstrdup (yytext + 2); return LNAME; } -{FILENAMECHAR1}{NOCFILENAMECHAR}* { - yylval.name = xstrdup (yytext); +{SYMBOLNAMECHAR1}{NOCFILENAMECHAR}* { + yylval.name = xstrdup (yytext); + return NAME; + } +"/DISCARD/" { + yylval.name = xstrdup (yytext); return NAME; } "-l"{NOCFILENAMECHAR}+ { @@ -406,11 +414,17 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* } } -"\""[^\"]*"\"" { +"\""[^\"]*"\"" { /* No matter the state, quotes - give what's inside */ + give what's inside. */ + bfd_size_type len; yylval.name = xstrdup (yytext + 1); - yylval.name[yyleng - 2] = 0; + /* PR ld/20906. A corrupt input file + can contain bogus strings. */ + len = strlen (yylval.name); + if (len > (bfd_size_type) yyleng - 2) + len = yyleng - 2; + yylval.name[len] = 0; return NAME; } "\n" { lineno++;} @@ -443,16 +457,19 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* return *yytext; } -[\n] { lineno++; } +[\n] { lineno++; } #.* { /* Eat up comments */ } -[ \t\r]+ { /* Eat up whitespace */ } +[ \t\r]+ { /* Eat up whitespace */ } <> { include_stack_ptr--; if (include_stack_ptr == 0) - yyterminate (); + { + lineno = 0; + yyterminate (); + } else yy_switch_to_buffer (include_stack[include_stack_ptr]); @@ -476,7 +493,7 @@ lex_push_file (FILE *file, const char *name, unsigned int sysrooted) { if (include_stack_ptr >= MAX_INCLUDE_DEPTH) { - einfo ("%F:includes nested too deeply\n"); + einfo (_("%F:includes nested too deeply\n")); } file_name_stack[include_stack_ptr] = name; lineno_stack[include_stack_ptr] = lineno; @@ -541,7 +558,7 @@ lex_redirect (const char *string, const char *fake_filename, unsigned int count) yy_init = 0; if (include_stack_ptr >= MAX_INCLUDE_DEPTH) { - einfo("%F: macros nested too deeply\n"); + einfo (_("%F: macros nested too deeply\n")); } file_name_stack[include_stack_ptr] = fake_filename; lineno_stack[include_stack_ptr] = lineno; @@ -565,6 +582,13 @@ ldlex_script (void) BEGIN (SCRIPT); } +void +ldlex_inputlist (void) +{ + *(state_stack_p)++ = yy_start; + BEGIN (INPUTLIST); +} + void ldlex_mri_script (void) { @@ -636,7 +660,7 @@ yy_input (char *buf, int max_size) { result = fread (buf, 1, max_size, yyin); if (result < max_size && ferror (yyin)) - einfo ("%F%P: read in flex scanner failed\n"); + einfo (_("%F%P: read in flex scanner failed\n")); } } return result; @@ -650,33 +674,33 @@ comment (void) int c; while (1) - { - c = input(); - while (c != '*' && c != EOF) { - if (c == '\n') - lineno++; c = input(); - } + while (c != '*' && c != 0) + { + if (c == '\n') + lineno++; + c = input(); + } - if (c == '*') - { - c = input(); - while (c == '*') - c = input(); - if (c == '/') - break; /* found the end */ - } + if (c == '*') + { + c = input(); + while (c == '*') + c = input(); + if (c == '/') + break; /* found the end */ + } - if (c == '\n') - lineno++; + if (c == '\n') + lineno++; - if (c == EOF) - { - einfo( "%F%P: EOF in comment\n"); - break; + if (c == 0) + { + einfo (_("%F%P: EOF in comment\n")); + break; + } } - } } /* Warn the user about a garbage character WHAT in the input @@ -694,7 +718,7 @@ lex_warn_invalid (char *where, char *what) if (ldfile_assumed_script) { bfd_set_error (bfd_error_file_not_recognized); - einfo ("%F%s: file not recognized: %E\n", ldlex_filename ()); + einfo (_("%F%s: file not recognized: %E\n"), ldlex_filename ()); } if (! ISPRINT (*what)) @@ -703,5 +727,5 @@ lex_warn_invalid (char *where, char *what) what = buf; } - einfo ("%P:%S: ignoring invalid character `%s'%s\n", NULL, what, where); + einfo (_("%P:%pS: ignoring invalid character `%s'%s\n"), NULL, what, where); }