@q Copyright 2015-2022 Alexander Shibakov@> @q Copyright 2002-2015 Free Software Foundation, Inc.@> @q This file is part of SPLinT@> @q SPLinT is free software: you can redistribute it and/or modify@> @q it under the terms of the GNU General Public License as published by@> @q the Free Software Foundation, either version 3 of the License, or@> @q (at your option) any later version.@> @q SPLinT is distributed in the hope that it will be useful,@> @q but WITHOUT ANY WARRANTY; without even the implied warranty of@> @q MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the@> @q GNU General Public License for more details.@> @q You should have received a copy of the GNU General Public License@> @q along with SPLinT. If not, see .@> @*1 The original lexer. {\it Note that the \ld\ lexer was designed to accomodate the syntax of various \flex\ flavors, such as the original \lex. The options \prodstyle{\%a} and \prodstyle{\%o} are ignored by \flex\ and are a leftover from the archaic days of the original scanner generator.} @s input_type int @= @G @> @ @= %{@>@ @=%} @> @ @= @> @ @= %% @> @ @= %% @> @ @= @g @ @= @G(fs1) %option nounput @g @ @= #include "bfd.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" input_type parser_input;/* The type of top-level parser input. |yylex| and |yyparse| (indirectly) both check this. */ unsigned int lineno = 1;/* Line number in the current input file. */ const char *lex_string = NULL;/* The string we are currently lexing, or |NULL| if we are reading a file. */ #undef YY_INPUT #define YY_INPUT(buf,result,max_size) result = yy_input (buf, max_size) /* 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. */ #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 int yy_input (char *, int); static void comment (void); static void lex_warn_invalid (char *where, char *what); #define RTOKEN(x) { yylval.token = x; return x; } #ifndef yywrap int yywrap (void) { return 1; }/* Some versions of \flex\ want this. */ #endif @ @= @G(fs1) %a 4000 %o 5000 @g @ {\it Some convenient abbreviations for regular expressions.}% @= @G(fs1) 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\[\]\-\!\^\\]|::)* @g @ {% \def\aterm{\item{\sqbullet}\ignorespaces}% \setbox0=\hbox{\sqbullet\enspace}% \parindent=0pt \advance\parindent by \wd0 States: \aterm |EXPRESSION| definitely in an expression \aterm |SCRIPT| definitely in a script \aterm |BOTH| either |EXPRESSION| or |SCRIPT| \aterm |DEFSYMEXP| in an argument to \.{--defsym} \aterm |MRI| in an \MRI\ script \aterm |VERS_START| starting a Sun style mapfile \aterm |VERS_SCRIPT| a Sun style mapfile \aterm |VERS_NODE| a node within a Sun style mapfile }% \ifbootstrapmode\else\yyskipparsefalse\fi @<\ld\ states@>= @G(fs1) %s SCRIPT %s EXPRESSION %s BOTH %s DEFSYMEXP %s MRI %s VERS_START %s VERS_SCRIPT %s VERS_NODE @g @ @= 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_dynamic_list: return INPUT_DYNAMIC_LIST; break; case input_defsym: return INPUT_DEFSYM; break; default: abort (); } } @ @= @G(fs2) @="/*" {@> comment ();@+@=}@>@; "-" {@>@[RTOKEN('-');@]@=} "+" {@>@[RTOKEN('+');@]@=} {FILENAMECHAR1}{SYMBOLCHARN}* {@>@[yylval.name = xstrdup (yytext);@+return NAME;@]@=} "=" {@>@[RTOKEN('=');@]@=} "$"([0-9A-Fa-f])+ { @O yylval.integer = bfd_scan_vma (yytext + 1, 0, 16); yylval.bigint.str = NULL; return INT; @o } @t}\vb{\insertraw{\insrulealign{\rulealigntemplate}{\cr\egroup\egroup}}}{@> @>@t}\vb{\insertraw{\insparensalign{&}{}}}{@>@=([0-9A-Fa-f])+@>@t}\vb{\insertraw{\insparensalign{\rlap{$\odot$}\cr&}{}}}{@>@=(H|h|X|x|B|b|O|o|D|d) { @O 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 = NULL; return INT; @o } @t}\vb{\insertraw{\insrulealign{\rulealigntemplate}{\cr\egroup\egroup}}}{@> ((("$"|0[xX])([0-9A-Fa-f])+)|(([0-9])+@>@t}\vb{\insertraw{\insparensalign{\rlap{$\odot$}\cr&}{}}}{@>@=)@>@t}\vb{\insertraw{\insparensalign{&}{}}}{@>@=)(M|K|m|k)? { @O char *s = yytext; int ibase = 0; if (*s == '$') { ++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; @o } "]" {@>@[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);@]@=} "REGION_ALIAS" {@>@[RTOKEN(REGION_ALIAS);@]@=} "LD_FEATURE" {@>@[RTOKEN(LD_FEATURE);@]@=} "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_RELRO_END" {@>@[RTOKEN(DATA_SEGMENT_RELRO_END);@]@=} "DATA_SEGMENT_END" {@>@[RTOKEN(DATA_SEGMENT_END);@]@=} "ADDR" {@>@[RTOKEN(ADDR);@]@=} "LOADADDR" {@>@[RTOKEN(LOADADDR);@]@=} "ALIGNOF" {@>@[RTOKEN(ALIGNOF); @]@=} "MAX" {@>@[RTOKEN(MAX_K); @]@=} "MIN" {@>@[RTOKEN(MIN_K); @]@=} "LOG2CEIL" {@>@[RTOKEN(LOG2CEIL); @]@=} "ASSERT" {@>@[RTOKEN(ASSERT_K); @]@=} "ENTRY" {@>@[RTOKEN(ENTRY);@]@=} "EXTERN" {@>@[RTOKEN(EXTERN);@]@=} "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);@]@=} "SEARCH_DIR" {@>@[RTOKEN(SEARCH_DIR);@]@=} "OUTPUT" {@>@[RTOKEN(OUTPUT);@]@=} "INPUT" {@>@[RTOKEN(INPUT);@]@=} "GROUP" {@>@[RTOKEN(GROUP);@]@=} "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);@]@=} "INHIBIT_COMMON_ALLOCATION" {@>@[RTOKEN(INHIBIT_COMMON_ALLOCATION);@]@=} "SECTIONS" {@>@[RTOKEN(SECTIONS);@]@=} "INSERT" {@>@[RTOKEN(INSERT_K);@]@=} "AFTER" {@>@[RTOKEN(AFTER);@]@=} "BEFORE" {@>@[RTOKEN(BEFORE);@]@=} "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_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);@]@=} "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);@]@=} "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); @]@=} "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);@]@=} "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);@]/* \prodstyle{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);@]/* \prodstyle{LIST} and ignore to end of line */@=} "sect" {@>@[RTOKEN(SECT); @]@=} "absolute" {@>@[RTOKEN(ABSOLUTE); @]@=} {FILENAMECHAR1}{NOCFILENAMECHAR}* { @O /* Filename without commas, needed to parse \MRI\ stuff */ yylval.name = xstrdup (yytext); return NAME; @o } {FILENAMECHAR1}{FILENAMECHAR}* { @O yylval.name = xstrdup (yytext); return NAME; @o } "-l"{FILENAMECHAR}+ { @O yylval.name = xstrdup (yytext + 2); return LNAME; @o } {FILENAMECHAR1}{NOCFILENAMECHAR}* { @O yylval.name = xstrdup (yytext); return NAME; @o } "-l"{NOCFILENAMECHAR}+ { @O yylval.name = xstrdup (yytext + 2); return LNAME; @o }