%{ /* Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. 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 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. */ /* This was written by steve chamberlain sac@cygnus.com */ #include "ansidecl.h" #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 "ldmisc.h" #include "ldexp.h" #include "ldlang.h" #include #include "ldfile.h" #include "ldlex.h" #include "ldmain.h" #include "libiberty.h" /* The type of top-level parser input. 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; /* The string we are currently lexing, or NULL if we are reading a file. */ const char *lex_string = NULL; /* Support for flex reading from more than one input file (stream). `include_stack' is flex's input state for each open file; `file_name_stack' is the file names. `lineno_stack' is the current line numbers. If `include_stack_ptr' is 0, we haven't started reading anything yet. 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 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 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)); /* STATES EXPRESSION definitely in an expression SCRIPT definitely in a script BOTH either EXPRESSION or SCRIPT DEFSYMEXP in an argument to -defsym 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 () { 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\/\.\-\_\+\=\$\:\[\]\\\,\~\?\*] 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 EXPRESSION %s BOTH %s DEFSYMEXP %s MRI %s VERS_START %s VERS_SCRIPT %s VERS_NODE %% if (parser_input != input_selected) { /* The first token of the input determines the initial parser state. */ input_type t = parser_input; parser_input = input_selected; switch (t) { 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_defsym: return INPUT_DEFSYM; break; default: abort (); } } "/*" { comment(); } "-" { RTOKEN('-');} "+" { RTOKEN('+');} {FILENAMECHAR1}{SYMBOLCHARN}* { yylval.name = xstrdup(yytext); return NAME; } "=" { RTOKEN('='); } "$"([0-9A-Fa-f])+ { yylval.integer = bfd_scan_vma (yytext+1, 0,16); yylval.bigint.str = (char *) 0; return INT; } ([0-9A-Fa-f])+(H|h|X|x|B|b|O|o|D|d) { int ibase ; switch (yytext[yyleng-1]) { case 'X': case 'x': case 'H': case 'h': ibase = 16; break; case 'O': case 'o': ibase = 8; break; case 'B': case 'b': ibase = 2; break; default: ibase = 10; } yylval.integer = bfd_scan_vma (yytext, 0, ibase); yylval.bigint.str = (char *) 0; return INT; } ((("$"|0[xX])([0-9A-Fa-f])+)|(([0-9])+))(M|K|m|k)? { char *s = yytext; int ibase = 0; if (*s == '$') { ++s; ibase = 16; } yylval.integer = bfd_scan_vma (s, 0, ibase); yylval.bigint.str = (char *) 0; 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(']');} "[" { RTOKEN('[');} "<<=" { RTOKEN(LSHIFTEQ);} ">>=" { RTOKEN(RSHIFTEQ);} "||" { RTOKEN(OROR);} "==" { RTOKEN(EQ);} "!=" { RTOKEN(NE);} ">=" { RTOKEN(GE);} "<=" { RTOKEN(LE);} "<<" { RTOKEN(LSHIFT);} ">>" { RTOKEN(RSHIFT);} "+=" { RTOKEN(PLUSEQ);} "-=" { RTOKEN(MINUSEQ);} "*=" { RTOKEN(MULTEQ);} "/=" { RTOKEN(DIVEQ);} "&=" { RTOKEN(ANDEQ);} "|=" { RTOKEN(OREQ);} "&&" { RTOKEN(ANDAND);} ">" { RTOKEN('>');} "," { RTOKEN(',');} "&" { RTOKEN('&');} "|" { RTOKEN('|');} "~" { RTOKEN('~');} "!" { RTOKEN('!');} "?" { RTOKEN('?');} "*" { RTOKEN('*');} "+" { RTOKEN('+');} "-" { RTOKEN('-');} "/" { RTOKEN('/');} "%" { RTOKEN('%');} "<" { RTOKEN('<');} "=" { RTOKEN('=');} "}" { RTOKEN('}') ; } "{" { RTOKEN('{'); } ")" { RTOKEN(')');} "(" { RTOKEN('(');} ":" { RTOKEN(':'); } ";" { RTOKEN(';');} "MEMORY" { RTOKEN(MEMORY);} "ORIGIN" { RTOKEN(ORIGIN);} "VERSION" { RTOKEN(VERSIONK);} "BLOCK" { RTOKEN(BLOCK);} "BIND" { RTOKEN(BIND);} "LENGTH" { RTOKEN(LENGTH);} "ALIGN" { RTOKEN(ALIGN_K);} "DATA_SEGMENT_ALIGN" { RTOKEN(DATA_SEGMENT_ALIGN);} "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);} "sizeof_headers" { RTOKEN(SIZEOF_HEADERS);} "SIZEOF_HEADERS" { RTOKEN(SIZEOF_HEADERS);} "MAP" { RTOKEN(MAP);} "SIZEOF" { RTOKEN(SIZEOF);} "TARGET" { RTOKEN(TARGET_K);} "SEARCH_DIR" { RTOKEN(SEARCH_DIR);} "OUTPUT" { RTOKEN(OUTPUT);} "INPUT" { RTOKEN(INPUT);} "GROUP" { RTOKEN(GROUP);} "DEFINED" { RTOKEN(DEFINED);} "CREATE_OBJECT_SYMBOLS" { RTOKEN(CREATE_OBJECT_SYMBOLS);} "CONSTRUCTORS" { RTOKEN( CONSTRUCTORS);} "FORCE_COMMON_ALLOCATION" { RTOKEN(FORCE_COMMON_ALLOCATION);} "INHIBIT_COMMON_ALLOCATION" { RTOKEN(INHIBIT_COMMON_ALLOCATION);} "SECTIONS" { RTOKEN(SECTIONS);} "FILL" { RTOKEN(FILL);} "STARTUP" { RTOKEN(STARTUP);} "OUTPUT_FORMAT" { RTOKEN(OUTPUT_FORMAT);} "OUTPUT_ARCH" { RTOKEN( OUTPUT_ARCH);} "HLL" { RTOKEN(HLL);} "SYSLIB" { RTOKEN(SYSLIB);} "FLOAT" { RTOKEN(FLOAT);} "QUAD" { RTOKEN( QUAD);} "SQUAD" { RTOKEN( SQUAD);} "LONG" { RTOKEN( LONG);} "SHORT" { RTOKEN( SHORT);} "BYTE" { RTOKEN( BYTE);} "NOFLOAT" { RTOKEN(NOFLOAT);} "NOCROSSREFS" { RTOKEN(NOCROSSREFS);} "OVERLAY" { RTOKEN(OVERLAY); } "SORT" { RTOKEN(SORT); } "NOLOAD" { RTOKEN(NOLOAD);} "DSECT" { RTOKEN(DSECT);} "COPY" { RTOKEN(COPY);} "INFO" { RTOKEN(INFO);} "OVERLAY" { RTOKEN(OVERLAY);} "o" { RTOKEN(ORIGIN);} "org" { RTOKEN(ORIGIN);} "l" { RTOKEN( LENGTH);} "len" { RTOKEN( LENGTH);} "INCLUDE" { RTOKEN(INCLUDE);} "PHDRS" { RTOKEN (PHDRS); } "AT" { RTOKEN(AT);} "PROVIDE" { RTOKEN(PROVIDE); } "KEEP" { RTOKEN(KEEP); } "EXCLUDE_FILE" { RTOKEN(EXCLUDE_FILE); } "#".*\n? { ++ lineno; } "\n" { ++ lineno; RTOKEN(NEWLINE); } "*".* { /* Mri comment line */ } ";".* { /* Mri comment line */ } "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 */ } "SECT" { RTOKEN(SECT); } "ABSOLUTE" { RTOKEN(ABSOLUTE); } "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 */ } "sect" { RTOKEN(SECT); } "absolute" { RTOKEN(ABSOLUTE); } {FILENAMECHAR1}{NOCFILENAMECHAR}* { /* Filename without commas, needed to parse mri stuff */ yylval.name = xstrdup(yytext); return NAME; } {FILENAMECHAR1}{FILENAMECHAR}* { yylval.name = xstrdup(yytext); return NAME; } "-l"{FILENAMECHAR}+ { yylval.name = xstrdup (yytext + 2); return LNAME; }