From: Ian Lance Taylor Date: Thu, 6 Jul 1995 20:39:31 +0000 (+0000) Subject: Patches from Jerry Blakely : X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=85a961c6a12151673dd31463b66ab32f742242e9;p=binutils-gdb.git Patches from Jerry Blakely : * as.c (listing_filename): New static variable. (show_usage): Mention -a=file. (parse_args): Support = option of -a to set name of listing file. (main): Pass listing_filename to listing_print. * listing.c (list_file): New static variable. (various): Replace printf with fprintf to list_file. (listing_print): If name argument is not NULL, open it as list_file. * doc/as.texinfo, doc/as.1: Document -a=file. PR 6354. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index a59501d63d7..d7387cc4f63 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,16 @@ Thu Jul 6 12:54:27 1995 Ian Lance Taylor + Patches from Jerry Blakely : + * as.c (listing_filename): New static variable. + (show_usage): Mention -a=file. + (parse_args): Support = option of -a to set name of listing file. + (main): Pass listing_filename to listing_print. + * listing.c (list_file): New static variable. + (various): Replace printf with fprintf to list_file. + (listing_print): If name argument is not NULL, open it as + list_file. + * doc/as.texinfo, doc/as.1: Document -a=file. + * config/tc-sparc.c (s_reserve): Don't permit redefinition, even if the symbol was already in bss_section. Fix warning message. diff --git a/gas/as.c b/gas/as.c index d439a95bb50..e2da5cb963a 100644 --- a/gas/as.c +++ b/gas/as.c @@ -45,6 +45,8 @@ static void perform_an_assembly_pass PARAMS ((int argc, char **argv)); int listing; /* true if a listing is wanted */ +static char *listing_filename = NULL; /* Name of listing file. */ + char *myname; /* argv[0] */ #ifdef BFD_ASSEMBLER segT reg_section, expr_section; @@ -81,7 +83,8 @@ Options:\n\ h include high-level source\n\ l include assembly\n\ n omit forms processing\n\ - s include symbols\n"); + s include symbols\n\ + =file set listing file name (must be last sub-option)\n"); fprintf (stream, "\ -D produce assembler debugging messages\n\ -f skip whitespace and comment preprocessing\n\ @@ -401,6 +404,12 @@ parse_args (pargc, pargv) case 's': listing |= LISTING_SYMBOLS; break; + case '=': + listing_filename = strdup (optarg + 1); + if (listing_filename == NULL) + as_fatal ("virtual memory exhausted"); + optarg += strlen (listing_filename); + break; default: as_fatal ("invalid listing option `%c'", *optarg); break; @@ -528,7 +537,7 @@ main (argc, argv) write_object_file (); #ifndef NO_LISTING - listing_print (""); + listing_print (listing_filename); #endif #ifndef OBJ_VMS /* does its own file handling */ diff --git a/gas/doc/as.1 b/gas/doc/as.1 index 8a9efe1d62d..09e4c5dd6f0 100644 --- a/gas/doc/as.1 +++ b/gas/doc/as.1 @@ -8,8 +8,10 @@ GNU as\-\-the portable GNU assembler. .SH SYNOPSIS .na .B as -.RB "[\|" \-a "\||\|" \-al "\||\|" -as\c -\&\|] +.RB "[\|" \-a "[\|" dhlns "\|]" \c +\&\[\|\=\c +.I file\c +\&\|]\|] .RB "[\|" \-D "\|]" .RB "[\|" \-f "\|]" .RB "[\|" \-I @@ -118,15 +120,25 @@ grave problem that stops the assembly. .SH OPTIONS .TP -.BR \-a \||\| \-al \||\| \-as -Turn on assembly listings; `\|\c -.B \-al\c -\&\|', listing only, `\|\c -.B \-as\c -\&\|', symbols -only, `\|\c -.B \-a\c -\&\|', everything. +.BR \-a +Turn on assembly listings. There are various suboptions. +.B d +omits debugging directives. +.B h +includes the high level source code; this is only available if the +source file can be found, and the code was compiled with +.B \-g. +.B l +includes an assembly listing. +.B n +omits forms processing. +.B s +includes a symbol listing. +.B = +.I file +sets the listing file name; this must be the last suboption. +The default suboptions are +.B hls. .TP .B \-D This option is accepted only for script compatibility with calls to diff --git a/gas/doc/as.texinfo b/gas/doc/as.texinfo index b33f38b6f75..91eda83c8b7 100644 --- a/gas/doc/as.texinfo +++ b/gas/doc/as.texinfo @@ -194,7 +194,7 @@ Here is a brief summary of how to invoke @code{@value{AS}}. For details, @c We don't use deffn and friends for the following because they seem @c to be limited to one line for the header. @smallexample -@value{AS} [ -a[dhlns] ] [ -D ] [ -f ] [ --help ] +@value{AS} [ -a[dhlns][=file] ] [ -D ] [ -f ] [ --help ] [ -I @var{dir} ] [ -J ] [ -K ] [ -L ] [ -o @var{objfile} ] [ -R ] [ --statistics ] [ -v ] [ -version ] [ --version ] [ -W ] [ -w ] [ -x ] [ -Z ] @@ -254,11 +254,15 @@ omit forms processing @item -as include symbols + +@item =file +set the name of the listing file @end table You may combine these options; for example, use @samp{-aln} for assembly -listing without forms processing. By itself, @samp{-a} defaults to -@samp{-ahls}---that is, all listings turned on. +listing without forms processing. The @samp{=file} option, if used, must be +the last one. By itself, @samp{-a} defaults to @samp{-ahls}---that is, all +listings turned on. @item -D Ignored. This option is accepted for script compatibility with calls to diff --git a/gas/listing.c b/gas/listing.c index 799223a732c..ba0e5fdcaf5 100644 --- a/gas/listing.c +++ b/gas/listing.c @@ -186,6 +186,8 @@ extern fragS *frag_now; static int paper_width = 200; static int paper_height = 60; +/* File to output listings to. */ +static FILE *list_file; /* this static array is used to keep the text of data to be printed before the start of the line. @@ -455,12 +457,12 @@ listing_page (list) if (page > 1) { - printf ("\f"); + fprintf (list_file, "\f"); } - printf ("%s %s \t\t\tpage %d\n", LISTING_HEADER, fn, page); - printf ("%s\n", title); - printf ("%s\n", subtitle); + fprintf (list_file, "%s %s \t\t\tpage %d\n", LISTING_HEADER, fn, page); + fprintf (list_file, "%s\n", title); + fprintf (list_file, "%s\n", subtitle); on_page = 3; eject = 0; } @@ -565,11 +567,11 @@ print_lines (list, string, address) /* Print the hex for the first line */ if (address == ~0) { - printf ("% 4d ", list->line); + fprintf (list_file, "% 4d ", list->line); for (idx = 0; idx < nchars; idx++) - printf (" "); + fprintf (list_file, " "); - printf ("\t%s\n", string ? string : ""); + fprintf (list_file, "\t%s\n", string ? string : ""); on_page++; listing_page (0); @@ -578,11 +580,11 @@ print_lines (list, string, address) { if (had_errors ()) { - printf ("% 4d ???? ", list->line); + fprintf (list_file, "% 4d ???? ", list->line); } else { - printf ("% 4d %04x ", list->line, address); + fprintf (list_file, "% 4d %04x ", list->line, address); } /* And the data to go along with it */ @@ -590,12 +592,12 @@ print_lines (list, string, address) while (*src && idx < nchars) { - printf ("%c%c", src[0], src[1]); + fprintf (list_file, "%c%c", src[0], src[1]); src += 2; byte_in_word++; if (byte_in_word == LISTING_WORD_SIZE) { - printf (" "); + fprintf (list_file, " "); idx++; byte_in_word = 0; } @@ -603,14 +605,14 @@ print_lines (list, string, address) } for (; idx < nchars; idx++) - printf (" "); + fprintf (list_file, " "); - printf ("\t%s\n", string ? string : ""); + fprintf (list_file, "\t%s\n", string ? string : ""); on_page++; listing_page (list); if (list->message) { - printf ("**** %s\n", list->message); + fprintf (list_file, "**** %s\n", list->message); listing_page (list); on_page++; } @@ -623,23 +625,23 @@ print_lines (list, string, address) nchars = ((LISTING_WORD_SIZE * 2) + 1) * LISTING_LHS_WIDTH_SECOND - 1; idx = 0; /* Print any more lines of data, but more compactly */ - printf ("% 4d ", list->line); + fprintf (list_file, "% 4d ", list->line); while (*src && idx < nchars) { - printf ("%c%c", src[0], src[1]); + fprintf (list_file, "%c%c", src[0], src[1]); src += 2; idx += 2; byte_in_word++; if (byte_in_word == LISTING_WORD_SIZE) { - printf (" "); + fprintf (list_file, " "); idx++; byte_in_word = 0; } } - printf ("\n"); + fprintf (list_file, "\n"); on_page++; listing_page (list); @@ -693,16 +695,16 @@ list_symbol_table () if (!got_some) { - printf ("DEFINED SYMBOLS\n"); + fprintf (list_file, "DEFINED SYMBOLS\n"); on_page++; got_some = 1; } - printf ("%20s:%-5d %s:%s %s\n", - ptr->sy_frag->line->file->filename, - ptr->sy_frag->line->line, - segment_name (S_GET_SEGMENT (ptr)), - buf, S_GET_NAME (ptr)); + fprintf (list_file, "%20s:%-5d %s:%s %s\n", + ptr->sy_frag->line->file->filename, + ptr->sy_frag->line->line, + segment_name (S_GET_SEGMENT (ptr)), + buf, S_GET_NAME (ptr)); on_page++; listing_page (0); @@ -712,10 +714,10 @@ list_symbol_table () } if (!got_some) { - printf ("NO DEFINED SYMBOLS\n"); + fprintf (list_file, "NO DEFINED SYMBOLS\n"); on_page++; } - printf ("\n"); + fprintf (list_file, "\n"); on_page++; listing_page (0); @@ -734,11 +736,11 @@ list_symbol_table () if (!got_some) { got_some = 1; - printf ("UNDEFINED SYMBOLS\n"); + fprintf (list_file, "UNDEFINED SYMBOLS\n"); on_page++; listing_page (0); } - printf ("%s\n", S_GET_NAME (ptr)); + fprintf (list_file, "%s\n", S_GET_NAME (ptr)); on_page++; listing_page (0); } @@ -746,7 +748,7 @@ list_symbol_table () } if (!got_some) { - printf ("NO UNDEFINED SYMBOLS\n"); + fprintf (list_file, "NO UNDEFINED SYMBOLS\n"); on_page++; listing_page (0); } @@ -765,7 +767,8 @@ print_source (current_file, list, buffer, width) && !current_file->at_end) { char *p = buffer_line (current_file, buffer, width); - printf ("%4d:%-13s **** %s\n", current_file->linenum, current_file->filename, p); + fprintf (list_file, "%4d:%-13s **** %s\n", current_file->linenum, + current_file->filename, p); on_page++; listing_page (list); } @@ -924,6 +927,18 @@ listing_print (name) title = ""; subtitle = ""; + if (name == NULL) + list_file = stdout; + else + { + list_file = fopen (name, "w"); + if (list_file == NULL) + { + as_perror ("can't open list file: %s", name); + list_file = stdout; + } + } + if (listing & LISTING_NOFORM) { paper_height = 0;