From d4e5e3c330d5b2e7b6b972e03b1997a88270f703 Mon Sep 17 00:00:00 2001 From: David MacKenzie Date: Fri, 25 Feb 1994 03:26:25 +0000 Subject: [PATCH] Use getopt instead of lex and yacc to parse the command line. * ld.texinfo (Options): Document changes to option syntax. * Makefile.in: Update dependencies. * ldver.c (help): Tweak dashes in usage message. * ldgram.y (%union): Remove unused members. Remove %tokens for command line options; add ones for input types. (command_line): Rules removed. (file): Instead of command line, recognize an input type indicator, then use the nonterminal for that type. (defsym_expr): New nonterminal from code formerly in command_line. * ldlex.h: Declare parser input type enum and variable. Don't declare parse_line. * ldlex.l: Remove unused variables. Make some used ones static and comment them. (COMMAND): Start state and its rules removed. At start of yylex, return input state token if at start of input. (lex_redirect): Don't need to set yyout. (ldlex_command): Function removed. * ldmain.c (main): Instead of calling parse_line, set up the redirections and call yyparse directly. * ldmisc.c (vfinfo): If there's no input filename, print nothing, not "command line". * lexsup.c: Remove #if 0'd code. (parse_line): Function removed. (parse_args): Rewrite to use getopt_long_only. (set_default_dirlist): New function from code formerly in ldgram.y:command_line. (set_section_start): New function. * emultempl/generic.em, emultempl/gld960.em, emultempl/hppaelf.em, emultempl/lnk960.em, emultempl/m88kbcs.em: Don't enclose compiled-in link scripts in "{" and "}", as the grammar no longer wants them to be. --- ld/ChangeLog | 41 ++++ ld/Makefile.in | 11 +- ld/emultempl/hppaelf.em | 40 ++-- ld/emultempl/m88kbcs.em | 4 +- ld/ld.texinfo | 461 +++++++++++++++++----------------------- ld/ldgram.y | 328 ++-------------------------- ld/ldlex.h | 13 +- ld/ldlex.l | 347 ++++++++++-------------------- ld/ldmain.c | 14 +- ld/lexsup.c | 322 ++++++++++++++++++++++++++++ 10 files changed, 731 insertions(+), 850 deletions(-) create mode 100644 ld/lexsup.c diff --git a/ld/ChangeLog b/ld/ChangeLog index b1cd688541..827c81771d 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,44 @@ +Thu Feb 24 12:27:07 1994 David J. Mackenzie (djm@rtl.cygnus.com) + + Use getopt instead of lex and yacc to parse the command line. + + * ld.texinfo (Options): Document changes to option syntax. + * Makefile.in: Update dependencies. + * ldver.c (help): Tweak dashes in usage message. + * ldgram.y (%union): Remove unused members. + Remove %tokens for command line options; add ones for input types. + (command_line): Rules removed. + (file): Instead of command line, recognize an + input type indicator, then use the nonterminal for that type. + (defsym_expr): New nonterminal from code formerly in command_line. + * ldlex.h: Declare parser input type enum and variable. + Don't declare parse_line. + * ldlex.l: Remove unused variables. Make some used ones static + and comment them. + (COMMAND): Start state and its rules removed. + At start of yylex, return input state token if at start of input. + (lex_redirect): Don't need to set yyout. + (ldlex_command): Function removed. + * ldmain.c (main): Instead of calling parse_line, set up the + redirections and call yyparse directly. + * ldmisc.c (vfinfo): If there's no input filename, print nothing, not + "command line". + * lexsup.c: Remove #if 0'd code. + (parse_line): Function removed. + (parse_args): Rewrite to use getopt_long_only. + (set_default_dirlist): New function from code formerly in + ldgram.y:command_line. + (set_section_start): New function. + * emultempl/generic.em, emultempl/gld960.em, emultempl/hppaelf.em, + emultempl/lnk960.em, emultempl/m88kbcs.em: Don't enclose + compiled-in link scripts in "{" and "}", as the grammar no longer + wants them to be. + +Thu Feb 24 08:43:26 1994 Ken Raeburn (raeburn@rtl.cygnus.com) + + * Makefile.in (ld.dvi): Depend on configdoc.texi, but don't + require that it be in $(srcdir). + Tue Feb 22 09:21:18 1994 Ian Lance Taylor (ian@cygnus.com) * ldlang.c (lang_size_sections): Only align section to alignment diff --git a/ld/Makefile.in b/ld/Makefile.in index 316cc8f8d2..d38fe76097 100644 --- a/ld/Makefile.in +++ b/ld/Makefile.in @@ -1,7 +1,7 @@ # Makefile for the GNU linker ld (version 2) # Copyright (C) 1989, 90, 91, 92, 93, 1994 Free Software Foundation, Inc. -# This file is part of GNU ld.. +# This file is part of GNU ld. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -496,7 +496,7 @@ configdoc.texi: ${DOCVER}-doc.texi # TeX output dvi: ld.dvi -ld.dvi: $(srcdir)/ld.texinfo $(srcdir)/configdoc.texi $(BFDDIR)/doc/bfdsumm.texi +ld.dvi: $(srcdir)/ld.texinfo configdoc.texi $(BFDDIR)/doc/bfdsumm.texi TEXINPUTS=$(BFDDIR)/doc:$$TEXINPUTS $(TEXI2DVI) $(srcdir)/ld.texinfo ldint.dvi: $(srcdir)/ldint.texinfo @@ -735,7 +735,7 @@ ldexp.o : ldexp.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ ldgram.h ldlang.h ldfile.o : ldfile.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ $(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \ - ld.h ldmisc.h ldexp.h ldlang.h ldfile.h ldmain.h ldlex.h + ld.h ldmisc.h ldexp.h ldlang.h ldfile.h ldmain.h ldgram.h ldlex.h ldlang.o : ldlang.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ $(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \ $(INCDIR)/bfdlink.h ld.h ldmain.h ldgram.h ldexp.h \ @@ -747,7 +747,7 @@ ldmain.o : ldmain.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ ldfile.h ldctor.h ldmisc.o : ldmisc.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ $(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \ - ld.h ldmisc.h ldexp.h ldlang.h ldlex.h ldmain.h ldfile.h + ld.h ldmisc.h ldexp.h ldlang.h ldgram.h ldlex.h ldmain.h ldfile.h ldver.o : ldver.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ $(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \ ld.h ldver.h ldemul.h ldmain.h @@ -757,7 +757,8 @@ ldwrite.o : ldwrite.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ ldmisc.h ldgram.h ldmain.h lexsup.o : lexsup.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ $(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \ - ldlex.h ld.h ldexp.h ldgram.h ldmisc.h + $(INCDIR)/getopt.h $(INCDIR)/bfdlink.h config.h \ + ldgram.h ldlex.h ld.h ldexp.h ldgram.h ldmisc.h ldmain.h ldfile.h mri.o : mri.c ../bfd/bfd.h $(INCDIR)/ansidecl.h $(INCDIR)/obstack.h \ ../bfd/sysdep.h $(INCDIR)/fopen-same.h ld.h ldexp.h \ ldlang.h ldmisc.h mri.h ldgram.h diff --git a/ld/emultempl/hppaelf.em b/ld/emultempl/hppaelf.em index cb01a321e4..14a2fe86fb 100644 --- a/ld/emultempl/hppaelf.em +++ b/ld/emultempl/hppaelf.em @@ -1,7 +1,7 @@ # This shell script emits a C file. -*- C -*- # It does some substitutions. cat >em_${EMULATION_NAME}.c <header.type) { case lang_constructors_statement_enum: - hppaosf_search_for_padding_statements (constructor_list.head,&constructor_list.head); + hppaelf_search_for_padding_statements (constructor_list.head,&constructor_list.head); break; case lang_output_section_statement_enum: - hppaosf_search_for_padding_statements + hppaelf_search_for_padding_statements (s->output_section_statement.children.head,&s->output_section_statement.children.head); break; case lang_wild_statement_enum: - hppaosf_search_for_padding_statements + hppaelf_search_for_padding_statements (s->wild_statement.children.head,&s->wild_statement.children.head); break; case lang_data_statement_enum: @@ -96,7 +96,7 @@ hppaosf_search_for_padding_statements(s,prev) } static void -hppaosf_finish() +hppaelf_finish() { extern asymbol *hppa_look_for_stubs_in_section(); @@ -151,12 +151,12 @@ hppaosf_finish() /* If we've added stubs,remove the padding_statements because */ /* they are no longer valid */ - hppaosf_search_for_padding_statements(stat_ptr->head,&(stat_ptr->head)); + hppaelf_search_for_padding_statements(stat_ptr->head,&(stat_ptr->head)); } } static void -hppaosf_create_output_section_statements() +hppaelf_create_output_section_statements() { asection *stub_sec; asection *output_text_sec = bfd_make_section_old_way(output_bfd,".text"); @@ -215,7 +215,7 @@ hppaosf_create_output_section_statements() } static void -hppaosf_set_output_arch() +hppaelf_set_output_arch() { /* Set the output architecture and machine if possible */ unsigned long machine = 0; @@ -223,7 +223,7 @@ hppaosf_set_output_arch() } static char * -hppaosf_get_script(isfile) +hppaelf_get_script(isfile) int *isfile; EOF @@ -234,8 +234,8 @@ then # sed commands to quote an ld script as a C string. sc='s/["\\]/\\&/g s/$/\\n\\/ -1s/^/"{/ -$s/$/n}"/ +1s/^/"/ +$s/$/n"/ ' cat >>em_${EMULATION_NAME}.c <>em_${EMULATION_NAME}.c <>em_${EMULATION_NAME}.c <@var{region} + @{ @var{contents} @} =@var{fill} >@var{region} @dots{} @} @end smallexample @@ -1705,29 +1725,30 @@ Definition}, and @pxref{Section Placement} for details on @code{=@var{fill}}, and @code{>@var{region}}---are all optional. @table @code -@item @var{start} @cindex start address, section @cindex section start @cindex section address +@item @var{start} You can force the output section to be loaded at a specified address by specifying @var{start} immediately following the section name. @var{start} can be represented as any expression. The following example generates section @var{output} at location @code{0x40000000}: + @example SECTIONS @{ - @dots{} - output 0x40000000: @{ - @dots{} - @} - @dots{} + @dots{} + output 0x40000000: @{ + @dots{} + @} + @dots{} @} @end example -@item BLOCK(@var{align}) @kindex BLOCK(@var{align}) @cindex section alignment @cindex aligning sections +@item BLOCK(@var{align}) You can include @code{BLOCK()} specification to advance the location counter @code{.} prior to the beginning of the section, so that the section will begin at the specified alignment. @var{align} is @@ -1744,8 +1765,8 @@ need to be loaded into each object file: @example SECTIONS @{ - ROM 0 (NOLOAD) : @{ @dots{} @} - @dots{} + ROM 0 (NOLOAD) : @{ @dots{} @} + @dots{} @} @end example @@ -1795,24 +1816,22 @@ for (dst = _bstart; dst< _bend; dst++) *dst = 0; @end smallexample -@item =@var{fill} @kindex =@var{fill} @cindex section fill pattern @cindex fill pattern, entire section -Including -@code{=@var{fill}} in a section definition specifies the initial fill -value for that section. -You may use any expression to specify @var{fill}. -Any unallocated holes in the current output -section when written to the output file will be filled with the two -least significant bytes of the value, repeated as necessary. You can -also change the fill value with a @code{FILL} statement in the -@var{contents} of a section definition. +@item =@var{fill} +Including @code{=@var{fill}} in a section definition specifies the +initial fill value for that section. You may use any expression to +specify @var{fill}. Any unallocated holes in the current output section +when written to the output file will be filled with the two least +significant bytes of the value, repeated as necessary. You can also +change the fill value with a @code{FILL} statement in the @var{contents} +of a section definition. -@item >@var{region} @kindex >@var{region} @cindex section, assigning to memory region @cindex memory regions and sections +@item >@var{region} Assign this section to a previously defined region of memory. @xref{MEMORY}. @@ -1858,6 +1877,7 @@ For example, you can use these rules to generate an entry point with an assignment statement: if no symbol @code{start} is defined within your input files, you can simply define it, assigning it an appropriate value--- + @example start = 0x2020; @end example @@ -1867,6 +1887,7 @@ The example shows an absolute address, but you can use any expression. For example, if your input object files use some other symbol-name convention for the entry point, you can just assign the value of whatever symbol contains the start address to @code{start}: + @example start = other_symbol ; @end example @@ -1895,6 +1916,7 @@ must arrange to actually run this code; GNU C++ calls constructors from a subroutine @code{__main}, which it inserts automatically into the startup code for @code{main}, and destructors from @code{_exit}.) +@need 1000 @kindex FLOAT @kindex NOFLOAT @item FLOAT @@ -2110,113 +2132,17 @@ not itself call any subroutines). @cindex back end @cindex object file management +@cindex object formats available +@kindex objdump -i The linker accesses object and archive files using the BFD libraries. These libraries allow the linker to use the same routines to operate on object files whatever the object file format. A different object file format can be supported simply by creating a new BFD back end and adding -it to the library. You can use @code{objdump -i} +it to the library. To conserve runtime memory, however, the linker and +associated tools are usually configured to support only a subset of the +object file formats available. You can use @code{objdump -i} (@pxref{objdump,,objdump,binutils.info,The GNU Binary Utilities}) to -list all the formats available for each architecture under BFD. This -was the list of formats, and of architectures supported for each format, -as of the time this manual was prepared: -@cindex formats available -@cindex architectures available -@example -BFD header file version 0.18 -a.out-i386 - (header big endian, data big endian) - m68k:68020 - a29k - sparc - i386 -a.out-sunos-big - (header big endian, data big endian) - m68k:68020 - a29k - sparc - i386 -b.out.big - (header big endian, data little endian) - i960:core -b.out.little - (header little endian, data little endian) - i960:core -coff-a29k-big - (header big endian, data big endian) - a29k -coff-h8300 - (header big endian, data big endian) - H8/300 -coff-i386 - (header little endian, data little endian) - i386 -coff-Intel-big - (header big endian, data little endian) - i960:core -coff-Intel-little - (header little endian, data little endian) - i960:core -coff-m68k - (header big endian, data big endian) - m68k:68020 -coff-m88kbcs - (header big endian, data big endian) - m88k:88100 -ecoff-bigmips - (header big endian, data big endian) - mips -ecoff-littlemips - (header little endian, data little endian) - mips -elf-big - (header big endian, data big endian) - m68k:68020 - vax - i960:core - a29k - sparc - mips - i386 - m88k:88100 - H8/300 - rs6000:6000 -elf-little - (header little endian, data little endian) - m68k:68020 - vax - i960:core - a29k - sparc - mips - i386 - m88k:88100 - H8/300 - rs6000:6000 -ieee - (header big endian, data big endian) - m68k:68020 - vax - i960:core - a29k - sparc - mips - i386 - m88k:88100 - H8/300 - rs6000:6000 -srec - (header big endian, data big endian) - m68k:68020 - vax - i960:core - a29k - sparc - mips - i386 - m88k:88100 - H8/300 - rs6000:6000 -@end example +list all the formats available for your configuration. @cindex BFD requirements @cindex requirements for BFD @@ -2274,9 +2200,9 @@ lower case; for example, @samp{chip} is the same as @samp{CHIP}. The following list shows only the upper-case form of each command. @table @code +@cindex @code{ABSOLUTE} (MRI) @item ABSOLUTE @var{secname} @item ABSOLUTE @var{secname}, @var{secname}, @dots{} @var{secname} -@cindex @code{ABSOLUTE} (MRI) Normally, @code{ld} includes in the output file all sections from all the input files. However, in an MRI-compatible script, you can use the @code{ABSOLUTE} command to restrict the sections that will be present in @@ -2286,31 +2212,32 @@ commands will appear in the linker output. You can still use other input sections (whatever you select on the command line, or using @code{LOAD}) to resolve addresses in the output file. -@item ALIAS @var{out-secname}, @var{in-secname} @cindex @code{ALIAS} (MRI) +@item ALIAS @var{out-secname}, @var{in-secname} Use this command to place the data from input section @var{in-secname} in a section called @var{out-secname} in the linker output file. @var{in-secname} may be an integer. -@item BASE @var{expression} @cindex @code{BASE} (MRI) +@item BASE @var{expression} Use the value of @var{expression} as the lowest address (other than absolute addresses) in the output file. +@cindex @code{CHIP} (MRI) @item CHIP @var{expression} @itemx CHIP @var{expression}, @var{expression} -@cindex @code{CHIP} (MRI) This command does nothing; it is accepted only for compatibility. -@item END @cindex @code{END} (MRI) +@item END This command does nothing whatever; it's only accepted for compatibility. -@item FORMAT @var{output-format} @cindex @code{FORMAT} (MRI) +@item FORMAT @var{output-format} Similar to the @code{OUTPUT_FORMAT} command in the more general linker language, but restricted to one of these output formats: + @enumerate @item S-records, if @var{output-format} is @samp{S} @@ -2323,47 +2250,47 @@ COFF (the @samp{coff-m68k} variant in BFD), if @var{output-format} is @samp{COFF} @end enumerate -@item LIST @var{anything}@dots{} @cindex @code{LIST} (MRI) +@item LIST @var{anything}@dots{} Print (to the standard output file) a link map, as produced by the @code{ld} command-line option @samp{-M}. The keyword @code{LIST} may be followed by anything on the same line, with no change in its effect. +@cindex @code{LOAD} (MRI) @item LOAD @var{filename} @item LOAD @var{filename}, @var{filename}, @dots{} @var{filename} -@cindex @code{LOAD} (MRI) Include one or more object file @var{filename} in the link; this has the same effect as specifying @var{filename} directly on the @code{ld} command line. -@item NAME @var{output-name} @cindex @code{NAME} (MRI) +@item NAME @var{output-name} @var{output-name} is the name for the program produced by @code{ld}; the MRI-compatible command @code{NAME} is equivalent to the command-line option @samp{-o} or the general script language command @code{OUTPUT}. +@cindex @code{ORDER} (MRI) @item ORDER @var{secname}, @var{secname}, @dots{} @var{secname} @itemx ORDER @var{secname} @var{secname} @var{secname} -@cindex @code{ORDER} (MRI) Normally, @code{ld} orders the sections in its output file in the order in which they first appear in the input files. In an MRI-compatible script, you can override this ordering with the @code{ORDER} command. The sections you list with @code{ORDER} will appear first in your output file, in the order specified. +@cindex @code{PUBLIC} (MRI) @item PUBLIC @var{name}=@var{expression} @itemx PUBLIC @var{name},@var{expression} @itemx PUBLIC @var{name} @var{expression} -@cindex @code{PUBLIC} (MRI) Supply a value (@var{expression}) for external symbol @var{name} used in the linker input files. +@cindex @code{SECT} (MRI) @item SECT @var{secname}, @var{expression} @itemx SECT @var{secname}=@var{expression} @itemx SECT @var{secname} @var{expression} -@cindex @code{SECT} (MRI) You can use any of these three forms of the @code{SECT} command to specify the start address (@var{expression}) for section @var{secname}. If you have more than one @code{SECT} statement for the same diff --git a/ld/ldgram.y b/ld/ldgram.y index dc196aec37..e3504f1ac5 100644 --- a/ld/ldgram.y +++ b/ld/ldgram.y @@ -65,21 +65,9 @@ static int error_index; %} %union { bfd_vma integer; - int voidval; char *name; int token; union etree_union *etree; - struct sec *section; - struct lang_output_section_statement_struct *output_section_statement; - union lang_statement_union **statement_ptr; - int lineno; - struct { - FILE *file; - char *name; - unsigned int lineno; - } state; - - } %type exp opt_exp_with_type mustbe_exp opt_at @@ -103,326 +91,48 @@ static int error_index; %left '+' '-' %left '*' '/' '%' -/*%token '+' '-' '*' '/' '%'*/ %right UNARY %token END %left '(' %token ALIGN_K BLOCK QUAD LONG SHORT BYTE -%token SECTIONS +%token SECTIONS %token '{' '}' %token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH %token SIZEOF_HEADERS %token INCLUDE -%token MEMORY DEFSYMEND +%token MEMORY DEFSYMEND %token NOLOAD DSECT COPY INFO OVERLAY -%token NAME DEFINED TARGET_K SEARCH_DIR MAP ENTRY -%token OPTION_e OPTION_c OPTION_noinhibit_exec OPTION_s OPTION_S OPTION_sort_common OPTION_warn_common -%token OPTION_EB OPTION_EL OPTION_G OPTION_Gval OPTION_help -%token OPTION_format OPTION_oformat OPTION_F OPTION_u OPTION_y OPTION_Bstatic OPTION_N -%token SIZEOF NEXT ADDR -%token OPTION_d OPTION_dc OPTION_dp OPTION_x OPTION_X OPTION_defsym -%token OPTION_v OPTION_V OPTION_m OPTION_memul OPTION_M OPTION_t STARTUP HLL SYSLIB FLOAT NOFLOAT -%token OPTION_L OPTION_Map -%token OPTION_n OPTION_r OPTION_o OPTION_b OPTION_R OPTION_relax OPTION_version -%token OPTION_l OPTION_Lfile OPTION_T OPTION_Aarch OPTION_Tfile -%token OPTION_Texp OPTION_esymbol OPTION_usymbol OPTION_ysymbol -%token OPTION_Ur -%token ORIGIN FILL OPTION_g -%token LENGTH CREATE_OBJECT_SYMBOLS INPUT OUTPUT CONSTRUCTORS -%token OPTION_RETAIN_SYMBOLS_FILE ALIGNMOD AT -%token OPTION_Qy OPTION_Y OPTION_dn OPTION_call_shared OPTION_non_shared -%token OPTION_Oval OPTION_stats OPTION_no_keep_memory -%token OPTION_YP - +%token NAME DEFINED TARGET_K SEARCH_DIR MAP ENTRY +%token SIZEOF NEXT ADDR +%token STARTUP HLL SYSLIB FLOAT NOFLOAT +%token ORIGIN FILL +%token LENGTH CREATE_OBJECT_SYMBOLS INPUT OUTPUT CONSTRUCTORS +%token ALIGNMOD AT %type assign_op - %type filename - - %token CHIP LIST SECT ABSOLUTE LOAD NEWLINE ENDWORD ORDER NAMEWORD %token FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE REL +%token INPUT_SCRIPT INPUT_MRI_SCRIPT INPUT_DEFSYM %% -file: command_line - - -filename: NAME; - - -command_line: - command_line command_line_option - | +file: + INPUT_SCRIPT script_file + | INPUT_MRI_SCRIPT mri_script_file + | INPUT_DEFSYM defsym_expr ; -command_line_option: - OPTION_Bstatic { } - | OPTION_help - { - help (); - exit (0); - } - | OPTION_v - { - ldversion(0); - version_printed = true; - } - | OPTION_V - { - ldversion(1); - version_printed = true; - trace_file_tries = true; - } - | OPTION_version - { - ldversion(0); - version_printed = true; - } - | OPTION_t { - trace_files = true; - } - | OPTION_Map NAME - { - write_map = true; - config.map_filename = $2; - } - | OPTION_m NAME - { - /* Ignore. */ - } - | OPTION_memul - { - /* Ignore. */ - } - | OPTION_M - { - config.map_filename = "-"; - } - | OPTION_n { - config.magic_demand_paged = false; - } - | OPTION_N { - config.text_read_only = false; - config.magic_demand_paged = false; - } - | OPTION_s { - link_info.strip = strip_all; - } - | OPTION_S { - link_info.strip = strip_debugger; - } - | OPTION_stats { - config.stats = true; - } - | OPTION_no_keep_memory { - link_info.keep_memory = false; - } - | OPTION_u NAME { - ldlang_add_undef($2); - } - | OPTION_usymbol { - ldlang_add_undef($1); - } - | OPTION_r { - link_info.relocateable = true; - config.build_constructors = false; - config.magic_demand_paged = false; - config.text_read_only = false; - } - | OPTION_Ur { - link_info.relocateable = true; - config.build_constructors = true; - config.magic_demand_paged = false; - config.text_read_only = false; - } - | OPTION_o filename - { - lang_add_output($2, 0); - } - | OPTION_e NAME - { lang_add_entry($2); - } - | OPTION_esymbol - { lang_add_entry($1); - } - | OPTION_X { - link_info.discard = discard_l; - } - | OPTION_x { - link_info.discard = discard_all; - } - - | OPTION_noinhibit_exec - { - force_make_executable = true; - } - | OPTION_sort_common - { - config.sort_common = true; - } - | OPTION_warn_common - { - config.warn_common = true; - } - | OPTION_d { - command_line.force_common_definition = true; - } - - | OPTION_relax { - command_line.relax = true; - } - | OPTION_dc - { - command_line.force_common_definition = true; - } - | OPTION_g - { - /* Ignored */ - } - | OPTION_dp - { - command_line.force_common_definition = true; - } - | OPTION_format NAME - { - lang_add_target($2); - } - | OPTION_oformat NAME - { - lang_add_output_format($2, 0); - } - | OPTION_Texp - { ldlex_expression(); - hex_mode = 16; - } - INT - { ldlex_popstate(); - lang_section_start($1,exp_intop($3)); - hex_mode = 0; - } - | OPTION_y NAME - { - add_ysym($2); - } - | OPTION_ysymbol - { - add_ysym($1); - } - | OPTION_Aarch - { - ldfile_add_arch($1); - } - | OPTION_b NAME - { - lang_add_target($2); - } - | OPTION_L NAME - { - ldfile_add_library_path($2); - } - | OPTION_Lfile - { - ldfile_add_library_path($1); - } - | OPTION_F - { - /* Ignore */ - } - | OPTION_c filename - {ldfile_open_command_file($2); } - mri_script_file END { ldlex_command();} - | OPTION_Tfile - { ldfile_open_command_file($1); } script_file - END { ldlex_command();} +filename: NAME; - | OPTION_T filename - { ldfile_open_command_file($2); } script_file - END { ldlex_command();} - | OPTION_l - { - lang_add_input_file($1, - lang_input_file_is_l_enum, - (char *)NULL); - } - | OPTION_R filename - { - lang_add_input_file($2, - lang_input_file_is_symbols_only_enum, - (char *)NULL); - } - - | OPTION_defsym { ldlex_defsym(); } - NAME '=' exp DEFSYMEND { ldlex_popstate(); - lang_add_assignment(exp_assop($4,$3,$5)); - } - | OPTION_RETAIN_SYMBOLS_FILE filename - { add_keepsyms_file ($2); } - | OPTION_EB - { - /* FIXME: This is currently ignored. It means - ``produce a big-endian object file''. It could - be used to select an output format. */ - } - | OPTION_EL - { - /* FIXME: This is currently ignored. It means - ``produce a little-endian object file''. It could - be used to select an output format. */ - } - | OPTION_G NAME - { - g_switch_value = atoi ($2); - } - | OPTION_Gval +defsym_expr: + { ldlex_defsym(); } + NAME '=' exp { - g_switch_value = yylval.integer; - } - | OPTION_Qy - | OPTION_dn - | OPTION_non_shared - | OPTION_call_shared - | OPTION_Oval - | OPTION_YP - { - dirlist_ptr = $1; - goto set_default_dirlist; - } - | OPTION_Y NAME - { - if (strncmp ($2, "P,", 2)) - einfo ("%P%F: unknown -Y option -- %s\n", $2); - else - { - char *p; - dirlist_ptr = $2; - set_default_dirlist: - while (1) - { - p = strchr (dirlist_ptr, ':'); - if (p != NULL) - *p = 0; - if (*dirlist_ptr) - ldfile_add_library_path (dirlist_ptr); - if (p == NULL) - break; - *p = ':'; - dirlist_ptr = p + 1; - } - } - } - | '{' script_file '}' { /* This parses compiled-in scripts. */ } - | NAME - { - if (*$1 == '-') - einfo("%P%F: illegal option -- %s\n", $1); - else - lang_add_input_file($1,lang_input_file_is_file_enum, - (char *)NULL); + ldlex_popstate(); + lang_add_assignment(exp_assop($3,$2,$4)); } - ; - /* SYNTAX WITHIN AN MRI SCRIPT FILE */ mri_script_file: diff --git a/ld/ldlex.h b/ld/ldlex.h index ed79934f8e..34ab4a1cb8 100644 --- a/ld/ldlex.h +++ b/ld/ldlex.h @@ -22,6 +22,16 @@ #include +/* The initial parser states. */ +typedef enum input_enum { + input_selected, /* We've set the initial state. */ + input_script = INPUT_SCRIPT, + input_mri_script = INPUT_MRI_SCRIPT, + input_defsym = INPUT_DEFSYM +} input_type; + +extern input_type parser_input; + extern int hex_mode; extern unsigned int lineno; @@ -40,8 +50,9 @@ extern void ldlex_popstate PARAMS ((void)); /* In lexsup.c. */ extern int lex_input PARAMS ((void)); extern void lex_unput PARAMS ((int)); +#ifndef yywrap extern int yywrap PARAMS ((void)); +#endif extern void parse_args PARAMS ((int, char **)); -extern void parse_line PARAMS ((char*, int)); #endif diff --git a/ld/ldlex.l b/ld/ldlex.l index ddc4d5e687..dd15fbfa0a 100644 --- a/ld/ldlex.l +++ b/ld/ldlex.l @@ -43,30 +43,40 @@ This was written by steve chamberlain #include "ldlex.h" #include "ldmain.h" -int ldgram_in_defsym; +/* The type of top-level parser input. + yylex and yyparse (indirectly) both check this. */ +input_type parser_input; +/* Radix to use for bfd_scan_vma -- 0 (default to base 10) or 16. */ int hex_mode; +/* Line number in the current input file. + (FIXME Actually, it doesn't appear to get reset for each file?) */ unsigned int lineno = 1; -int old; + +/* 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. + + 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) -#undef YY_FATAL_ERROR -#define YY_FATAL_ERROR(s) + #define MAX_INCLUDE_DEPTH 10 -YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; -char *file_name_stack[MAX_INCLUDE_DEPTH]; -unsigned int include_stack_ptr = 0; +static YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; +static char *file_name_stack[MAX_INCLUDE_DEPTH]; +static unsigned int include_stack_ptr = 0; static YY_BUFFER_STATE yy_create_string_buffer PARAMS ((const char *string, - int size)); + 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 - COMMAND on command line EXPRESSION definitely in an expression SCRIPT definitely in a script BOTH either EXPRESSION or SCRIPT @@ -74,6 +84,11 @@ static void lex_warn_invalid PARAMS ((char *where, char *what)); MRI in an MRI script */ #define RTOKEN(x) { yylval.token = x; return x; } + +/* Some versions of flex want this. */ +#ifndef yywrap +int yywrap () { return 1; } +#endif %} %a 4000 @@ -90,7 +105,6 @@ WHITE [ \t\n]+ NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~] -%s COMMAND %s SCRIPT %s EXPRESSION %s BOTH @@ -98,149 +112,21 @@ NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~] %s MRI %% + 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; + return t; + } -"/*" { comment(); } +"/*" { comment(); } "-" { RTOKEN('-');} "+" { RTOKEN('+');} {FILENAMECHAR1}{SYMBOLCHARN}* { yylval.name = buystring(yytext); return NAME; } -[ \t] { RTOKEN(DEFSYMEND); } "=" { RTOKEN('='); } -"--help" { return OPTION_help; } -"--version" { return OPTION_version; } -"-defsym"{WHITE}* { return OPTION_defsym; } -"-format" { return OPTION_format; } -"-noinhibit-exec" { return OPTION_noinhibit_exec; } -"-noinhibit_exec" { return OPTION_noinhibit_exec; } -"-oformat" { return OPTION_oformat; } -"-sort-common" { return OPTION_sort_common;} -"-sort_common" { return OPTION_sort_common;} -"-warn-common" { return OPTION_warn_common;} -"-n" { return OPTION_n; } -"-N" { return OPTION_N; } -"-r" { return OPTION_r; } -"-stats" { return OPTION_stats; } -"-no-keep-memory" { return OPTION_no_keep_memory; } -"-relax" { return OPTION_relax; } -"-i" { return OPTION_r; } -"-Ur" { return OPTION_Ur; } -"-o" { return OPTION_o; } -"-g" { return OPTION_g; } -"-e" { return OPTION_e; } -"-e"{FILENAME} { - yylval.name = buystring(yytext+2); - return OPTION_esymbol; - } -"-b" { return OPTION_b; } -"-dc" { return OPTION_dc; } -"-dp" { return OPTION_dp; } -"-d" { return OPTION_d; } -"-v" { return OPTION_v; } -"-V" { return OPTION_V; } -"-m" { return OPTION_m; } -"-m"{FILENAME} { return OPTION_memul; } -"-M" { return OPTION_M; } -"-Map" { return OPTION_Map;} -"-t" { return OPTION_t; } -"-X" { return OPTION_X; } -"-x" { return OPTION_x; } -"-c" { return OPTION_c; } -"-R" { return OPTION_R; } -"-u" { return OPTION_u; } -"-u"{FILENAME} { - yylval.name = buystring(yytext+2); - return OPTION_usymbol; - } -"-s" { return OPTION_s; } -"-S" { return OPTION_S; } -"-Bstat" { return OPTION_Bstatic; } -"-B"{FILENAME} { /* Ignored */ } -"-l"{FILENAME} { - yylval.name = buystring(yytext+2); - return OPTION_l; - } - -"-L"{FILENAME} { - yylval.name = buystring(yytext+2); - return OPTION_Lfile; - } -"-L" { return OPTION_L; } -"-Ttext" { - yylval.name = ".text"; - return OPTION_Texp; - } -"-Tdata" { - yylval.name = ".data"; - return OPTION_Texp; - } -"-Tbss" { - yylval.name = ".bss"; - return OPTION_Texp; - } -"-O"([0-9])+ { - yylval.integer = atoi (yytext + 2); - return OPTION_Oval; - } -"-O"{FILENAME} { - yylval.name = buystring(yytext+2); - return OPTION_Texp; - } - -"-T"{FILENAME} { - yylval.name = buystring(yytext+2); - return OPTION_Tfile; - } -"-T" { - return OPTION_T; - } - -"-F"{FILENAME} { - return OPTION_F; - } -"-F" { - return OPTION_F; - } - -"-y" { - return OPTION_y; - } - -"-y"{FILENAME} { - yylval.name = buystring(yytext+2); - return OPTION_ysymbol; - } - -"-A"{FILENAME} { - yylval.name = buystring(yytext+2); - return OPTION_Aarch; - } - -"-retain-symbols-file" { return OPTION_RETAIN_SYMBOLS_FILE; } - -"-EB" { - return OPTION_EB; - } -"-EL" { - return OPTION_EL; - } -"-G" { - return OPTION_G; - } -"-G"([0-9])+ { - yylval.integer = atoi (yytext + 2); - return OPTION_Gval; - } - -"-Qy" { return OPTION_Qy; } -"-dn" { return OPTION_dn; } -"-Y" { return OPTION_Y; } -"-YP,"{FILENAME} { - yylval.name = buystring (yytext+4); - return OPTION_YP; - } -"-non_shared" { return OPTION_non_shared; } -"-call_shared" { return OPTION_call_shared; } "$"([0-9A-Fa-f])+ { yylval.integer = bfd_scan_vma (yytext+1, 0,16); @@ -311,18 +197,13 @@ NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~] "/" { RTOKEN('/');} "%" { RTOKEN('%');} "<" { RTOKEN('<');} -">" { RTOKEN('>');} "=" { RTOKEN('=');} "}" { RTOKEN('}') ; } "{" { RTOKEN('{'); } ")" { RTOKEN(')');} "(" { RTOKEN('(');} -"]" { RTOKEN(']');} -"[" { RTOKEN('[');} ":" { RTOKEN(':'); } ";" { RTOKEN(';');} -"-" { RTOKEN('-');} -"/" { RTOKEN('/');} "MEMORY" { RTOKEN(MEMORY);} "ORIGIN" { RTOKEN(ORIGIN);} "BLOCK" { RTOKEN(BLOCK);} @@ -395,12 +276,6 @@ NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~] "sect" { RTOKEN(SECT); } "absolute" { RTOKEN(ABSOLUTE); } -{CMDFILENAMECHAR1}{CMDFILENAMECHAR}* { - yylval.name = buystring(yytext); - return NAME; - } - - {FILENAMECHAR1}{NOCFILENAMECHAR}* { /* Filename without commas, needed to parse mri stuff */ yylval.name = buystring(yytext); @@ -412,11 +287,11 @@ NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~] yylval.name = buystring(yytext); return NAME; } -{FILENAMECHAR}* { yylval.name = buystring(yytext); +