X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=ld%2Fldlex.l;h=a0563151c879fe1020acd72e4c0e11e1434859ae;hb=99ad839030c1177eb409a99320fa7e60226f0db3;hp=eebb950bb315909d6b30e6a99aaeafa2d287006c;hpb=3882b010780ca1aa1ed5d7b38e936cd2d6d5486b;p=binutils-gdb.git diff --git a/ld/ldlex.l b/ld/ldlex.l index eebb950bb31..a0563151c87 100644 --- a/ld/ldlex.l +++ b/ld/ldlex.l @@ -1,24 +1,24 @@ %{ -/* Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 - Free Software Foundation, Inc. +/* Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, + 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. -This file is part of GLD, the Gnu Linker. + This file is part of GLD, the Gnu Linker. -GLD is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. + GLD is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. -GLD is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + GLD is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with GLD; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ + You should have received a copy of the GNU General Public License + along with GLD; see the file COPYING. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ /* This was written by steve chamberlain @@ -26,22 +26,17 @@ This was written by steve chamberlain */ -#include #include -#ifdef MPW -/* Prevent enum redefinition problems. */ -#define TRUE_FALSE_ALREADY_DEFINED -#endif /* MPW */ - #include "bfd.h" #include "sysdep.h" #include "safe-ctype.h" +#include "bfdlink.h" #include "ld.h" -#include "ldgram.h" #include "ldmisc.h" #include "ldexp.h" #include "ldlang.h" +#include #include "ldfile.h" #include "ldlex.h" #include "ldmain.h" @@ -68,7 +63,9 @@ 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) yy_input (buf, &result, max_size) + +#define YY_NO_UNPUT #define MAX_INCLUDE_DEPTH 10 static YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; @@ -77,14 +74,11 @@ static unsigned int lineno_stack[MAX_INCLUDE_DEPTH]; static unsigned int include_stack_ptr = 0; static int vers_node_nesting = 0; -static YY_BUFFER_STATE yy_create_string_buffer PARAMS ((const char *string, - size_t size)); -static void yy_input PARAMS ((char *, int *result, int max_size)); - -static void comment PARAMS ((void)); -static void lex_warn_invalid PARAMS ((char *where, char *what)); +static void yy_input (char *, int *, int); +static void comment (void); +static void lex_warn_invalid (char *where, char *what); -/* STATES +/* STATES EXPRESSION definitely in an expression SCRIPT definitely in a script BOTH either EXPRESSION or SCRIPT @@ -98,7 +92,7 @@ static void lex_warn_invalid PARAMS ((char *where, char *what)); /* Some versions of flex want this. */ #ifndef yywrap -int yywrap () { return 1; } +int yywrap (void) { return 1; } #endif %} @@ -111,12 +105,12 @@ FILENAMECHAR1 [_a-zA-Z\/\.\\\$\_\~] SYMBOLCHARN [_a-zA-Z\/\.\\\$\_\~0-9] FILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\\,\~] WILDCHAR [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\\,\~\?\*] -WHITE [ \t\n\r]+ +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]|::)* +V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* %s SCRIPT %s EXPRESSION @@ -138,28 +132,30 @@ V_IDENTIFIER [*?.$_a-zA-Z]([*?.$_a-zA-Z0-9]|::)* case input_script: return INPUT_SCRIPT; break; case input_mri_script: return INPUT_MRI_SCRIPT; break; case input_version_script: return INPUT_VERSION_SCRIPT; break; + case input_dynamic_list: return INPUT_DYNAMIC_LIST; break; case input_defsym: return INPUT_DEFSYM; break; default: abort (); } } -"/*" { comment(); } +"/*" { comment (); } "-" { RTOKEN('-');} "+" { RTOKEN('+');} -{FILENAMECHAR1}{SYMBOLCHARN}* { yylval.name = xstrdup(yytext); return NAME; } +{FILENAMECHAR1}{SYMBOLCHARN}* { 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; } ([0-9A-Fa-f])+(H|h|X|x|B|b|O|o|D|d) { int ibase ; - switch (yytext[yyleng-1]) { - case 'X': + switch (yytext[yyleng - 1]) { + case 'X': case 'x': case 'H': case 'h': @@ -178,20 +174,36 @@ V_IDENTIFIER [*?.$_a-zA-Z]([*?.$_a-zA-Z0-9]|::)* } yylval.integer = bfd_scan_vma (yytext, 0, ibase); + yylval.bigint.str = NULL; return INT; } -((("$"|"0x")([0-9A-Fa-f])+)|(([0-9])+))(M|K|m|k)? { +((("$"|0[xX])([0-9A-Fa-f])+)|(([0-9])+))(M|K|m|k)? { char *s = yytext; + int ibase = 0; if (*s == '$') - ++s; - yylval.integer = bfd_scan_vma (s, 0, 0); - if (yytext[yyleng-1] == 'M' - || yytext[yyleng-1] == 'm') - yylval.integer *= 1024 * 1024; - if (yytext[yyleng-1] == 'K' - || yytext[yyleng-1]=='k') - yylval.integer *= 1024; + { + ++s; + ibase = 16; + } + yylval.integer = bfd_scan_vma (s, 0, ibase); + yylval.bigint.str = NULL; + if (yytext[yyleng - 1] == 'M' + || yytext[yyleng - 1] == 'm') + { + yylval.integer *= 1024 * 1024; + } + else if (yytext[yyleng - 1] == 'K' + || yytext[yyleng - 1]=='k') + { + yylval.integer *= 1024; + } + else if (yytext[0] == '0' + && (yytext[1] == 'x' + || yytext[1] == 'X')) + { + yylval.bigint.str = xstrdup (yytext + 2); + } return INT; } "]" { RTOKEN(']');} @@ -225,84 +237,98 @@ V_IDENTIFIER [*?.$_a-zA-Z]([*?.$_a-zA-Z0-9]|::)* "/" { RTOKEN('/');} "%" { RTOKEN('%');} "<" { RTOKEN('<');} -"=" { RTOKEN('=');} -"}" { RTOKEN('}') ; } -"{" { RTOKEN('{'); } -")" { RTOKEN(')');} -"(" { RTOKEN('(');} +"=" { RTOKEN('=');} +"}" { RTOKEN('}') ; } +"{" { RTOKEN('{'); } +")" { RTOKEN(')');} +"(" { RTOKEN('(');} ":" { RTOKEN(':'); } ";" { RTOKEN(';');} -"MEMORY" { RTOKEN(MEMORY);} -"ORIGIN" { RTOKEN(ORIGIN);} -"VERSION" { RTOKEN(VERSIONK);} +"MEMORY" { RTOKEN(MEMORY);} +"ORIGIN" { RTOKEN(ORIGIN);} +"VERSION" { RTOKEN(VERSIONK);} "BLOCK" { RTOKEN(BLOCK);} "BIND" { RTOKEN(BIND);} -"LENGTH" { RTOKEN(LENGTH);} -"ALIGN" { RTOKEN(ALIGN_K);} -"ADDR" { RTOKEN(ADDR);} -"LOADADDR" { RTOKEN(LOADADDR);} +"LENGTH" { RTOKEN(LENGTH);} +"ALIGN" { RTOKEN(ALIGN_K);} +"DATA_SEGMENT_ALIGN" { RTOKEN(DATA_SEGMENT_ALIGN);} +"DATA_SEGMENT_RELRO_END" { RTOKEN(DATA_SEGMENT_RELRO_END);} +"DATA_SEGMENT_END" { RTOKEN(DATA_SEGMENT_END);} +"ADDR" { RTOKEN(ADDR);} +"LOADADDR" { RTOKEN(LOADADDR);} "MAX" { RTOKEN(MAX_K); } "MIN" { RTOKEN(MIN_K); } "ASSERT" { RTOKEN(ASSERT_K); } "ENTRY" { RTOKEN(ENTRY);} "EXTERN" { RTOKEN(EXTERN);} -"NEXT" { RTOKEN(NEXT);} +"NEXT" { RTOKEN(NEXT);} "sizeof_headers" { RTOKEN(SIZEOF_HEADERS);} "SIZEOF_HEADERS" { RTOKEN(SIZEOF_HEADERS);} +"SEGMENT_START" { RTOKEN(SEGMENT_START);} "MAP" { RTOKEN(MAP);} -"SIZEOF" { RTOKEN(SIZEOF);} -"TARGET" { RTOKEN(TARGET_K);} +"SIZEOF" { RTOKEN(SIZEOF);} +"TARGET" { RTOKEN(TARGET_K);} "SEARCH_DIR" { RTOKEN(SEARCH_DIR);} -"OUTPUT" { RTOKEN(OUTPUT);} +"OUTPUT" { RTOKEN(OUTPUT);} "INPUT" { RTOKEN(INPUT);} "GROUP" { RTOKEN(GROUP);} -"DEFINED" { RTOKEN(DEFINED);} +"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);} -"SECTIONS" { RTOKEN(SECTIONS);} +"FORCE_COMMON_ALLOCATION" { RTOKEN(FORCE_COMMON_ALLOCATION);} +"INHIBIT_COMMON_ALLOCATION" { RTOKEN(INHIBIT_COMMON_ALLOCATION);} +"SECTIONS" { RTOKEN(SECTIONS);} "FILL" { RTOKEN(FILL);} -"STARTUP" { RTOKEN(STARTUP);} +"STARTUP" { RTOKEN(STARTUP);} "OUTPUT_FORMAT" { RTOKEN(OUTPUT_FORMAT);} "OUTPUT_ARCH" { RTOKEN( OUTPUT_ARCH);} "HLL" { RTOKEN(HLL);} -"SYSLIB" { RTOKEN(SYSLIB);} +"SYSLIB" { RTOKEN(SYSLIB);} "FLOAT" { RTOKEN(FLOAT);} "QUAD" { RTOKEN( QUAD);} "SQUAD" { RTOKEN( SQUAD);} "LONG" { RTOKEN( LONG);} "SHORT" { RTOKEN( SHORT);} "BYTE" { RTOKEN( BYTE);} -"NOFLOAT" { RTOKEN(NOFLOAT);} +"NOFLOAT" { RTOKEN(NOFLOAT);} "NOCROSSREFS" { RTOKEN(NOCROSSREFS);} "OVERLAY" { RTOKEN(OVERLAY); } -"SORT" { RTOKEN(SORT); } +"SORT_BY_NAME" { RTOKEN(SORT_BY_NAME); } +"SORT_BY_ALIGNMENT" { RTOKEN(SORT_BY_ALIGNMENT); } +"SORT" { RTOKEN(SORT_BY_NAME); } "NOLOAD" { RTOKEN(NOLOAD);} "DSECT" { RTOKEN(DSECT);} "COPY" { RTOKEN(COPY);} "INFO" { RTOKEN(INFO);} "OVERLAY" { RTOKEN(OVERLAY);} +"ONLY_IF_RO" { RTOKEN(ONLY_IF_RO); } +"ONLY_IF_RW" { RTOKEN(ONLY_IF_RW); } +"SPECIAL" { RTOKEN(SPECIAL); } "o" { RTOKEN(ORIGIN);} "org" { RTOKEN(ORIGIN);} "l" { RTOKEN( LENGTH);} "len" { RTOKEN( LENGTH);} "INCLUDE" { RTOKEN(INCLUDE);} "PHDRS" { RTOKEN (PHDRS); } -"AT" { RTOKEN(AT);} -"PROVIDE" { RTOKEN(PROVIDE); } +"AT" { RTOKEN(AT);} +"SUBALIGN" { RTOKEN(SUBALIGN);} +"PROVIDE" { RTOKEN(PROVIDE); } +"PROVIDE_HIDDEN" { RTOKEN(PROVIDE_HIDDEN); } "KEEP" { RTOKEN(KEEP); } -"EXCLUDE_FILE" { RTOKEN(EXCLUDE_FILE); } +"EXCLUDE_FILE" { RTOKEN(EXCLUDE_FILE); } +"CONSTANT" { RTOKEN(CONSTANT);} "#".*\n? { ++ lineno; } "\n" { ++ lineno; RTOKEN(NEWLINE); } "*".* { /* Mri comment line */ } ";".* { /* Mri comment line */ } "END" { RTOKEN(ENDWORD); } -"ALIGNMOD" { RTOKEN(ALIGNMOD);} -"ALIGN" { RTOKEN(ALIGN_K);} +"ALIGNMOD" { RTOKEN(ALIGNMOD);} +"ALIGN" { RTOKEN(ALIGN_K);} "CHIP" { RTOKEN(CHIP); } "BASE" { RTOKEN(BASE); } -"ALIAS" { RTOKEN(ALIAS); } -"TRUNCATE" { RTOKEN(TRUNCATE); } +"ALIAS" { RTOKEN(ALIAS); } +"TRUNCATE" { RTOKEN(TRUNCATE); } "LOAD" { RTOKEN(LOAD); } "PUBLIC" { RTOKEN(PUBLIC); } "ORDER" { RTOKEN(ORDER); } @@ -314,12 +340,12 @@ V_IDENTIFIER [*?.$_a-zA-Z]([*?.$_a-zA-Z0-9]|::)* "SECT" { RTOKEN(SECT); } "ABSOLUTE" { RTOKEN(ABSOLUTE); } "end" { RTOKEN(ENDWORD); } -"alignmod" { RTOKEN(ALIGNMOD);} -"align" { RTOKEN(ALIGN_K);} +"alignmod" { RTOKEN(ALIGNMOD);} +"align" { RTOKEN(ALIGN_K);} "chip" { RTOKEN(CHIP); } "base" { RTOKEN(BASE); } -"alias" { RTOKEN(ALIAS); } -"truncate" { RTOKEN(TRUNCATE); } +"alias" { RTOKEN(ALIAS); } +"truncate" { RTOKEN(TRUNCATE); } "load" { RTOKEN(LOAD); } "public" { RTOKEN(PUBLIC); } "order" { RTOKEN(ORDER); } @@ -334,13 +360,13 @@ V_IDENTIFIER [*?.$_a-zA-Z]([*?.$_a-zA-Z0-9]|::)* {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); + yylval.name = xstrdup (yytext); return NAME; } "-l"{FILENAMECHAR}+ { @@ -354,12 +380,12 @@ V_IDENTIFIER [*?.$_a-zA-Z]([*?.$_a-zA-Z0-9]|::)* try again. */ if (yytext[0] == '/' && yytext[1] == '*') { - yyless(2); + yyless (2); comment (); } else { - yylval.name = xstrdup(yytext); + yylval.name = xstrdup (yytext); return NAME; } } @@ -367,8 +393,8 @@ V_IDENTIFIER [*?.$_a-zA-Z]([*?.$_a-zA-Z0-9]|::)* "\""[^\"]*"\"" { /* No matter the state, quotes give what's inside */ - yylval.name = xstrdup(yytext+1); - yylval.name[yyleng-2] = 0; + yylval.name = xstrdup (yytext + 1); + yylval.name[yyleng - 2] = 0; return NAME; } "\n" { lineno++;} @@ -390,7 +416,7 @@ V_IDENTIFIER [*?.$_a-zA-Z]([*?.$_a-zA-Z0-9]|::)* "{" { BEGIN(VERS_SCRIPT); return *yytext; } -"{" { BEGIN(VERS_NODE); +"{" { BEGIN(VERS_NODE); vers_node_nesting = 0; return *yytext; } @@ -409,26 +435,25 @@ V_IDENTIFIER [*?.$_a-zA-Z]([*?.$_a-zA-Z0-9]|::)* <> { include_stack_ptr--; - - if (include_stack_ptr == 0) + + if (include_stack_ptr == 0) { - yyterminate(); + yyterminate (); } - else + else { - yy_switch_to_buffer(include_stack[include_stack_ptr]); - + yy_switch_to_buffer (include_stack[include_stack_ptr]); } - BEGIN(SCRIPT); + ldfile_input_filename = file_name_stack[include_stack_ptr - 1]; - lineno = lineno_stack[include_stack_ptr - 1]; + lineno = lineno_stack[include_stack_ptr]; return END; } -. lex_warn_invalid(" in script", yytext); -. lex_warn_invalid(" in expression", yytext); - +. lex_warn_invalid (" in script", yytext); +. lex_warn_invalid (" in expression", yytext); + %% @@ -436,42 +461,38 @@ V_IDENTIFIER [*?.$_a-zA-Z]([*?.$_a-zA-Z0-9]|::)* saving the current input info on the include stack. */ void -lex_push_file (file, name) - FILE *file; - const char *name; +lex_push_file (FILE *file, const char *name) { - if (include_stack_ptr >= MAX_INCLUDE_DEPTH) + 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] = 1; + lineno_stack[include_stack_ptr] = lineno; include_stack[include_stack_ptr] = YY_CURRENT_BUFFER; include_stack_ptr++; + lineno = 1; yyin = file; - yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE)); - BEGIN (SCRIPT); + yy_switch_to_buffer (yy_create_buffer (yyin, YY_BUF_SIZE)); } /* Return a newly created flex input buffer containing STRING, which is SIZE bytes long. */ -static YY_BUFFER_STATE -yy_create_string_buffer (string, size) - CONST char *string; - size_t size; +static YY_BUFFER_STATE +yy_create_string_buffer (const char *string, size_t size) { YY_BUFFER_STATE b; /* Calls to m-alloc get turned by sed into xm-alloc. */ - b = (YY_BUFFER_STATE) malloc (sizeof (struct yy_buffer_state)); + b = malloc (sizeof (struct yy_buffer_state)); b->yy_input_file = 0; b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because we need to put in 2 end-of-buffer characters. */ - b->yy_ch_buf = (char *) malloc ((unsigned) (b->yy_buf_size + 3)); + b->yy_ch_buf = malloc ((unsigned) (b->yy_buf_size + 3)); b->yy_ch_buf[0] = '\n'; strcpy (b->yy_ch_buf+1, string); @@ -500,23 +521,22 @@ yy_create_string_buffer (string, size) on the include stack. */ void -lex_redirect (string) - CONST char *string; +lex_redirect (const char *string) { YY_BUFFER_STATE tmp; yy_init = 0; - if (include_stack_ptr >= MAX_INCLUDE_DEPTH) + if (include_stack_ptr >= MAX_INCLUDE_DEPTH) { einfo("%F: macros nested too deeply\n"); } file_name_stack[include_stack_ptr] = "redirect"; - lineno_stack[include_stack_ptr] = 0; + lineno_stack[include_stack_ptr] = lineno; include_stack[include_stack_ptr] = YY_CURRENT_BUFFER; include_stack_ptr++; + lineno = 1; tmp = yy_create_string_buffer (string, strlen (string)); yy_switch_to_buffer (tmp); - BEGIN (SCRIPT); } /* Functions to switch to a different flex start condition, @@ -526,56 +546,56 @@ static int state_stack[MAX_INCLUDE_DEPTH * 2]; static int *state_stack_p = state_stack; void -ldlex_script () +ldlex_script (void) { *(state_stack_p)++ = yy_start; BEGIN (SCRIPT); } void -ldlex_mri_script () +ldlex_mri_script (void) { *(state_stack_p)++ = yy_start; BEGIN (MRI); } void -ldlex_version_script () +ldlex_version_script (void) { *(state_stack_p)++ = yy_start; BEGIN (VERS_START); } void -ldlex_version_file () +ldlex_version_file (void) { *(state_stack_p)++ = yy_start; BEGIN (VERS_SCRIPT); } void -ldlex_defsym () +ldlex_defsym (void) { *(state_stack_p)++ = yy_start; BEGIN (DEFSYMEXP); } - + void -ldlex_expression () +ldlex_expression (void) { *(state_stack_p)++ = yy_start; BEGIN (EXPRESSION); } void -ldlex_both () +ldlex_both (void) { *(state_stack_p)++ = yy_start; BEGIN (BOTH); } void -ldlex_popstate () +ldlex_popstate (void) { yy_start = *(--state_stack_p); } @@ -585,18 +605,15 @@ ldlex_popstate () either the number of characters read, or 0 to indicate EOF. */ static void -yy_input (buf, result, max_size) - char *buf; - int *result; - int max_size; +yy_input (char *buf, int *result, int max_size) { - *result = 0; - if (yy_current_buffer->yy_input_file) + *result = 0; + if (YY_CURRENT_BUFFER->yy_input_file) { if (yyin) { - *result = read (fileno (yyin), (char *) buf, max_size); - if (*result < 0) + *result = fread (buf, 1, max_size, yyin); + if (*result < max_size && ferror (yyin)) einfo ("%F%P: read in flex scanner failed\n"); } } @@ -605,14 +622,14 @@ yy_input (buf, result, max_size) /* Eat the rest of a C-style comment. */ static void -comment () +comment (void) { int c; while (1) { c = input(); - while (c != '*' && c != EOF) + while (c != '*' && c != EOF) { if (c == '\n') lineno++; @@ -643,8 +660,7 @@ comment () in context WHERE. */ static void -lex_warn_invalid (where, what) - char *where, *what; +lex_warn_invalid (char *where, char *what) { char buf[5];