1fae548d3Szrj %option nounput noyywrap 2fae548d3Szrj 3fae548d3Szrj %{ 4fae548d3Szrj 5fae548d3Szrj /* Copyright (C) 1991-2020 Free Software Foundation, Inc. 6fae548d3Szrj Written by Steve Chamberlain of Cygnus Support. 7fae548d3Szrj 8fae548d3Szrj This file is part of the GNU Binutils. 9fae548d3Szrj 10fae548d3Szrj This program is free software; you can redistribute it and/or modify 11fae548d3Szrj it under the terms of the GNU General Public License as published by 12fae548d3Szrj the Free Software Foundation; either version 3 of the License, or 13fae548d3Szrj (at your option) any later version. 14fae548d3Szrj 15fae548d3Szrj This program is distributed in the hope that it will be useful, 16fae548d3Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of 17fae548d3Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18fae548d3Szrj GNU General Public License for more details. 19fae548d3Szrj 20fae548d3Szrj You should have received a copy of the GNU General Public License 21fae548d3Szrj along with this program; if not, write to the Free Software 22fae548d3Szrj Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 23fae548d3Szrj MA 02110-1301, USA. */ 24fae548d3Szrj 25*a72d4fb1Szrj #include "sysdep.h" 26fae548d3Szrj #include "bfd.h" 27fae548d3Szrj #include "safe-ctype.h" 28fae548d3Szrj #include "bfdlink.h" 29fae548d3Szrj #include "ctf-api.h" 30fae548d3Szrj #include "ld.h" 31fae548d3Szrj #include "ldmisc.h" 32fae548d3Szrj #include "ldexp.h" 33fae548d3Szrj #include "ldlang.h" 34fae548d3Szrj #include <ldgram.h> 35fae548d3Szrj #include "ldfile.h" 36fae548d3Szrj #include "ldlex.h" 37fae548d3Szrj #include "ldmain.h" 38fae548d3Szrj #include "libiberty.h" 39fae548d3Szrj 40fae548d3Szrj /* The type of top-level parser input. 41fae548d3Szrj yylex and yyparse (indirectly) both check this. */ 42fae548d3Szrj input_type parser_input; 43fae548d3Szrj 44fae548d3Szrj /* Line number in the current input file. */ 45fae548d3Szrj unsigned int lineno; 46fae548d3Szrj 47fae548d3Szrj /* The string we are currently lexing, or NULL if we are reading a 48fae548d3Szrj file. */ 49fae548d3Szrj const char *lex_string = NULL; 50fae548d3Szrj 51fae548d3Szrj /* Support for flex reading from more than one input file (stream). 52fae548d3Szrj `include_stack' is flex's input state for each open file; 53fae548d3Szrj `file_name_stack' is the file names. `lineno_stack' is the current 54fae548d3Szrj line numbers. 55fae548d3Szrj 56fae548d3Szrj If `include_stack_ptr' is 0, we haven't started reading anything yet. 57fae548d3Szrj Otherwise, stack elements 0 through `include_stack_ptr - 1' are valid. */ 58fae548d3Szrj 59fae548d3Szrj #undef YY_INPUT 60fae548d3Szrj #define YY_INPUT(buf,result,max_size) result = yy_input (buf, max_size) 61fae548d3Szrj 62fae548d3Szrj #ifndef YY_NO_UNPUT 63fae548d3Szrj #define YY_NO_UNPUT 64fae548d3Szrj #endif 65fae548d3Szrj 66fae548d3Szrj #define MAX_INCLUDE_DEPTH 10 67fae548d3Szrj static YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; 68fae548d3Szrj static const char *file_name_stack[MAX_INCLUDE_DEPTH]; 69fae548d3Szrj static unsigned int lineno_stack[MAX_INCLUDE_DEPTH]; 70fae548d3Szrj static unsigned int sysrooted_stack[MAX_INCLUDE_DEPTH]; 71fae548d3Szrj static unsigned int include_stack_ptr = 0; 72fae548d3Szrj static int vers_node_nesting = 0; 73fae548d3Szrj 74fae548d3Szrj static int yy_input (char *, int); 75fae548d3Szrj static void comment (void); 76fae548d3Szrj static void lex_warn_invalid (char *where, char *what); 77fae548d3Szrj 78fae548d3Szrj /* STATES 79fae548d3Szrj EXPRESSION definitely in an expression 80fae548d3Szrj SCRIPT definitely in a script 81fae548d3Szrj INPUTLIST definitely in a script, a filename-list 82fae548d3Szrj BOTH either EXPRESSION or SCRIPT 83fae548d3Szrj DEFSYMEXP in an argument to -defsym 84fae548d3Szrj MRI in an MRI script 85fae548d3Szrj VERS_START starting a Sun style mapfile 86fae548d3Szrj VERS_SCRIPT a Sun style mapfile 87fae548d3Szrj VERS_NODE a node within a Sun style mapfile 88fae548d3Szrj */ 89fae548d3Szrj #define RTOKEN(x) { yylval.token = x; return x; } 90fae548d3Szrj 91fae548d3Szrj %} 92fae548d3Szrj 93fae548d3Szrj %a 4000 94fae548d3Szrj %o 5000 95fae548d3Szrj 96fae548d3Szrj WILDCHAR [_a-zA-Z0-9\/\.\\\$\~\-\+\:\[\]\,\=\?\*\^\!] 97fae548d3Szrj FILENAMECHAR [_a-zA-Z0-9\/\.\\\$\~\-\+\:\[\]\,\=] 98fae548d3Szrj NOCFILENAMECHAR [_a-zA-Z0-9\/\.\\\$\~\-\+\:\[\]] 99fae548d3Szrj SYMBOLNAMECHAR [_a-zA-Z0-9\/\.\\\$\~] 100fae548d3Szrj FILENAMECHAR1 [_a-zA-Z\/\.\\\$\~] 101fae548d3Szrj SYMBOLNAMECHAR1 [_a-zA-Z\.\\\$] 102fae548d3Szrj WHITE [ \t\n\r]+ 103fae548d3Szrj 104fae548d3Szrj V_TAG [.$_a-zA-Z][._a-zA-Z0-9]* 105fae548d3Szrj V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* 106fae548d3Szrj 107fae548d3Szrj %s SCRIPT 108fae548d3Szrj %s INPUTLIST 109fae548d3Szrj %s EXPRESSION 110fae548d3Szrj %s BOTH 111fae548d3Szrj %s DEFSYMEXP 112fae548d3Szrj %s MRI 113fae548d3Szrj %s VERS_START 114fae548d3Szrj %s VERS_SCRIPT 115fae548d3Szrj %s VERS_NODE 116fae548d3Szrj %% 117fae548d3Szrj 118fae548d3Szrj if (parser_input != input_selected) 119fae548d3Szrj { 120fae548d3Szrj /* The first token of the input determines the initial parser state. */ 121fae548d3Szrj input_type t = parser_input; 122fae548d3Szrj parser_input = input_selected; 123fae548d3Szrj switch (t) 124fae548d3Szrj { 125fae548d3Szrj case input_script: return INPUT_SCRIPT; break; 126fae548d3Szrj case input_mri_script: return INPUT_MRI_SCRIPT; break; 127fae548d3Szrj case input_version_script: return INPUT_VERSION_SCRIPT; break; 128fae548d3Szrj case input_dynamic_list: return INPUT_DYNAMIC_LIST; break; 129fae548d3Szrj case input_defsym: return INPUT_DEFSYM; break; 130fae548d3Szrj default: abort (); 131fae548d3Szrj } 132fae548d3Szrj } 133fae548d3Szrj 134fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,VERS_START,VERS_NODE,VERS_SCRIPT,INPUTLIST>"/*" { comment (); } 135fae548d3Szrj 136fae548d3Szrj 137fae548d3Szrj <DEFSYMEXP>"-" { RTOKEN('-');} 138fae548d3Szrj <DEFSYMEXP>"+" { RTOKEN('+');} 139fae548d3Szrj <DEFSYMEXP>{SYMBOLNAMECHAR1}{SYMBOLNAMECHAR}* { yylval.name = xstrdup (yytext); 140fae548d3Szrj return NAME; } 141fae548d3Szrj <DEFSYMEXP>"=" { RTOKEN('='); } 142fae548d3Szrj 143fae548d3Szrj <MRI,EXPRESSION>"$"([0-9A-Fa-f])+ { 144fae548d3Szrj yylval.integer = bfd_scan_vma (yytext + 1, 0, 16); 145fae548d3Szrj yylval.bigint.str = NULL; 146fae548d3Szrj return INT; 147fae548d3Szrj } 148fae548d3Szrj 149fae548d3Szrj <MRI,EXPRESSION>([0-9A-Fa-f])+(H|h|X|x|B|b|O|o|D|d) { 150fae548d3Szrj int ibase ; 151fae548d3Szrj switch (yytext[yyleng - 1]) { 152fae548d3Szrj case 'X': 153fae548d3Szrj case 'x': 154fae548d3Szrj case 'H': 155fae548d3Szrj case 'h': 156fae548d3Szrj ibase = 16; 157fae548d3Szrj break; 158fae548d3Szrj case 'O': 159fae548d3Szrj case 'o': 160fae548d3Szrj ibase = 8; 161fae548d3Szrj break; 162fae548d3Szrj case 'B': 163fae548d3Szrj case 'b': 164fae548d3Szrj ibase = 2; 165fae548d3Szrj break; 166fae548d3Szrj default: 167fae548d3Szrj ibase = 10; 168fae548d3Szrj } 169fae548d3Szrj yylval.integer = bfd_scan_vma (yytext, 0, 170fae548d3Szrj ibase); 171fae548d3Szrj yylval.bigint.str = NULL; 172fae548d3Szrj return INT; 173fae548d3Szrj } 174fae548d3Szrj <SCRIPT,DEFSYMEXP,MRI,BOTH,EXPRESSION>((("$"|0[xX])([0-9A-Fa-f])+)|(([0-9])+))(M|K|m|k)? { 175fae548d3Szrj char *s = yytext; 176fae548d3Szrj int ibase = 0; 177fae548d3Szrj 178fae548d3Szrj if (*s == '$') 179fae548d3Szrj { 180fae548d3Szrj ++s; 181fae548d3Szrj ibase = 16; 182fae548d3Szrj } 183fae548d3Szrj yylval.integer = bfd_scan_vma (s, 0, ibase); 184fae548d3Szrj yylval.bigint.str = NULL; 185fae548d3Szrj if (yytext[yyleng - 1] == 'M' 186fae548d3Szrj || yytext[yyleng - 1] == 'm') 187fae548d3Szrj { 188fae548d3Szrj yylval.integer *= 1024 * 1024; 189fae548d3Szrj } 190fae548d3Szrj else if (yytext[yyleng - 1] == 'K' 191fae548d3Szrj || yytext[yyleng - 1]=='k') 192fae548d3Szrj { 193fae548d3Szrj yylval.integer *= 1024; 194fae548d3Szrj } 195fae548d3Szrj else if (yytext[0] == '0' 196fae548d3Szrj && (yytext[1] == 'x' 197fae548d3Szrj || yytext[1] == 'X')) 198fae548d3Szrj { 199fae548d3Szrj yylval.bigint.str = xstrdup (yytext + 2); 200fae548d3Szrj } 201fae548d3Szrj return INT; 202fae548d3Szrj } 203fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"]" { RTOKEN(']');} 204fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"[" { RTOKEN('[');} 205fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"<<=" { RTOKEN(LSHIFTEQ);} 206fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>">>=" { RTOKEN(RSHIFTEQ);} 207fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"||" { RTOKEN(OROR);} 208fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"==" { RTOKEN(EQ);} 209fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"!=" { RTOKEN(NE);} 210fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>">=" { RTOKEN(GE);} 211fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"<=" { RTOKEN(LE);} 212fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"<<" { RTOKEN(LSHIFT);} 213fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>">>" { RTOKEN(RSHIFT);} 214fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"+=" { RTOKEN(PLUSEQ);} 215fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"-=" { RTOKEN(MINUSEQ);} 216fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"*=" { RTOKEN(MULTEQ);} 217fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"/=" { RTOKEN(DIVEQ);} 218fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"&=" { RTOKEN(ANDEQ);} 219fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"|=" { RTOKEN(OREQ);} 220fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"&&" { RTOKEN(ANDAND);} 221fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>">" { RTOKEN('>');} 222fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI,INPUTLIST>"," { RTOKEN(',');} 223fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"&" { RTOKEN('&');} 224fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"|" { RTOKEN('|');} 225fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"~" { RTOKEN('~');} 226fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"!" { RTOKEN('!');} 227fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"?" { RTOKEN('?');} 228fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"*" { RTOKEN('*');} 229fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"+" { RTOKEN('+');} 230fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"-" { RTOKEN('-');} 231fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"/" { RTOKEN('/');} 232fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"%" { RTOKEN('%');} 233fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"<" { RTOKEN('<');} 234fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"=" { RTOKEN('=');} 235fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"}" { RTOKEN('}') ; } 236fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>"{" { RTOKEN('{'); } 237fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI,INPUTLIST>")" { RTOKEN(')');} 238fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI,INPUTLIST>"(" { RTOKEN('(');} 239fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>":" { RTOKEN(':'); } 240fae548d3Szrj <BOTH,SCRIPT,EXPRESSION,MRI>";" { RTOKEN(';');} 241fae548d3Szrj <BOTH,SCRIPT>"MEMORY" { RTOKEN(MEMORY);} 242fae548d3Szrj <BOTH,SCRIPT>"REGION_ALIAS" { RTOKEN(REGION_ALIAS);} 243fae548d3Szrj <BOTH,SCRIPT>"LD_FEATURE" { RTOKEN(LD_FEATURE);} 244fae548d3Szrj <BOTH,SCRIPT,EXPRESSION>"ORIGIN" { RTOKEN(ORIGIN);} 245fae548d3Szrj <BOTH,SCRIPT>"VERSION" { RTOKEN(VERSIONK);} 246fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"BLOCK" { RTOKEN(BLOCK);} 247fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"BIND" { RTOKEN(BIND);} 248fae548d3Szrj <BOTH,SCRIPT,EXPRESSION>"LENGTH" { RTOKEN(LENGTH);} 249fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"ALIGN" { RTOKEN(ALIGN_K);} 250fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_ALIGN" { RTOKEN(DATA_SEGMENT_ALIGN);} 251fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_RELRO_END" { RTOKEN(DATA_SEGMENT_RELRO_END);} 252fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_END" { RTOKEN(DATA_SEGMENT_END);} 253fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"ADDR" { RTOKEN(ADDR);} 254fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"LOADADDR" { RTOKEN(LOADADDR);} 255fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"ALIGNOF" { RTOKEN(ALIGNOF); } 256fae548d3Szrj <EXPRESSION,BOTH>"MAX" { RTOKEN(MAX_K); } 257fae548d3Szrj <EXPRESSION,BOTH>"MIN" { RTOKEN(MIN_K); } 258fae548d3Szrj <EXPRESSION,BOTH>"LOG2CEIL" { RTOKEN(LOG2CEIL); } 259fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"ASSERT" { RTOKEN(ASSERT_K); } 260fae548d3Szrj <BOTH,SCRIPT>"ENTRY" { RTOKEN(ENTRY);} 261fae548d3Szrj <BOTH,SCRIPT,MRI>"EXTERN" { RTOKEN(EXTERN);} 262fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"NEXT" { RTOKEN(NEXT);} 263fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"sizeof_headers" { RTOKEN(SIZEOF_HEADERS);} 264fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"SIZEOF_HEADERS" { RTOKEN(SIZEOF_HEADERS);} 265fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"SEGMENT_START" { RTOKEN(SEGMENT_START);} 266fae548d3Szrj <BOTH,SCRIPT>"MAP" { RTOKEN(MAP);} 267fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"SIZEOF" { RTOKEN(SIZEOF);} 268fae548d3Szrj <BOTH,SCRIPT>"TARGET" { RTOKEN(TARGET_K);} 269fae548d3Szrj <BOTH,SCRIPT>"SEARCH_DIR" { RTOKEN(SEARCH_DIR);} 270fae548d3Szrj <BOTH,SCRIPT>"OUTPUT" { RTOKEN(OUTPUT);} 271fae548d3Szrj <BOTH,SCRIPT>"INPUT" { RTOKEN(INPUT);} 272fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"GROUP" { RTOKEN(GROUP);} 273fae548d3Szrj <EXPRESSION,BOTH,SCRIPT,INPUTLIST>"AS_NEEDED" { RTOKEN(AS_NEEDED);} 274fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"DEFINED" { RTOKEN(DEFINED);} 275fae548d3Szrj <BOTH,SCRIPT>"CREATE_OBJECT_SYMBOLS" { RTOKEN(CREATE_OBJECT_SYMBOLS);} 276fae548d3Szrj <BOTH,SCRIPT>"CONSTRUCTORS" { RTOKEN( CONSTRUCTORS);} 277fae548d3Szrj <BOTH,SCRIPT>"FORCE_COMMON_ALLOCATION" { RTOKEN(FORCE_COMMON_ALLOCATION);} 278fae548d3Szrj <BOTH,SCRIPT>"FORCE_GROUP_ALLOCATION" { RTOKEN(FORCE_GROUP_ALLOCATION);} 279fae548d3Szrj <BOTH,SCRIPT>"INHIBIT_COMMON_ALLOCATION" { RTOKEN(INHIBIT_COMMON_ALLOCATION);} 280fae548d3Szrj <BOTH,SCRIPT>"SECTIONS" { RTOKEN(SECTIONS);} 281fae548d3Szrj <BOTH,SCRIPT>"INSERT" { RTOKEN(INSERT_K);} 282fae548d3Szrj <BOTH,SCRIPT>"AFTER" { RTOKEN(AFTER);} 283fae548d3Szrj <BOTH,SCRIPT>"BEFORE" { RTOKEN(BEFORE);} 284fae548d3Szrj <BOTH,SCRIPT>"FILL" { RTOKEN(FILL);} 285fae548d3Szrj <BOTH,SCRIPT>"STARTUP" { RTOKEN(STARTUP);} 286fae548d3Szrj <BOTH,SCRIPT>"OUTPUT_FORMAT" { RTOKEN(OUTPUT_FORMAT);} 287fae548d3Szrj <BOTH,SCRIPT>"OUTPUT_ARCH" { RTOKEN( OUTPUT_ARCH);} 288fae548d3Szrj <BOTH,SCRIPT>"HLL" { RTOKEN(HLL);} 289fae548d3Szrj <BOTH,SCRIPT>"SYSLIB" { RTOKEN(SYSLIB);} 290fae548d3Szrj <BOTH,SCRIPT>"FLOAT" { RTOKEN(FLOAT);} 291fae548d3Szrj <BOTH,SCRIPT>"QUAD" { RTOKEN( QUAD);} 292fae548d3Szrj <BOTH,SCRIPT>"SQUAD" { RTOKEN( SQUAD);} 293fae548d3Szrj <BOTH,SCRIPT>"LONG" { RTOKEN( LONG);} 294fae548d3Szrj <BOTH,SCRIPT>"SHORT" { RTOKEN( SHORT);} 295fae548d3Szrj <BOTH,SCRIPT>"BYTE" { RTOKEN( BYTE);} 296fae548d3Szrj <BOTH,SCRIPT>"NOFLOAT" { RTOKEN(NOFLOAT);} 297fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"NOCROSSREFS" { RTOKEN(NOCROSSREFS);} 298fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"NOCROSSREFS_TO" { RTOKEN(NOCROSSREFS_TO);} 299fae548d3Szrj <BOTH,SCRIPT>"OVERLAY" { RTOKEN(OVERLAY); } 300fae548d3Szrj <BOTH,SCRIPT>"SORT_BY_NAME" { RTOKEN(SORT_BY_NAME); } 301fae548d3Szrj <BOTH,SCRIPT>"SORT_BY_ALIGNMENT" { RTOKEN(SORT_BY_ALIGNMENT); } 302fae548d3Szrj <BOTH,SCRIPT>"SORT" { RTOKEN(SORT_BY_NAME); } 303fae548d3Szrj <BOTH,SCRIPT>"SORT_BY_INIT_PRIORITY" { RTOKEN(SORT_BY_INIT_PRIORITY); } 304fae548d3Szrj <BOTH,SCRIPT>"SORT_NONE" { RTOKEN(SORT_NONE); } 305fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"NOLOAD" { RTOKEN(NOLOAD);} 306fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"DSECT" { RTOKEN(DSECT);} 307fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"COPY" { RTOKEN(COPY);} 308fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"INFO" { RTOKEN(INFO);} 309fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"OVERLAY" { RTOKEN(OVERLAY);} 310fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RO" { RTOKEN(ONLY_IF_RO); } 311fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RW" { RTOKEN(ONLY_IF_RW); } 312fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"SPECIAL" { RTOKEN(SPECIAL); } 313fae548d3Szrj <BOTH,SCRIPT>"o" { RTOKEN(ORIGIN);} 314fae548d3Szrj <BOTH,SCRIPT>"org" { RTOKEN(ORIGIN);} 315fae548d3Szrj <BOTH,SCRIPT>"l" { RTOKEN( LENGTH);} 316fae548d3Szrj <BOTH,SCRIPT>"len" { RTOKEN( LENGTH);} 317fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"INPUT_SECTION_FLAGS" { RTOKEN(INPUT_SECTION_FLAGS); } 318fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"INCLUDE" { RTOKEN(INCLUDE);} 319fae548d3Szrj <BOTH,SCRIPT>"PHDRS" { RTOKEN (PHDRS); } 320fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"AT" { RTOKEN(AT);} 321fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"ALIGN_WITH_INPUT" { RTOKEN(ALIGN_WITH_INPUT);} 322fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"SUBALIGN" { RTOKEN(SUBALIGN);} 323fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"HIDDEN" { RTOKEN(HIDDEN); } 324fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"PROVIDE" { RTOKEN(PROVIDE); } 325fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"PROVIDE_HIDDEN" { RTOKEN(PROVIDE_HIDDEN); } 326fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"KEEP" { RTOKEN(KEEP); } 327fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"EXCLUDE_FILE" { RTOKEN(EXCLUDE_FILE); } 328fae548d3Szrj <EXPRESSION,BOTH,SCRIPT>"CONSTANT" { RTOKEN(CONSTANT);} 329fae548d3Szrj <MRI>"#".*\n? { ++ lineno; } 330fae548d3Szrj <MRI>"\n" { ++ lineno; RTOKEN(NEWLINE); } 331fae548d3Szrj <MRI>"*".* { /* Mri comment line */ } 332fae548d3Szrj <MRI>";".* { /* Mri comment line */ } 333fae548d3Szrj <MRI>"END" { RTOKEN(ENDWORD); } 334fae548d3Szrj <MRI>"ALIGNMOD" { RTOKEN(ALIGNMOD);} 335fae548d3Szrj <MRI>"ALIGN" { RTOKEN(ALIGN_K);} 336fae548d3Szrj <MRI>"CHIP" { RTOKEN(CHIP); } 337fae548d3Szrj <MRI>"BASE" { RTOKEN(BASE); } 338fae548d3Szrj <MRI>"ALIAS" { RTOKEN(ALIAS); } 339fae548d3Szrj <MRI>"TRUNCATE" { RTOKEN(TRUNCATE); } 340fae548d3Szrj <MRI>"LOAD" { RTOKEN(LOAD); } 341fae548d3Szrj <MRI>"PUBLIC" { RTOKEN(PUBLIC); } 342fae548d3Szrj <MRI>"ORDER" { RTOKEN(ORDER); } 343fae548d3Szrj <MRI>"NAME" { RTOKEN(NAMEWORD); } 344fae548d3Szrj <MRI>"FORMAT" { RTOKEN(FORMAT); } 345fae548d3Szrj <MRI>"CASE" { RTOKEN(CASE); } 346fae548d3Szrj <MRI>"START" { RTOKEN(START); } 347fae548d3Szrj <MRI>"LIST".* { RTOKEN(LIST); /* LIST and ignore to end of line */ } 348fae548d3Szrj <MRI>"SECT" { RTOKEN(SECT); } 349fae548d3Szrj <EXPRESSION,BOTH,SCRIPT,MRI>"ABSOLUTE" { RTOKEN(ABSOLUTE); } 350fae548d3Szrj <MRI>"end" { RTOKEN(ENDWORD); } 351fae548d3Szrj <MRI>"alignmod" { RTOKEN(ALIGNMOD);} 352fae548d3Szrj <MRI>"align" { RTOKEN(ALIGN_K);} 353fae548d3Szrj <MRI>"chip" { RTOKEN(CHIP); } 354fae548d3Szrj <MRI>"base" { RTOKEN(BASE); } 355fae548d3Szrj <MRI>"alias" { RTOKEN(ALIAS); } 356fae548d3Szrj <MRI>"truncate" { RTOKEN(TRUNCATE); } 357fae548d3Szrj <MRI>"load" { RTOKEN(LOAD); } 358fae548d3Szrj <MRI>"public" { RTOKEN(PUBLIC); } 359fae548d3Szrj <MRI>"order" { RTOKEN(ORDER); } 360fae548d3Szrj <MRI>"name" { RTOKEN(NAMEWORD); } 361fae548d3Szrj <MRI>"format" { RTOKEN(FORMAT); } 362fae548d3Szrj <MRI>"case" { RTOKEN(CASE); } 363fae548d3Szrj <MRI>"extern" { RTOKEN(EXTERN); } 364fae548d3Szrj <MRI>"start" { RTOKEN(START); } 365fae548d3Szrj <MRI>"list".* { RTOKEN(LIST); /* LIST and ignore to end of line */ } 366fae548d3Szrj <MRI>"sect" { RTOKEN(SECT); } 367fae548d3Szrj <EXPRESSION,BOTH,SCRIPT,MRI>"absolute" { RTOKEN(ABSOLUTE); } 368fae548d3Szrj 369fae548d3Szrj <MRI>{FILENAMECHAR1}{NOCFILENAMECHAR}* { 370fae548d3Szrj /* Filename without commas, needed to parse mri stuff */ 371fae548d3Szrj yylval.name = xstrdup (yytext); 372fae548d3Szrj return NAME; 373fae548d3Szrj } 374fae548d3Szrj 375fae548d3Szrj 376fae548d3Szrj <BOTH,INPUTLIST>{FILENAMECHAR1}{FILENAMECHAR}* { 377fae548d3Szrj yylval.name = xstrdup (yytext); 378fae548d3Szrj return NAME; 379fae548d3Szrj } 380fae548d3Szrj <INPUTLIST>"="{FILENAMECHAR1}{FILENAMECHAR}* { 381fae548d3Szrj /* Filename to be prefixed by --sysroot or when non-sysrooted, nothing. */ 382fae548d3Szrj yylval.name = xstrdup (yytext); 383fae548d3Szrj return NAME; 384fae548d3Szrj } 385fae548d3Szrj <BOTH,INPUTLIST>"-l"{FILENAMECHAR}+ { 386fae548d3Szrj yylval.name = xstrdup (yytext + 2); 387fae548d3Szrj return LNAME; 388fae548d3Szrj } 389fae548d3Szrj <EXPRESSION>{SYMBOLNAMECHAR1}{NOCFILENAMECHAR}* { 390fae548d3Szrj yylval.name = xstrdup (yytext); 391fae548d3Szrj return NAME; 392fae548d3Szrj } 393fae548d3Szrj <EXPRESSION>"/DISCARD/" { 394fae548d3Szrj yylval.name = xstrdup (yytext); 395fae548d3Szrj return NAME; 396fae548d3Szrj } 397fae548d3Szrj <EXPRESSION>"-l"{NOCFILENAMECHAR}+ { 398fae548d3Szrj yylval.name = xstrdup (yytext + 2); 399fae548d3Szrj return LNAME; 400fae548d3Szrj } 401fae548d3Szrj <SCRIPT>{WILDCHAR}* { 402fae548d3Szrj /* Annoyingly, this pattern can match comments, and we have 403fae548d3Szrj longest match issues to consider. So if the first two 404fae548d3Szrj characters are a comment opening, put the input back and 405fae548d3Szrj try again. */ 406fae548d3Szrj if (yytext[0] == '/' && yytext[1] == '*') 407fae548d3Szrj { 408fae548d3Szrj yyless (2); 409fae548d3Szrj comment (); 410fae548d3Szrj } 411fae548d3Szrj else 412fae548d3Szrj { 413fae548d3Szrj yylval.name = xstrdup (yytext); 414fae548d3Szrj return NAME; 415fae548d3Szrj } 416fae548d3Szrj } 417fae548d3Szrj 418fae548d3Szrj <EXPRESSION,BOTH,SCRIPT,VERS_NODE,INPUTLIST>"\""[^\"]*"\"" { 419fae548d3Szrj /* No matter the state, quotes 420fae548d3Szrj give what's inside. */ 421fae548d3Szrj bfd_size_type len; 422fae548d3Szrj yylval.name = xstrdup (yytext + 1); 423fae548d3Szrj /* PR ld/20906. A corrupt input file 424fae548d3Szrj can contain bogus strings. */ 425fae548d3Szrj len = strlen (yylval.name); 426fae548d3Szrj if (len > (bfd_size_type) yyleng - 2) 427fae548d3Szrj len = yyleng - 2; 428fae548d3Szrj yylval.name[len] = 0; 429fae548d3Szrj return NAME; 430fae548d3Szrj } 431fae548d3Szrj <BOTH,SCRIPT,EXPRESSION>"\n" { lineno++;} 432fae548d3Szrj <MRI,BOTH,SCRIPT,EXPRESSION>[ \t\r]+ { } 433fae548d3Szrj 434fae548d3Szrj <VERS_NODE,VERS_SCRIPT>[:,;] { return *yytext; } 435fae548d3Szrj 436fae548d3Szrj <VERS_NODE>global { RTOKEN(GLOBAL); } 437fae548d3Szrj 438fae548d3Szrj <VERS_NODE>local { RTOKEN(LOCAL); } 439fae548d3Szrj 440fae548d3Szrj <VERS_NODE>extern { RTOKEN(EXTERN); } 441fae548d3Szrj 442fae548d3Szrj <VERS_NODE>{V_IDENTIFIER} { yylval.name = xstrdup (yytext); 443fae548d3Szrj return VERS_IDENTIFIER; } 444fae548d3Szrj 445fae548d3Szrj <VERS_SCRIPT>{V_TAG} { yylval.name = xstrdup (yytext); 446fae548d3Szrj return VERS_TAG; } 447fae548d3Szrj 448fae548d3Szrj <VERS_START>"{" { BEGIN(VERS_SCRIPT); return *yytext; } 449fae548d3Szrj 450fae548d3Szrj <VERS_SCRIPT>"{" { BEGIN(VERS_NODE); 451fae548d3Szrj vers_node_nesting = 0; 452fae548d3Szrj return *yytext; 453fae548d3Szrj } 454fae548d3Szrj <VERS_SCRIPT>"}" { return *yytext; } 455fae548d3Szrj <VERS_NODE>"{" { vers_node_nesting++; return *yytext; } 456fae548d3Szrj <VERS_NODE>"}" { if (--vers_node_nesting < 0) 457fae548d3Szrj BEGIN(VERS_SCRIPT); 458fae548d3Szrj return *yytext; 459fae548d3Szrj } 460fae548d3Szrj 461fae548d3Szrj <VERS_START,VERS_NODE,VERS_SCRIPT,INPUTLIST>[\n] { lineno++; } 462fae548d3Szrj 463fae548d3Szrj <VERS_START,VERS_NODE,VERS_SCRIPT>#.* { /* Eat up comments */ } 464fae548d3Szrj 465fae548d3Szrj <VERS_START,VERS_NODE,VERS_SCRIPT,INPUTLIST>[ \t\r]+ { /* Eat up whitespace */ } 466fae548d3Szrj 467fae548d3Szrj <<EOF>> { 468fae548d3Szrj include_stack_ptr--; 469fae548d3Szrj if (include_stack_ptr == 0) 470fae548d3Szrj { 471fae548d3Szrj lineno = 0; 472fae548d3Szrj yyterminate (); 473fae548d3Szrj } 474fae548d3Szrj else 475fae548d3Szrj yy_switch_to_buffer (include_stack[include_stack_ptr]); 476fae548d3Szrj 477fae548d3Szrj lineno = lineno_stack[include_stack_ptr]; 478fae548d3Szrj input_flags.sysrooted = sysrooted_stack[include_stack_ptr]; 479fae548d3Szrj 480fae548d3Szrj return END; 481fae548d3Szrj } 482fae548d3Szrj 483fae548d3Szrj <SCRIPT,MRI,VERS_START,VERS_SCRIPT,VERS_NODE>. lex_warn_invalid (" in script", yytext); 484fae548d3Szrj <EXPRESSION,DEFSYMEXP,BOTH>. lex_warn_invalid (" in expression", yytext); 485fae548d3Szrj 486fae548d3Szrj %% 487fae548d3Szrj 488fae548d3Szrj 489fae548d3Szrj /* Switch flex to reading script file NAME, open on FILE, 490fae548d3Szrj saving the current input info on the include stack. */ 491fae548d3Szrj 492fae548d3Szrj void 493fae548d3Szrj lex_push_file (FILE *file, const char *name, unsigned int sysrooted) 494fae548d3Szrj { 495fae548d3Szrj if (include_stack_ptr >= MAX_INCLUDE_DEPTH) 496fae548d3Szrj { 497fae548d3Szrj einfo (_("%F:includes nested too deeply\n")); 498fae548d3Szrj } 499fae548d3Szrj file_name_stack[include_stack_ptr] = name; 500fae548d3Szrj lineno_stack[include_stack_ptr] = lineno; 501fae548d3Szrj sysrooted_stack[include_stack_ptr] = input_flags.sysrooted; 502fae548d3Szrj include_stack[include_stack_ptr] = YY_CURRENT_BUFFER; 503fae548d3Szrj 504fae548d3Szrj include_stack_ptr++; 505fae548d3Szrj lineno = 1; 506fae548d3Szrj input_flags.sysrooted = sysrooted; 507fae548d3Szrj yyin = file; 508fae548d3Szrj yy_switch_to_buffer (yy_create_buffer (yyin, YY_BUF_SIZE)); 509fae548d3Szrj } 510fae548d3Szrj 511fae548d3Szrj /* Return a newly created flex input buffer containing STRING, 512fae548d3Szrj which is SIZE bytes long. */ 513fae548d3Szrj 514fae548d3Szrj static YY_BUFFER_STATE 515fae548d3Szrj yy_create_string_buffer (const char *string, size_t size) 516fae548d3Szrj { 517fae548d3Szrj YY_BUFFER_STATE b; 518fae548d3Szrj 519fae548d3Szrj /* Calls to m-alloc get turned by sed into xm-alloc. */ 520fae548d3Szrj b = malloc (sizeof (struct yy_buffer_state)); 521fae548d3Szrj b->yy_input_file = 0; 522fae548d3Szrj b->yy_buf_size = size; 523fae548d3Szrj 524fae548d3Szrj /* yy_ch_buf has to be 2 characters longer than the size given because 525fae548d3Szrj we need to put in 2 end-of-buffer characters. */ 526fae548d3Szrj b->yy_ch_buf = malloc ((unsigned) (b->yy_buf_size + 3)); 527fae548d3Szrj 528fae548d3Szrj b->yy_ch_buf[0] = '\n'; 529fae548d3Szrj strcpy (b->yy_ch_buf+1, string); 530fae548d3Szrj b->yy_ch_buf[size+1] = YY_END_OF_BUFFER_CHAR; 531fae548d3Szrj b->yy_ch_buf[size+2] = YY_END_OF_BUFFER_CHAR; 532fae548d3Szrj b->yy_n_chars = size+1; 533fae548d3Szrj b->yy_buf_pos = &b->yy_ch_buf[1]; 534fae548d3Szrj 535fae548d3Szrj b->yy_is_our_buffer = 1; 536fae548d3Szrj b->yy_is_interactive = 0; 537fae548d3Szrj b->yy_at_bol = 1; 538fae548d3Szrj b->yy_fill_buffer = 0; 539fae548d3Szrj 540fae548d3Szrj /* flex 2.4.7 changed the interface. FIXME: We should not be using 541fae548d3Szrj a flex internal interface in the first place! */ 542fae548d3Szrj #ifdef YY_BUFFER_NEW 543fae548d3Szrj b->yy_buffer_status = YY_BUFFER_NEW; 544fae548d3Szrj #else 545fae548d3Szrj b->yy_eof_status = EOF_NOT_SEEN; 546fae548d3Szrj #endif 547fae548d3Szrj 548fae548d3Szrj return b; 549fae548d3Szrj } 550fae548d3Szrj 551fae548d3Szrj /* Switch flex to reading from STRING, saving the current input info 552fae548d3Szrj on the include stack. */ 553fae548d3Szrj 554fae548d3Szrj void 555fae548d3Szrj lex_redirect (const char *string, const char *fake_filename, unsigned int count) 556fae548d3Szrj { 557fae548d3Szrj YY_BUFFER_STATE tmp; 558fae548d3Szrj 559fae548d3Szrj yy_init = 0; 560fae548d3Szrj if (include_stack_ptr >= MAX_INCLUDE_DEPTH) 561fae548d3Szrj { 562fae548d3Szrj einfo (_("%F: macros nested too deeply\n")); 563fae548d3Szrj } 564fae548d3Szrj file_name_stack[include_stack_ptr] = fake_filename; 565fae548d3Szrj lineno_stack[include_stack_ptr] = lineno; 566fae548d3Szrj include_stack[include_stack_ptr] = YY_CURRENT_BUFFER; 567fae548d3Szrj include_stack_ptr++; 568fae548d3Szrj lineno = count; 569fae548d3Szrj tmp = yy_create_string_buffer (string, strlen (string)); 570fae548d3Szrj yy_switch_to_buffer (tmp); 571fae548d3Szrj } 572fae548d3Szrj 573fae548d3Szrj /* Functions to switch to a different flex start condition, 574fae548d3Szrj saving the current start condition on `state_stack'. */ 575fae548d3Szrj 576fae548d3Szrj static int state_stack[MAX_INCLUDE_DEPTH * 2]; 577fae548d3Szrj static int *state_stack_p = state_stack; 578fae548d3Szrj 579fae548d3Szrj void 580fae548d3Szrj ldlex_script (void) 581fae548d3Szrj { 582fae548d3Szrj *(state_stack_p)++ = yy_start; 583fae548d3Szrj BEGIN (SCRIPT); 584fae548d3Szrj } 585fae548d3Szrj 586fae548d3Szrj void 587fae548d3Szrj ldlex_inputlist (void) 588fae548d3Szrj { 589fae548d3Szrj *(state_stack_p)++ = yy_start; 590fae548d3Szrj BEGIN (INPUTLIST); 591fae548d3Szrj } 592fae548d3Szrj 593fae548d3Szrj void 594fae548d3Szrj ldlex_mri_script (void) 595fae548d3Szrj { 596fae548d3Szrj *(state_stack_p)++ = yy_start; 597fae548d3Szrj BEGIN (MRI); 598fae548d3Szrj } 599fae548d3Szrj 600fae548d3Szrj void 601fae548d3Szrj ldlex_version_script (void) 602fae548d3Szrj { 603fae548d3Szrj *(state_stack_p)++ = yy_start; 604fae548d3Szrj BEGIN (VERS_START); 605fae548d3Szrj } 606fae548d3Szrj 607fae548d3Szrj void 608fae548d3Szrj ldlex_version_file (void) 609fae548d3Szrj { 610fae548d3Szrj *(state_stack_p)++ = yy_start; 611fae548d3Szrj BEGIN (VERS_SCRIPT); 612fae548d3Szrj } 613fae548d3Szrj 614fae548d3Szrj void 615fae548d3Szrj ldlex_defsym (void) 616fae548d3Szrj { 617fae548d3Szrj *(state_stack_p)++ = yy_start; 618fae548d3Szrj BEGIN (DEFSYMEXP); 619fae548d3Szrj } 620fae548d3Szrj 621fae548d3Szrj void 622fae548d3Szrj ldlex_expression (void) 623fae548d3Szrj { 624fae548d3Szrj *(state_stack_p)++ = yy_start; 625fae548d3Szrj BEGIN (EXPRESSION); 626fae548d3Szrj } 627fae548d3Szrj 628fae548d3Szrj void 629fae548d3Szrj ldlex_both (void) 630fae548d3Szrj { 631fae548d3Szrj *(state_stack_p)++ = yy_start; 632fae548d3Szrj BEGIN (BOTH); 633fae548d3Szrj } 634fae548d3Szrj 635fae548d3Szrj void 636fae548d3Szrj ldlex_popstate (void) 637fae548d3Szrj { 638fae548d3Szrj yy_start = *(--state_stack_p); 639fae548d3Szrj } 640fae548d3Szrj 641fae548d3Szrj /* Return the current file name, or the previous file if no file is 642fae548d3Szrj current. */ 643fae548d3Szrj 644fae548d3Szrj const char* 645fae548d3Szrj ldlex_filename (void) 646fae548d3Szrj { 647fae548d3Szrj return file_name_stack[include_stack_ptr - (include_stack_ptr != 0)]; 648fae548d3Szrj } 649fae548d3Szrj 650fae548d3Szrj 651fae548d3Szrj /* Place up to MAX_SIZE characters in BUF and return 652fae548d3Szrj either the number of characters read, or 0 to indicate EOF. */ 653fae548d3Szrj 654fae548d3Szrj static int 655fae548d3Szrj yy_input (char *buf, int max_size) 656fae548d3Szrj { 657fae548d3Szrj int result = 0; 658fae548d3Szrj if (YY_CURRENT_BUFFER->yy_input_file) 659fae548d3Szrj { 660fae548d3Szrj if (yyin) 661fae548d3Szrj { 662fae548d3Szrj result = fread (buf, 1, max_size, yyin); 663fae548d3Szrj if (result < max_size && ferror (yyin)) 664fae548d3Szrj einfo (_("%F%P: read in flex scanner failed\n")); 665fae548d3Szrj } 666fae548d3Szrj } 667fae548d3Szrj return result; 668fae548d3Szrj } 669fae548d3Szrj 670fae548d3Szrj /* Eat the rest of a C-style comment. */ 671fae548d3Szrj 672fae548d3Szrj static void 673fae548d3Szrj comment (void) 674fae548d3Szrj { 675fae548d3Szrj int c; 676fae548d3Szrj 677fae548d3Szrj while (1) 678fae548d3Szrj { 679fae548d3Szrj c = input(); 680fae548d3Szrj while (c != '*' && c != 0) 681fae548d3Szrj { 682fae548d3Szrj if (c == '\n') 683fae548d3Szrj lineno++; 684fae548d3Szrj c = input(); 685fae548d3Szrj } 686fae548d3Szrj 687fae548d3Szrj if (c == '*') 688fae548d3Szrj { 689fae548d3Szrj c = input(); 690fae548d3Szrj while (c == '*') 691fae548d3Szrj c = input(); 692fae548d3Szrj if (c == '/') 693fae548d3Szrj break; /* found the end */ 694fae548d3Szrj } 695fae548d3Szrj 696fae548d3Szrj if (c == '\n') 697fae548d3Szrj lineno++; 698fae548d3Szrj 699fae548d3Szrj if (c == 0) 700fae548d3Szrj { 701fae548d3Szrj einfo (_("%F%P: EOF in comment\n")); 702fae548d3Szrj break; 703fae548d3Szrj } 704fae548d3Szrj } 705fae548d3Szrj } 706fae548d3Szrj 707fae548d3Szrj /* Warn the user about a garbage character WHAT in the input 708fae548d3Szrj in context WHERE. */ 709fae548d3Szrj 710fae548d3Szrj static void 711fae548d3Szrj lex_warn_invalid (char *where, char *what) 712fae548d3Szrj { 713fae548d3Szrj char buf[5]; 714fae548d3Szrj 715fae548d3Szrj /* If we have found an input file whose format we do not recognize, 716fae548d3Szrj and we are therefore treating it as a linker script, and we find 717fae548d3Szrj an invalid character, then most likely this is a real object file 718fae548d3Szrj of some different format. Treat it as such. */ 719fae548d3Szrj if (ldfile_assumed_script) 720fae548d3Szrj { 721fae548d3Szrj bfd_set_error (bfd_error_file_not_recognized); 722fae548d3Szrj einfo (_("%F%s: file not recognized: %E\n"), ldlex_filename ()); 723fae548d3Szrj } 724fae548d3Szrj 725fae548d3Szrj if (! ISPRINT (*what)) 726fae548d3Szrj { 727fae548d3Szrj sprintf (buf, "\\%03o", *(unsigned char *) what); 728fae548d3Szrj what = buf; 729fae548d3Szrj } 730fae548d3Szrj 731fae548d3Szrj einfo (_("%P:%pS: ignoring invalid character `%s'%s\n"), NULL, what, where); 732fae548d3Szrj } 733