X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Fldlex.l;h=2eb8fc1020fbbca22751256b0987176d7047b524;hb=cdf969539c718acb1f3f031b2c55d5274a538717;hp=62610cffed01df987097b0cc9ac13b7c8b60b06c;hpb=53d25da64b00c1cf7f10d04785d66fa003f8bfc9;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/ldlex.l b/ld/ldlex.l index 62610cffed..2eb8fc1020 100644 --- a/ld/ldlex.l +++ b/ld/ldlex.l @@ -1,8 +1,8 @@ +%option nounput + %{ -/* Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - 2000, 2001, 2002, 2003, 2004, 2005, 2007 - Free Software Foundation, Inc. +/* Copyright (C) 1991-2016 Free Software Foundation, Inc. Written by Steve Chamberlain of Cygnus Support. This file is part of the GNU Binutils. @@ -22,7 +22,6 @@ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ -#include "sysdep.h" #include "bfd.h" #include "safe-ctype.h" #include "bfdlink.h" @@ -57,24 +56,28 @@ const char *lex_string = NULL; Otherwise, stack elements 0 through `include_stack_ptr - 1' are valid. */ #undef YY_INPUT -#define YY_INPUT(buf,result,max_size) yy_input (buf, &result, max_size) +#define YY_INPUT(buf,result,max_size) result = yy_input (buf, max_size) +#ifndef YY_NO_UNPUT #define YY_NO_UNPUT +#endif #define MAX_INCLUDE_DEPTH 10 static YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; static const char *file_name_stack[MAX_INCLUDE_DEPTH]; static unsigned int lineno_stack[MAX_INCLUDE_DEPTH]; +static unsigned int sysrooted_stack[MAX_INCLUDE_DEPTH]; static unsigned int include_stack_ptr = 0; static int vers_node_nesting = 0; -static void yy_input (char *, int *, int); +static int yy_input (char *, int); static void comment (void); 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 @@ -98,7 +101,7 @@ 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\/\.\-\_\+\=\$\:\[\]\\\,\~\?\*\^\!] WHITE [ \t\n\r]+ NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~] @@ -107,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 @@ -132,7 +136,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* } } -"/*" { comment (); } +"/*" { comment (); } "-" { RTOKEN('-');} @@ -219,7 +223,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* "|=" { RTOKEN(OREQ);} "&&" { RTOKEN(ANDAND);} ">" { RTOKEN('>');} -"," { RTOKEN(',');} +"," { RTOKEN(',');} "&" { RTOKEN('&');} "|" { RTOKEN('|');} "~" { RTOKEN('~');} @@ -234,11 +238,13 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* "=" { RTOKEN('=');} "}" { RTOKEN('}') ; } "{" { RTOKEN('{'); } -")" { RTOKEN(')');} -"(" { RTOKEN('(');} +")" { RTOKEN(')');} +"(" { RTOKEN('(');} ":" { RTOKEN(':'); } ";" { RTOKEN(';');} "MEMORY" { RTOKEN(MEMORY);} +"REGION_ALIAS" { RTOKEN(REGION_ALIAS);} +"LD_FEATURE" { RTOKEN(LD_FEATURE);} "ORIGIN" { RTOKEN(ORIGIN);} "VERSION" { RTOKEN(VERSIONK);} "BLOCK" { RTOKEN(BLOCK);} @@ -253,6 +259,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);} @@ -267,7 +274,7 @@ 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);} @@ -291,10 +298,13 @@ 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); } "SORT" { RTOKEN(SORT_BY_NAME); } +"SORT_BY_INIT_PRIORITY" { RTOKEN(SORT_BY_INIT_PRIORITY); } +"SORT_NONE" { RTOKEN(SORT_NONE); } "NOLOAD" { RTOKEN(NOLOAD);} "DSECT" { RTOKEN(DSECT);} "COPY" { RTOKEN(COPY);} @@ -307,10 +317,13 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* "org" { RTOKEN(ORIGIN);} "l" { RTOKEN( LENGTH);} "len" { RTOKEN( LENGTH);} -"INCLUDE" { RTOKEN(INCLUDE);} +"INPUT_SECTION_FLAGS" { RTOKEN(INPUT_SECTION_FLAGS); } +"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); } "PROVIDE_HIDDEN" { RTOKEN(PROVIDE_HIDDEN); } "KEEP" { RTOKEN(KEEP); } @@ -363,11 +376,16 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* } -{FILENAMECHAR1}{FILENAMECHAR}* { +{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; } @@ -396,7 +414,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* } } -"\""[^\"]*"\"" { +"\""[^\"]*"\"" { /* No matter the state, quotes give what's inside */ yylval.name = xstrdup (yytext + 1); @@ -433,26 +451,21 @@ 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 (); - } else - { yy_switch_to_buffer (include_stack[include_stack_ptr]); - } - ldfile_input_filename = file_name_stack[include_stack_ptr - 1]; lineno = lineno_stack[include_stack_ptr]; + input_flags.sysrooted = sysrooted_stack[include_stack_ptr]; return END; } @@ -467,7 +480,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* saving the current input info on the include stack. */ void -lex_push_file (FILE *file, const char *name) +lex_push_file (FILE *file, const char *name, unsigned int sysrooted) { if (include_stack_ptr >= MAX_INCLUDE_DEPTH) { @@ -475,10 +488,12 @@ lex_push_file (FILE *file, const char *name) } file_name_stack[include_stack_ptr] = name; lineno_stack[include_stack_ptr] = lineno; + sysrooted_stack[include_stack_ptr] = input_flags.sysrooted; include_stack[include_stack_ptr] = YY_CURRENT_BUFFER; include_stack_ptr++; lineno = 1; + input_flags.sysrooted = sysrooted; yyin = file; yy_switch_to_buffer (yy_create_buffer (yyin, YY_BUF_SIZE)); } @@ -527,7 +542,7 @@ yy_create_string_buffer (const char *string, size_t size) on the include stack. */ void -lex_redirect (const char *string) +lex_redirect (const char *string, const char *fake_filename, unsigned int count) { YY_BUFFER_STATE tmp; @@ -536,11 +551,11 @@ lex_redirect (const char *string) { einfo("%F: macros nested too deeply\n"); } - file_name_stack[include_stack_ptr] = "redirect"; + file_name_stack[include_stack_ptr] = fake_filename; lineno_stack[include_stack_ptr] = lineno; include_stack[include_stack_ptr] = YY_CURRENT_BUFFER; include_stack_ptr++; - lineno = 1; + lineno = count; tmp = yy_create_string_buffer (string, strlen (string)); yy_switch_to_buffer (tmp); } @@ -558,6 +573,13 @@ ldlex_script (void) BEGIN (SCRIPT); } +void +ldlex_inputlist (void) +{ + *(state_stack_p)++ = yy_start; + BEGIN (INPUTLIST); +} + void ldlex_mri_script (void) { @@ -605,24 +627,34 @@ ldlex_popstate (void) { yy_start = *(--state_stack_p); } + +/* Return the current file name, or the previous file if no file is + current. */ + +const char* +ldlex_filename (void) +{ + return file_name_stack[include_stack_ptr - (include_stack_ptr != 0)]; +} -/* Place up to MAX_SIZE characters in BUF and return in *RESULT +/* Place up to MAX_SIZE characters in BUF and return either the number of characters read, or 0 to indicate EOF. */ -static void -yy_input (char *buf, int *result, int max_size) +static int +yy_input (char *buf, int max_size) { - *result = 0; + int result = 0; if (YY_CURRENT_BUFFER->yy_input_file) { if (yyin) { - *result = fread (buf, 1, max_size, yyin); - if (*result < max_size && ferror (yyin)) + result = fread (buf, 1, max_size, yyin); + if (result < max_size && ferror (yyin)) einfo ("%F%P: read in flex scanner failed\n"); } } + return result; } /* Eat the rest of a C-style comment. */ @@ -677,14 +709,14 @@ 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", ldfile_input_filename); + einfo ("%F%s: file not recognized: %E\n", ldlex_filename ()); } if (! ISPRINT (*what)) { - sprintf (buf, "\\%03o", (unsigned int) *what); + sprintf (buf, "\\%03o", *(unsigned char *) what); what = buf; } - einfo ("%P:%S: ignoring invalid character `%s'%s\n", what, where); + einfo ("%P:%S: ignoring invalid character `%s'%s\n", NULL, what, where); }