Blame ld/ldlex.l

Packit ba3681
%option nounput noyywrap
Packit ba3681
Packit ba3681
%{
Packit ba3681
Packit ba3681
/* Copyright (C) 1991-2018 Free Software Foundation, Inc.
Packit ba3681
   Written by Steve Chamberlain of Cygnus Support.
Packit ba3681
Packit ba3681
   This file is part of the GNU Binutils.
Packit ba3681
Packit ba3681
   This program is free software; you can redistribute it and/or modify
Packit ba3681
   it under the terms of the GNU General Public License as published by
Packit ba3681
   the Free Software Foundation; either version 3 of the License, or
Packit ba3681
   (at your option) any later version.
Packit ba3681
Packit ba3681
   This program is distributed in the hope that it will be useful,
Packit ba3681
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit ba3681
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit ba3681
   GNU General Public License for more details.
Packit ba3681
Packit ba3681
   You should have received a copy of the GNU General Public License
Packit ba3681
   along with this program; if not, write to the Free Software
Packit ba3681
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
Packit ba3681
   MA 02110-1301, USA.  */
Packit ba3681
Packit ba3681
#include "bfd.h"
Packit ba3681
#include "safe-ctype.h"
Packit ba3681
#include "bfdlink.h"
Packit ba3681
#include "ld.h"
Packit ba3681
#include "ldmisc.h"
Packit ba3681
#include "ldexp.h"
Packit ba3681
#include "ldlang.h"
Packit ba3681
#include <ldgram.h>
Packit ba3681
#include "ldfile.h"
Packit ba3681
#include "ldlex.h"
Packit ba3681
#include "ldmain.h"
Packit ba3681
#include "libiberty.h"
Packit ba3681
Packit ba3681
/* The type of top-level parser input.
Packit ba3681
   yylex and yyparse (indirectly) both check this.  */
Packit ba3681
input_type parser_input;
Packit ba3681
Packit ba3681
/* Line number in the current input file.  */
Packit ba3681
unsigned int lineno;
Packit ba3681
Packit ba3681
/* The string we are currently lexing, or NULL if we are reading a
Packit ba3681
   file.  */
Packit ba3681
const char *lex_string = NULL;
Packit ba3681
Packit ba3681
/* Support for flex reading from more than one input file (stream).
Packit ba3681
   `include_stack' is flex's input state for each open file;
Packit ba3681
   `file_name_stack' is the file names.  `lineno_stack' is the current
Packit ba3681
   line numbers.
Packit ba3681
Packit ba3681
   If `include_stack_ptr' is 0, we haven't started reading anything yet.
Packit ba3681
   Otherwise, stack elements 0 through `include_stack_ptr - 1' are valid.  */
Packit ba3681
Packit ba3681
#undef YY_INPUT
Packit ba3681
#define YY_INPUT(buf,result,max_size) result = yy_input (buf, max_size)
Packit ba3681
Packit ba3681
#ifndef YY_NO_UNPUT
Packit ba3681
#define YY_NO_UNPUT
Packit ba3681
#endif
Packit ba3681
Packit ba3681
#define MAX_INCLUDE_DEPTH 10
Packit ba3681
static YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
Packit ba3681
static const char *file_name_stack[MAX_INCLUDE_DEPTH];
Packit ba3681
static unsigned int lineno_stack[MAX_INCLUDE_DEPTH];
Packit ba3681
static unsigned int sysrooted_stack[MAX_INCLUDE_DEPTH];
Packit ba3681
static unsigned int include_stack_ptr = 0;
Packit ba3681
static int vers_node_nesting = 0;
Packit ba3681
Packit ba3681
static int yy_input (char *, int);
Packit ba3681
static void comment (void);
Packit ba3681
static void lex_warn_invalid (char *where, char *what);
Packit ba3681
Packit ba3681
/* STATES
Packit ba3681
	EXPRESSION	definitely in an expression
Packit ba3681
	SCRIPT		definitely in a script
Packit ba3681
	INPUTLIST	definitely in a script, a filename-list
Packit ba3681
	BOTH		either EXPRESSION or SCRIPT
Packit ba3681
	DEFSYMEXP	in an argument to -defsym
Packit ba3681
	MRI		in an MRI script
Packit ba3681
	VERS_START	starting a Sun style mapfile
Packit ba3681
	VERS_SCRIPT	a Sun style mapfile
Packit ba3681
	VERS_NODE	a node within a Sun style mapfile
Packit ba3681
*/
Packit ba3681
#define RTOKEN(x)  {  yylval.token = x; return x; }
Packit ba3681
Packit ba3681
%}
Packit ba3681
Packit ba3681
%a 4000
Packit ba3681
%o 5000
Packit ba3681
Packit ba3681
CMDFILENAMECHAR   [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\-\~]
Packit ba3681
CMDFILENAMECHAR1  [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\~]
Packit ba3681
FILENAMECHAR1	[_a-zA-Z\/\.\\\$\_\~]
Packit ba3681
SYMBOLNAMECHAR1	[_a-zA-Z\/\.\\\$\_]
Packit ba3681
SYMBOLCHARN     [_a-zA-Z\/\.\\\$\_\~0-9]
Packit ba3681
FILENAMECHAR	[_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\\,\~]
Packit ba3681
WILDCHAR	[_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\\,\~\?\*\^\!]
Packit ba3681
WHITE		[ \t\n\r]+
Packit ba3681
Packit ba3681
NOCFILENAMECHAR	[_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
Packit ba3681
Packit ba3681
V_TAG [.$_a-zA-Z][._a-zA-Z0-9]*
Packit ba3681
V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
Packit ba3681
Packit ba3681
%s SCRIPT
Packit ba3681
%s INPUTLIST
Packit ba3681
%s EXPRESSION
Packit ba3681
%s BOTH
Packit ba3681
%s DEFSYMEXP
Packit ba3681
%s MRI
Packit ba3681
%s VERS_START
Packit ba3681
%s VERS_SCRIPT
Packit ba3681
%s VERS_NODE
Packit ba3681
%%
Packit ba3681
Packit ba3681
  if (parser_input != input_selected)
Packit ba3681
    {
Packit ba3681
      /* The first token of the input determines the initial parser state.  */
Packit ba3681
      input_type t = parser_input;
Packit ba3681
      parser_input = input_selected;
Packit ba3681
      switch (t)
Packit ba3681
	{
Packit ba3681
	case input_script: return INPUT_SCRIPT; break;
Packit ba3681
	case input_mri_script: return INPUT_MRI_SCRIPT; break;
Packit ba3681
	case input_version_script: return INPUT_VERSION_SCRIPT; break;
Packit ba3681
	case input_dynamic_list: return INPUT_DYNAMIC_LIST; break;
Packit ba3681
	case input_defsym: return INPUT_DEFSYM; break;
Packit ba3681
	default: abort ();
Packit ba3681
	}
Packit ba3681
    }
Packit ba3681
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,VERS_START,VERS_NODE,VERS_SCRIPT,INPUTLIST>"/*"	{ comment (); }
Packit ba3681
Packit ba3681
Packit ba3681
<DEFSYMEXP>"-"			{ RTOKEN('-');}
Packit ba3681
<DEFSYMEXP>"+"			{ RTOKEN('+');}
Packit ba3681
<DEFSYMEXP>{SYMBOLNAMECHAR1}{SYMBOLCHARN}*   { yylval.name = xstrdup (yytext); return NAME; }
Packit ba3681
<DEFSYMEXP>"="			{ RTOKEN('='); }
Packit ba3681
Packit ba3681
<MRI,EXPRESSION>"$"([0-9A-Fa-f])+ {
Packit ba3681
				yylval.integer = bfd_scan_vma (yytext + 1, 0, 16);
Packit ba3681
				yylval.bigint.str = NULL;
Packit ba3681
				return INT;
Packit ba3681
			}
Packit ba3681
Packit ba3681
<MRI,EXPRESSION>([0-9A-Fa-f])+(H|h|X|x|B|b|O|o|D|d) {
Packit ba3681
				   int ibase ;
Packit ba3681
				   switch (yytext[yyleng - 1]) {
Packit ba3681
				    case 'X':
Packit ba3681
				    case 'x':
Packit ba3681
				    case 'H':
Packit ba3681
				    case 'h':
Packit ba3681
				     ibase = 16;
Packit ba3681
				     break;
Packit ba3681
				    case 'O':
Packit ba3681
				    case 'o':
Packit ba3681
				     ibase = 8;
Packit ba3681
				     break;
Packit ba3681
				    case 'B':
Packit ba3681
				    case 'b':
Packit ba3681
				     ibase = 2;
Packit ba3681
				     break;
Packit ba3681
				    default:
Packit ba3681
				     ibase = 10;
Packit ba3681
				   }
Packit ba3681
				   yylval.integer = bfd_scan_vma (yytext, 0,
Packit ba3681
								  ibase);
Packit ba3681
				   yylval.bigint.str = NULL;
Packit ba3681
				   return INT;
Packit ba3681
				 }
Packit ba3681
<SCRIPT,DEFSYMEXP,MRI,BOTH,EXPRESSION>((("$"|0[xX])([0-9A-Fa-f])+)|(([0-9])+))(M|K|m|k)? {
Packit ba3681
				  char *s = yytext;
Packit ba3681
				  int ibase = 0;
Packit ba3681
Packit ba3681
				  if (*s == '$')
Packit ba3681
				    {
Packit ba3681
				      ++s;
Packit ba3681
				      ibase = 16;
Packit ba3681
				    }
Packit ba3681
				  yylval.integer = bfd_scan_vma (s, 0, ibase);
Packit ba3681
				  yylval.bigint.str = NULL;
Packit ba3681
				  if (yytext[yyleng - 1] == 'M'
Packit ba3681
				      || yytext[yyleng - 1] == 'm')
Packit ba3681
				    {
Packit ba3681
				      yylval.integer *= 1024 * 1024;
Packit ba3681
				    }
Packit ba3681
				  else if (yytext[yyleng - 1] == 'K'
Packit ba3681
				      || yytext[yyleng - 1]=='k')
Packit ba3681
				    {
Packit ba3681
				      yylval.integer *= 1024;
Packit ba3681
				    }
Packit ba3681
				  else if (yytext[0] == '0'
Packit ba3681
					   && (yytext[1] == 'x'
Packit ba3681
					       || yytext[1] == 'X'))
Packit ba3681
				    {
Packit ba3681
				      yylval.bigint.str = xstrdup (yytext + 2);
Packit ba3681
				    }
Packit ba3681
				  return INT;
Packit ba3681
				}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"]"		{ RTOKEN(']');}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"["		{ RTOKEN('[');}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"<<="	{ RTOKEN(LSHIFTEQ);}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>">>="	{ RTOKEN(RSHIFTEQ);}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"||"	{ RTOKEN(OROR);}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"=="	{ RTOKEN(EQ);}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"!="	{ RTOKEN(NE);}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>">="	{ RTOKEN(GE);}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"<="	{ RTOKEN(LE);}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"<<"	{ RTOKEN(LSHIFT);}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>">>"	{ RTOKEN(RSHIFT);}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"+="	{ RTOKEN(PLUSEQ);}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"-="	{ RTOKEN(MINUSEQ);}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"*="	{ RTOKEN(MULTEQ);}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"/="	{ RTOKEN(DIVEQ);}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"&="	{ RTOKEN(ANDEQ);}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"|="	{ RTOKEN(OREQ);}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"&&"	{ RTOKEN(ANDAND);}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>">"		{ RTOKEN('>');}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI,INPUTLIST>","		{ RTOKEN(',');}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"&"		{ RTOKEN('&';;}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"|"		{ RTOKEN('|');}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"~"		{ RTOKEN('~');}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"!"		{ RTOKEN('!');}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"?"		{ RTOKEN('?');}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"*"		{ RTOKEN('*');}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"+"		{ RTOKEN('+');}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"-"		{ RTOKEN('-');}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"/"		{ RTOKEN('/');}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"%"		{ RTOKEN('%');}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"<"		{ RTOKEN('<');}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"="		{ RTOKEN('=');}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"}"		{ RTOKEN('}') ; }
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>"{"		{ RTOKEN('{'); }
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI,INPUTLIST>")"		{ RTOKEN(')');}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI,INPUTLIST>"("		{ RTOKEN('(');}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>":"		{ RTOKEN(':'); }
Packit ba3681
<BOTH,SCRIPT,EXPRESSION,MRI>";"		{ RTOKEN(';');}
Packit ba3681
<BOTH,SCRIPT>"MEMORY"			{ RTOKEN(MEMORY);}
Packit ba3681
<BOTH,SCRIPT>"REGION_ALIAS"		{ RTOKEN(REGION_ALIAS);}
Packit ba3681
<BOTH,SCRIPT>"LD_FEATURE"		{ RTOKEN(LD_FEATURE);}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION>"ORIGIN"	{ RTOKEN(ORIGIN);}
Packit ba3681
<BOTH,SCRIPT>"VERSION"			{ RTOKEN(VERSIONK);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"BLOCK"		{ RTOKEN(BLOCK);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"BIND"		{ RTOKEN(BIND);}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION>"LENGTH"	{ RTOKEN(LENGTH);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"ALIGN"		{ RTOKEN(ALIGN_K);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_ALIGN"	{ RTOKEN(DATA_SEGMENT_ALIGN);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_RELRO_END"	{ RTOKEN(DATA_SEGMENT_RELRO_END);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_END"	{ RTOKEN(DATA_SEGMENT_END);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"ADDR"		{ RTOKEN(ADDR);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"LOADADDR"	{ RTOKEN(LOADADDR);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"ALIGNOF"	{ RTOKEN(ALIGNOF); }
Packit ba3681
<EXPRESSION,BOTH>"MAX"			{ RTOKEN(MAX_K); }
Packit ba3681
<EXPRESSION,BOTH>"MIN"			{ RTOKEN(MIN_K); }
Packit ba3681
<EXPRESSION,BOTH>"LOG2CEIL"		{ RTOKEN(LOG2CEIL); }
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"ASSERT"	{ RTOKEN(ASSERT_K); }
Packit ba3681
<BOTH,SCRIPT>"ENTRY"			{ RTOKEN(ENTRY);}
Packit ba3681
<BOTH,SCRIPT,MRI>"EXTERN"		{ RTOKEN(EXTERN);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"NEXT"		{ RTOKEN(NEXT);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"sizeof_headers"	{ RTOKEN(SIZEOF_HEADERS);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"SIZEOF_HEADERS"	{ RTOKEN(SIZEOF_HEADERS);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"SEGMENT_START" { RTOKEN(SEGMENT_START);}
Packit ba3681
<BOTH,SCRIPT>"MAP"			{ RTOKEN(MAP);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"SIZEOF"	{ RTOKEN(SIZEOF);}
Packit ba3681
<BOTH,SCRIPT>"TARGET"			{ RTOKEN(TARGET_K);}
Packit ba3681
<BOTH,SCRIPT>"SEARCH_DIR"		{ RTOKEN(SEARCH_DIR);}
Packit ba3681
<BOTH,SCRIPT>"OUTPUT"			{ RTOKEN(OUTPUT);}
Packit ba3681
<BOTH,SCRIPT>"INPUT"			{ RTOKEN(INPUT);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"GROUP"		{ RTOKEN(GROUP);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT,INPUTLIST>"AS_NEEDED"	{ RTOKEN(AS_NEEDED);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"DEFINED"	{ RTOKEN(DEFINED);}
Packit ba3681
<BOTH,SCRIPT>"CREATE_OBJECT_SYMBOLS"	{ RTOKEN(CREATE_OBJECT_SYMBOLS);}
Packit ba3681
<BOTH,SCRIPT>"CONSTRUCTORS"		{ RTOKEN( CONSTRUCTORS);}
Packit ba3681
<BOTH,SCRIPT>"FORCE_COMMON_ALLOCATION"	{ RTOKEN(FORCE_COMMON_ALLOCATION);}
Packit ba3681
<BOTH,SCRIPT>"FORCE_GROUP_ALLOCATION"	{ RTOKEN(FORCE_GROUP_ALLOCATION);}
Packit ba3681
<BOTH,SCRIPT>"INHIBIT_COMMON_ALLOCATION" { RTOKEN(INHIBIT_COMMON_ALLOCATION);}
Packit ba3681
<BOTH,SCRIPT>"SECTIONS"			{ RTOKEN(SECTIONS);}
Packit ba3681
<BOTH,SCRIPT>"INSERT"			{ RTOKEN(INSERT_K);}
Packit ba3681
<BOTH,SCRIPT>"AFTER"			{ RTOKEN(AFTER);}
Packit ba3681
<BOTH,SCRIPT>"BEFORE"			{ RTOKEN(BEFORE);}
Packit ba3681
<BOTH,SCRIPT>"FILL"			{ RTOKEN(FILL);}
Packit ba3681
<BOTH,SCRIPT>"STARTUP"			{ RTOKEN(STARTUP);}
Packit ba3681
<BOTH,SCRIPT>"OUTPUT_FORMAT"		{ RTOKEN(OUTPUT_FORMAT);}
Packit ba3681
<BOTH,SCRIPT>"OUTPUT_ARCH"		{ RTOKEN( OUTPUT_ARCH);}
Packit ba3681
<BOTH,SCRIPT>"HLL"			{ RTOKEN(HLL);}
Packit ba3681
<BOTH,SCRIPT>"SYSLIB"			{ RTOKEN(SYSLIB);}
Packit ba3681
<BOTH,SCRIPT>"FLOAT"			{ RTOKEN(FLOAT);}
Packit ba3681
<BOTH,SCRIPT>"QUAD"			{ RTOKEN( QUAD);}
Packit ba3681
<BOTH,SCRIPT>"SQUAD"			{ RTOKEN( SQUAD);}
Packit ba3681
<BOTH,SCRIPT>"LONG"			{ RTOKEN( LONG);}
Packit ba3681
<BOTH,SCRIPT>"SHORT"			{ RTOKEN( SHORT);}
Packit ba3681
<BOTH,SCRIPT>"BYTE"			{ RTOKEN( BYTE);}
Packit ba3681
<BOTH,SCRIPT>"NOFLOAT"			{ RTOKEN(NOFLOAT);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"NOCROSSREFS"	{ RTOKEN(NOCROSSREFS);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"NOCROSSREFS_TO" { RTOKEN(NOCROSSREFS_TO);}
Packit ba3681
<BOTH,SCRIPT>"OVERLAY"			{ RTOKEN(OVERLAY); }
Packit ba3681
<BOTH,SCRIPT>"SORT_BY_NAME"		{ RTOKEN(SORT_BY_NAME); }
Packit ba3681
<BOTH,SCRIPT>"SORT_BY_ALIGNMENT"	{ RTOKEN(SORT_BY_ALIGNMENT); }
Packit ba3681
<BOTH,SCRIPT>"SORT"			{ RTOKEN(SORT_BY_NAME); }
Packit ba3681
<BOTH,SCRIPT>"SORT_BY_INIT_PRIORITY"	{ RTOKEN(SORT_BY_INIT_PRIORITY); }
Packit ba3681
<BOTH,SCRIPT>"SORT_NONE"		{ RTOKEN(SORT_NONE); }
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"NOLOAD"	{ RTOKEN(NOLOAD);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"DSECT"		{ RTOKEN(DSECT);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"COPY"		{ RTOKEN(COPY);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"INFO"		{ RTOKEN(INFO);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"OVERLAY"	{ RTOKEN(OVERLAY);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RO"	{ RTOKEN(ONLY_IF_RO); }
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RW"	{ RTOKEN(ONLY_IF_RW); }
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"SPECIAL"	{ RTOKEN(SPECIAL); }
Packit ba3681
<BOTH,SCRIPT>"o"			{ RTOKEN(ORIGIN);}
Packit ba3681
<BOTH,SCRIPT>"org"			{ RTOKEN(ORIGIN);}
Packit ba3681
<BOTH,SCRIPT>"l"			{ RTOKEN( LENGTH);}
Packit ba3681
<BOTH,SCRIPT>"len"			{ RTOKEN( LENGTH);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"INPUT_SECTION_FLAGS"	{ RTOKEN(INPUT_SECTION_FLAGS); }
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"INCLUDE"	{ RTOKEN(INCLUDE);}
Packit ba3681
<BOTH,SCRIPT>"PHDRS"			{ RTOKEN (PHDRS); }
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"AT"		{ RTOKEN(AT);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"ALIGN_WITH_INPUT"	{ RTOKEN(ALIGN_WITH_INPUT);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"SUBALIGN"	{ RTOKEN(SUBALIGN);}
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"HIDDEN"	{ RTOKEN(HIDDEN); }
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"PROVIDE"	{ RTOKEN(PROVIDE); }
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"PROVIDE_HIDDEN" { RTOKEN(PROVIDE_HIDDEN); }
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"KEEP"		{ RTOKEN(KEEP); }
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"EXCLUDE_FILE"  { RTOKEN(EXCLUDE_FILE); }
Packit ba3681
<EXPRESSION,BOTH,SCRIPT>"CONSTANT"	{ RTOKEN(CONSTANT);}
Packit ba3681
<MRI>"#".*\n?			{ ++ lineno; }
Packit ba3681
<MRI>"\n"			{ ++ lineno;  RTOKEN(NEWLINE); }
Packit ba3681
<MRI>"*".*			{ /* Mri comment line */ }
Packit ba3681
<MRI>";".*			{ /* Mri comment line */ }
Packit ba3681
<MRI>"END"			{ RTOKEN(ENDWORD); }
Packit ba3681
<MRI>"ALIGNMOD"			{ RTOKEN(ALIGNMOD);}
Packit ba3681
<MRI>"ALIGN"			{ RTOKEN(ALIGN_K);}
Packit ba3681
<MRI>"CHIP"			{ RTOKEN(CHIP); }
Packit ba3681
<MRI>"BASE"			{ RTOKEN(BASE); }
Packit ba3681
<MRI>"ALIAS"			{ RTOKEN(ALIAS); }
Packit ba3681
<MRI>"TRUNCATE"			{ RTOKEN(TRUNCATE); }
Packit ba3681
<MRI>"LOAD"			{ RTOKEN(LOAD); }
Packit ba3681
<MRI>"PUBLIC"			{ RTOKEN(PUBLIC); }
Packit ba3681
<MRI>"ORDER"			{ RTOKEN(ORDER); }
Packit ba3681
<MRI>"NAME"			{ RTOKEN(NAMEWORD); }
Packit ba3681
<MRI>"FORMAT"			{ RTOKEN(FORMAT); }
Packit ba3681
<MRI>"CASE"			{ RTOKEN(CASE); }
Packit ba3681
<MRI>"START"			{ RTOKEN(START); }
Packit ba3681
<MRI>"LIST".*			{ RTOKEN(LIST); /* LIST and ignore to end of line */ }
Packit ba3681
<MRI>"SECT"			{ RTOKEN(SECT); }
Packit ba3681
<EXPRESSION,BOTH,SCRIPT,MRI>"ABSOLUTE"			{ RTOKEN(ABSOLUTE); }
Packit ba3681
<MRI>"end"			{ RTOKEN(ENDWORD); }
Packit ba3681
<MRI>"alignmod"			{ RTOKEN(ALIGNMOD);}
Packit ba3681
<MRI>"align"			{ RTOKEN(ALIGN_K);}
Packit ba3681
<MRI>"chip"			{ RTOKEN(CHIP); }
Packit ba3681
<MRI>"base"			{ RTOKEN(BASE); }
Packit ba3681
<MRI>"alias"			{ RTOKEN(ALIAS); }
Packit ba3681
<MRI>"truncate"			{ RTOKEN(TRUNCATE); }
Packit ba3681
<MRI>"load"			{ RTOKEN(LOAD); }
Packit ba3681
<MRI>"public"			{ RTOKEN(PUBLIC); }
Packit ba3681
<MRI>"order"			{ RTOKEN(ORDER); }
Packit ba3681
<MRI>"name"			{ RTOKEN(NAMEWORD); }
Packit ba3681
<MRI>"format"			{ RTOKEN(FORMAT); }
Packit ba3681
<MRI>"case"			{ RTOKEN(CASE); }
Packit ba3681
<MRI>"extern"			{ RTOKEN(EXTERN); }
Packit ba3681
<MRI>"start"			{ RTOKEN(START); }
Packit ba3681
<MRI>"list".*			{ RTOKEN(LIST); /* LIST and ignore to end of line */ }
Packit ba3681
<MRI>"sect"			{ RTOKEN(SECT); }
Packit ba3681
<EXPRESSION,BOTH,SCRIPT,MRI>"absolute"			{ RTOKEN(ABSOLUTE); }
Packit ba3681
Packit ba3681
<MRI>{FILENAMECHAR1}{NOCFILENAMECHAR}*	{
Packit ba3681
/* Filename without commas, needed to parse mri stuff */
Packit ba3681
				 yylval.name = xstrdup (yytext);
Packit ba3681
				  return NAME;
Packit ba3681
				}
Packit ba3681
Packit ba3681
Packit ba3681
<BOTH,INPUTLIST>{FILENAMECHAR1}{FILENAMECHAR}*	{
Packit ba3681
				 yylval.name = xstrdup (yytext);
Packit ba3681
				  return NAME;
Packit ba3681
				}
Packit ba3681
<INPUTLIST>"="{FILENAMECHAR1}{FILENAMECHAR}*	{
Packit ba3681
/* Filename to be prefixed by --sysroot or when non-sysrooted, nothing.  */
Packit ba3681
				 yylval.name = xstrdup (yytext);
Packit ba3681
				  return NAME;
Packit ba3681
				}
Packit ba3681
<INPUTLIST>"$SYSROOT"{FILENAMECHAR1}{FILENAMECHAR}*	{
Packit ba3681
/* Filename to be prefixed by --sysroot or when non-sysrooted, nothing.  */
Packit ba3681
				 yylval.name = xstrdup (yytext);
Packit ba3681
				  return NAME;
Packit ba3681
				}
Packit ba3681
<BOTH,INPUTLIST>"-l"{FILENAMECHAR}+ {
Packit ba3681
				  yylval.name = xstrdup (yytext + 2);
Packit ba3681
				  return LNAME;
Packit ba3681
				}
Packit ba3681
<EXPRESSION>{SYMBOLNAMECHAR1}{NOCFILENAMECHAR}*	{
Packit ba3681
				 yylval.name = xstrdup (yytext);
Packit ba3681
				  return NAME;
Packit ba3681
				}
Packit ba3681
<EXPRESSION>"-l"{NOCFILENAMECHAR}+ {
Packit ba3681
				  yylval.name = xstrdup (yytext + 2);
Packit ba3681
				  return LNAME;
Packit ba3681
				}
Packit ba3681
<SCRIPT>{WILDCHAR}* {
Packit ba3681
		/* Annoyingly, this pattern can match comments, and we have
Packit ba3681
		   longest match issues to consider.  So if the first two
Packit ba3681
		   characters are a comment opening, put the input back and
Packit ba3681
		   try again.  */
Packit ba3681
		if (yytext[0] == '/' && yytext[1] == '*')
Packit ba3681
		  {
Packit ba3681
		    yyless (2);
Packit ba3681
		    comment ();
Packit ba3681
		  }
Packit ba3681
		else
Packit ba3681
		  {
Packit ba3681
		    yylval.name = xstrdup (yytext);
Packit ba3681
		    return NAME;
Packit ba3681
		  }
Packit ba3681
	}
Packit ba3681
Packit ba3681
<EXPRESSION,BOTH,SCRIPT,VERS_NODE,INPUTLIST>"\""[^\"]*"\"" {
Packit ba3681
					/* No matter the state, quotes
Packit ba3681
					   give what's inside.  */
Packit ba3681
					bfd_size_type len;
Packit ba3681
					yylval.name = xstrdup (yytext + 1);
Packit ba3681
					/* PR ld/20906.  A corrupt input file
Packit ba3681
					   can contain bogus strings.  */
Packit ba3681
					len = strlen (yylval.name);
Packit ba3681
					if (len > yyleng - 2)
Packit ba3681
					  len = yyleng - 2;
Packit ba3681
					yylval.name[len] = 0;
Packit ba3681
					return NAME;
Packit ba3681
				}
Packit ba3681
<BOTH,SCRIPT,EXPRESSION>"\n"		{ lineno++;}
Packit ba3681
<MRI,BOTH,SCRIPT,EXPRESSION>[ \t\r]+	{ }
Packit ba3681
Packit ba3681
<VERS_NODE,VERS_SCRIPT>[:,;]	{ return *yytext; }
Packit ba3681
Packit ba3681
<VERS_NODE>global		{ RTOKEN(GLOBAL); }
Packit ba3681
Packit ba3681
<VERS_NODE>local		{ RTOKEN(LOCAL); }
Packit ba3681
Packit ba3681
<VERS_NODE>extern		{ RTOKEN(EXTERN); }
Packit ba3681
Packit ba3681
<VERS_NODE>{V_IDENTIFIER}	{ yylval.name = xstrdup (yytext);
Packit ba3681
				  return VERS_IDENTIFIER; }
Packit ba3681
Packit ba3681
<VERS_SCRIPT>{V_TAG}		{ yylval.name = xstrdup (yytext);
Packit ba3681
				  return VERS_TAG; }
Packit ba3681
Packit ba3681
<VERS_START>"{"			{ BEGIN(VERS_SCRIPT); return *yytext; }
Packit ba3681
Packit ba3681
<VERS_SCRIPT>"{"		{ BEGIN(VERS_NODE);
Packit ba3681
				  vers_node_nesting = 0;
Packit ba3681
				  return *yytext;
Packit ba3681
				}
Packit ba3681
<VERS_SCRIPT>"}"		{ return *yytext; }
Packit ba3681
<VERS_NODE>"{"			{ vers_node_nesting++; return *yytext; }
Packit ba3681
<VERS_NODE>"}"			{ if (--vers_node_nesting < 0)
Packit ba3681
				    BEGIN(VERS_SCRIPT);
Packit ba3681
				  return *yytext;
Packit ba3681
				}
Packit ba3681
Packit ba3681
<VERS_START,VERS_NODE,VERS_SCRIPT,INPUTLIST>[\n]	{ lineno++; }
Packit ba3681
Packit ba3681
<VERS_START,VERS_NODE,VERS_SCRIPT>#.*		{ /* Eat up comments */ }
Packit ba3681
Packit ba3681
<VERS_START,VERS_NODE,VERS_SCRIPT,INPUTLIST>[ \t\r]+	{ /* Eat up whitespace */ }
Packit ba3681
Packit ba3681
<<EOF>> {
Packit ba3681
  include_stack_ptr--;
Packit ba3681
  if (include_stack_ptr == 0)
Packit ba3681
    {
Packit ba3681
      lineno = 0;
Packit ba3681
      yyterminate ();
Packit ba3681
    }
Packit ba3681
  else
Packit ba3681
    yy_switch_to_buffer (include_stack[include_stack_ptr]);
Packit ba3681
Packit ba3681
  lineno = lineno_stack[include_stack_ptr];
Packit ba3681
  input_flags.sysrooted = sysrooted_stack[include_stack_ptr];
Packit ba3681
Packit ba3681
  return END;
Packit ba3681
}
Packit ba3681
Packit ba3681
<SCRIPT,MRI,VERS_START,VERS_SCRIPT,VERS_NODE>.	lex_warn_invalid (" in script", yytext);
Packit ba3681
<EXPRESSION,DEFSYMEXP,BOTH>.	lex_warn_invalid (" in expression", yytext);
Packit ba3681
Packit ba3681
%%
Packit ba3681

Packit ba3681
Packit ba3681
/* Switch flex to reading script file NAME, open on FILE,
Packit ba3681
   saving the current input info on the include stack.  */
Packit ba3681
Packit ba3681
void
Packit ba3681
lex_push_file (FILE *file, const char *name, unsigned int sysrooted)
Packit ba3681
{
Packit ba3681
  if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
Packit ba3681
    {
Packit ba3681
      einfo (_("%F:includes nested too deeply\n"));
Packit ba3681
    }
Packit ba3681
  file_name_stack[include_stack_ptr] = name;
Packit ba3681
  lineno_stack[include_stack_ptr] = lineno;
Packit ba3681
  sysrooted_stack[include_stack_ptr] = input_flags.sysrooted;
Packit ba3681
  include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
Packit ba3681
Packit ba3681
  include_stack_ptr++;
Packit ba3681
  lineno = 1;
Packit ba3681
  input_flags.sysrooted = sysrooted;
Packit ba3681
  yyin = file;
Packit ba3681
  yy_switch_to_buffer (yy_create_buffer (yyin, YY_BUF_SIZE));
Packit ba3681
}
Packit ba3681
Packit ba3681
/* Return a newly created flex input buffer containing STRING,
Packit ba3681
   which is SIZE bytes long.  */
Packit ba3681
Packit ba3681
static YY_BUFFER_STATE
Packit ba3681
yy_create_string_buffer (const char *string, size_t size)
Packit ba3681
{
Packit ba3681
  YY_BUFFER_STATE b;
Packit ba3681
Packit ba3681
  /* Calls to m-alloc get turned by sed into xm-alloc.  */
Packit ba3681
  b = malloc (sizeof (struct yy_buffer_state));
Packit ba3681
  b->yy_input_file = 0;
Packit ba3681
  b->yy_buf_size = size;
Packit ba3681
Packit ba3681
  /* yy_ch_buf has to be 2 characters longer than the size given because
Packit ba3681
     we need to put in 2 end-of-buffer characters.  */
Packit ba3681
  b->yy_ch_buf = malloc ((unsigned) (b->yy_buf_size + 3));
Packit ba3681
Packit ba3681
  b->yy_ch_buf[0] = '\n';
Packit ba3681
  strcpy (b->yy_ch_buf+1, string);
Packit ba3681
  b->yy_ch_buf[size+1] = YY_END_OF_BUFFER_CHAR;
Packit ba3681
  b->yy_ch_buf[size+2] = YY_END_OF_BUFFER_CHAR;
Packit ba3681
  b->yy_n_chars = size+1;
Packit ba3681
  b->yy_buf_pos = &b->yy_ch_buf[1];
Packit ba3681
Packit ba3681
  b->yy_is_our_buffer = 1;
Packit ba3681
  b->yy_is_interactive = 0;
Packit ba3681
  b->yy_at_bol = 1;
Packit ba3681
  b->yy_fill_buffer = 0;
Packit ba3681
Packit ba3681
  /* flex 2.4.7 changed the interface.  FIXME: We should not be using
Packit ba3681
     a flex internal interface in the first place!  */
Packit ba3681
#ifdef YY_BUFFER_NEW
Packit ba3681
  b->yy_buffer_status = YY_BUFFER_NEW;
Packit ba3681
#else
Packit ba3681
  b->yy_eof_status = EOF_NOT_SEEN;
Packit ba3681
#endif
Packit ba3681
Packit ba3681
  return b;
Packit ba3681
}
Packit ba3681
Packit ba3681
/* Switch flex to reading from STRING, saving the current input info
Packit ba3681
   on the include stack.  */
Packit ba3681
Packit ba3681
void
Packit ba3681
lex_redirect (const char *string, const char *fake_filename, unsigned int count)
Packit ba3681
{
Packit ba3681
  YY_BUFFER_STATE tmp;
Packit ba3681
Packit ba3681
  yy_init = 0;
Packit ba3681
  if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
Packit ba3681
    {
Packit ba3681
      einfo (_("%F: macros nested too deeply\n"));
Packit ba3681
    }
Packit ba3681
  file_name_stack[include_stack_ptr] = fake_filename;
Packit ba3681
  lineno_stack[include_stack_ptr] = lineno;
Packit ba3681
  include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
Packit ba3681
  include_stack_ptr++;
Packit ba3681
  lineno = count;
Packit ba3681
  tmp = yy_create_string_buffer (string, strlen (string));
Packit ba3681
  yy_switch_to_buffer (tmp);
Packit ba3681
}
Packit ba3681

Packit ba3681
/* Functions to switch to a different flex start condition,
Packit ba3681
   saving the current start condition on `state_stack'.  */
Packit ba3681
Packit ba3681
static int state_stack[MAX_INCLUDE_DEPTH * 2];
Packit ba3681
static int *state_stack_p = state_stack;
Packit ba3681
Packit ba3681
void
Packit ba3681
ldlex_script (void)
Packit ba3681
{
Packit ba3681
  *(state_stack_p)++ = yy_start;
Packit ba3681
  BEGIN (SCRIPT);
Packit ba3681
}
Packit ba3681
Packit ba3681
void
Packit ba3681
ldlex_inputlist (void)
Packit ba3681
{
Packit ba3681
  *(state_stack_p)++ = yy_start;
Packit ba3681
  BEGIN (INPUTLIST);
Packit ba3681
}
Packit ba3681
Packit ba3681
void
Packit ba3681
ldlex_mri_script (void)
Packit ba3681
{
Packit ba3681
  *(state_stack_p)++ = yy_start;
Packit ba3681
  BEGIN (MRI);
Packit ba3681
}
Packit ba3681
Packit ba3681
void
Packit ba3681
ldlex_version_script (void)
Packit ba3681
{
Packit ba3681
  *(state_stack_p)++ = yy_start;
Packit ba3681
  BEGIN (VERS_START);
Packit ba3681
}
Packit ba3681
Packit ba3681
void
Packit ba3681
ldlex_version_file (void)
Packit ba3681
{
Packit ba3681
  *(state_stack_p)++ = yy_start;
Packit ba3681
  BEGIN (VERS_SCRIPT);
Packit ba3681
}
Packit ba3681
Packit ba3681
void
Packit ba3681
ldlex_defsym (void)
Packit ba3681
{
Packit ba3681
  *(state_stack_p)++ = yy_start;
Packit ba3681
  BEGIN (DEFSYMEXP);
Packit ba3681
}
Packit ba3681
Packit ba3681
void
Packit ba3681
ldlex_expression (void)
Packit ba3681
{
Packit ba3681
  *(state_stack_p)++ = yy_start;
Packit ba3681
  BEGIN (EXPRESSION);
Packit ba3681
}
Packit ba3681
Packit ba3681
void
Packit ba3681
ldlex_both (void)
Packit ba3681
{
Packit ba3681
  *(state_stack_p)++ = yy_start;
Packit ba3681
  BEGIN (BOTH);
Packit ba3681
}
Packit ba3681
Packit ba3681
void
Packit ba3681
ldlex_popstate (void)
Packit ba3681
{
Packit ba3681
  yy_start = *(--state_stack_p);
Packit ba3681
}
Packit ba3681
Packit ba3681
/* Return the current file name, or the previous file if no file is
Packit ba3681
   current.  */
Packit ba3681
Packit ba3681
const char*
Packit ba3681
ldlex_filename (void)
Packit ba3681
{
Packit ba3681
  return file_name_stack[include_stack_ptr - (include_stack_ptr != 0)];
Packit ba3681
}
Packit ba3681

Packit ba3681
Packit ba3681
/* Place up to MAX_SIZE characters in BUF and return
Packit ba3681
   either the number of characters read, or 0 to indicate EOF.  */
Packit ba3681
Packit ba3681
static int
Packit ba3681
yy_input (char *buf, int max_size)
Packit ba3681
{
Packit ba3681
  int result = 0;
Packit ba3681
  if (YY_CURRENT_BUFFER->yy_input_file)
Packit ba3681
    {
Packit ba3681
      if (yyin)
Packit ba3681
	{
Packit ba3681
	  result = fread (buf, 1, max_size, yyin);
Packit ba3681
	  if (result < max_size && ferror (yyin))
Packit ba3681
	    einfo (_("%F%P: read in flex scanner failed\n"));
Packit ba3681
	}
Packit ba3681
    }
Packit ba3681
  return result;
Packit ba3681
}
Packit ba3681
Packit ba3681
/* Eat the rest of a C-style comment.  */
Packit ba3681
Packit ba3681
static void
Packit ba3681
comment (void)
Packit ba3681
{
Packit ba3681
  int c;
Packit ba3681
Packit ba3681
  while (1)
Packit ba3681
    {
Packit ba3681
      c = input();
Packit ba3681
      while (c != '*' && c != EOF)
Packit ba3681
	{
Packit ba3681
	  if (c == '\n')
Packit ba3681
	    lineno++;
Packit ba3681
	  c = input();
Packit ba3681
	}
Packit ba3681
Packit ba3681
      if (c == '*')
Packit ba3681
	{
Packit ba3681
	  c = input();
Packit ba3681
	  while (c == '*')
Packit ba3681
	    c = input();
Packit ba3681
	  if (c == '/')
Packit ba3681
	    break;			/* found the end */
Packit ba3681
	}
Packit ba3681
Packit ba3681
      if (c == '\n')
Packit ba3681
	lineno++;
Packit ba3681
Packit ba3681
      if (c == EOF)
Packit ba3681
	{
Packit ba3681
	  einfo (_("%F%P: EOF in comment\n"));
Packit ba3681
	  break;
Packit ba3681
	}
Packit ba3681
    }
Packit ba3681
}
Packit ba3681
Packit ba3681
/* Warn the user about a garbage character WHAT in the input
Packit ba3681
   in context WHERE.  */
Packit ba3681
Packit ba3681
static void
Packit ba3681
lex_warn_invalid (char *where, char *what)
Packit ba3681
{
Packit ba3681
  char buf[5];
Packit ba3681
Packit ba3681
  /* If we have found an input file whose format we do not recognize,
Packit ba3681
     and we are therefore treating it as a linker script, and we find
Packit ba3681
     an invalid character, then most likely this is a real object file
Packit ba3681
     of some different format.  Treat it as such.  */
Packit ba3681
  if (ldfile_assumed_script)
Packit ba3681
    {
Packit ba3681
      bfd_set_error (bfd_error_file_not_recognized);
Packit ba3681
      einfo (_("%F%s: file not recognized: %E\n"), ldlex_filename ());
Packit ba3681
    }
Packit ba3681
Packit ba3681
  if (! ISPRINT (*what))
Packit ba3681
    {
Packit ba3681
      sprintf (buf, "\\%03o", *(unsigned char *) what);
Packit ba3681
      what = buf;
Packit ba3681
    }
Packit ba3681
Packit ba3681
  einfo (_("%P:%S: ignoring invalid character `%s'%s\n"), NULL, what, where);
Packit ba3681
}