X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=ld%2Fldlex.l;h=68ed7fc3ce86143677e4d1be2395c297d4c0f64b;hb=5435462c555ab99f8687efda29476de470ebcec1;hp=67af46bc6b2ed7cd566c646b4f94b02bbe957d24;hpb=2fa0b342a5cd580781d2b9348a87f33a92d363fa;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/ldlex.l b/ld/ldlex.l index 67af46bc6b..68ed7fc3ce 100644 --- a/ld/ldlex.l +++ b/ld/ldlex.l @@ -1,11 +1,13 @@ %{ -/* Copyright (C) 1991 Free Software Foundation, Inc. + +/* 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 1, or (at your option) +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, @@ -14,477 +16,673 @@ 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, 675 Mass Ave, Cambridge, MA 02139, USA. */ +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. */ /* - * $Id$ - * - * $Log$ - * Revision 1.1 1991/03/21 21:28:50 gumby - * Initial revision - * - * Revision 1.3 1991/03/16 22:27:24 rich - * fish - * - * Revision 1.2 1991/03/15 18:45:55 rich - * foo - * - * Revision 1.1 1991/03/13 00:48:27 chrisb - * Initial revision - * - * Revision 1.6 1991/03/10 09:31:32 rich - * Modified Files: - * Makefile config.h ld-emul.c ld-emul.h ld-gld.c ld-gld960.c - * ld-lnk960.c ld.h lddigest.c ldexp.c ldexp.h ldfile.c ldfile.h - * ldgram.y ldinfo.h ldlang.c ldlang.h ldlex.h ldlex.l ldmain.c - * ldmain.h ldmisc.c ldmisc.h ldsym.c ldsym.h ldversion.c - * ldversion.h ldwarn.h ldwrite.c ldwrite.h y.tab.h - * - * As of this round of changes, ld now builds on all hosts of (Intel960) - * interest and copy passes my copy test on big endian hosts again. - * - * Revision 1.5 1991/03/09 03:25:49 sac - * Can now parse the -Ur flag - * - * Revision 1.4 1991/03/06 02:26:04 sac - * Added support for constructor sections. - * Remove parsing ambiguity. - * Lint - * - * Revision 1.3 1991/02/22 17:15:14 sac - * Added RCS keywords and copyrights - * +This was written by steve chamberlain + sac@cygnus.com */ +#include "ansidecl.h" +#include -/*SUPPRESS 529*/ -/*SUPPRESS 26*/ -/*SUPPRESS 29*/ -#define LEXDEBUG -#include "sysdep.h" -#include "bfd.h" - -#include -#include "ldlex.h" +#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 "ldexp.h" -#include "ldgram.tab.h" #include "ldmisc.h" - -#undef input -#undef unput -#define input lex_input -#define unput lex_unput -int debug; -extern boolean ldgram_want_filename; -extern boolean ldgram_mustbe_filename; -extern boolean ldgram_mustbe_symbolname; -static char *command_line; - -extern int fgetc(); -extern int yyparse(); - -typedef struct { - char *name; -int value; -} keyword_type; +#include "ldexp.h" +#include "ldlang.h" +#include "ldgram.h" +#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; } -keyword_type keywords[] = -{ -"MEMORY",MEMORY, -"ORIGIN",ORIGIN, -"BLOCK",BLOCK, -"LENGTH",LENGTH, -"ALIGN",ALIGN_K, -"SUBSECTION_ALIGN",SUBSECTION_ALIGN, -"ADDR",ADDR, -"ENTRY",ENTRY, -"NEXT",NEXT, -"MAP",MAP, -"SIZEOF",SIZEOF, -"TARGET",TARGET_K, -"SEARCH_DIR",SEARCH_DIR, -"OUTPUT",OUTPUT, -"INPUT",INPUT, -"DEFINED",DEFINED, -"CREATE_OBJECT_SYMBOLS",CREATE_OBJECT_SYMBOLS, -"SECTIONS",SECTIONS, -"FILL",FILL, -"STARTUP",STARTUP, -"HLL",HLL, -"SYSLIB",SYSLIB, -"FLOAT",FLOAT, -"LONG", LONG, -"SHORT", SHORT, -"BYTE", BYTE, -"NOFLOAT",NOFLOAT, -"o",ORIGIN, -"org",ORIGIN, -"l", LENGTH, -"len", LENGTH, -0,0}; -unsigned int lineno; -extern boolean hex_mode; -FILE *ldlex_input_stack; -static unsigned int have_pushback; -#define NPUSHBACK 10 -int pushback[NPUSHBACK]; -int thischar; -extern char *ldfile_input_filename; - -int -lex_input() -{ - /* - When we know that the next token must be a filename we force the - input routine to return a '#' character, which will cause the special - filname regexp to match the following chars even if they don't look - much like a filename to any sane person. - */ - if (ldgram_mustbe_filename) { - ldgram_mustbe_filename = false; - return '#'; - } - if (have_pushback > 0) - { - have_pushback --; - return thischar = pushback[have_pushback]; - } - if (ldlex_input_stack) { - thischar = fgetc(ldlex_input_stack); +/* Some versions of flex want this. */ +#ifndef yywrap +int yywrap () { return 1; } +#endif +%} + +%a 4000 +%o 5000 - if (thischar == EOF) { - fclose(ldlex_input_stack); - ldlex_input_stack = (FILE *)NULL; - ldfile_input_filename = (char *)NULL; - thischar = lex_input(); +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 (); + } } - } - else if (command_line && *command_line) { - thischar = *(command_line++); - } - else thischar = 0; - if(thischar == '\t') thischar = ' '; - return thischar ; -} -void -lex_unput(c) -int c; -{ - if (have_pushback > NPUSHBACK) { - info("%F%P Too many pushbacks\n"); - } +"/*" { 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; + } +