From c7a89bde9b712899795468ba575bd374f7a28c04 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 22 Mar 1996 16:44:21 +0000 Subject: [PATCH] * as.h (strdup): Don't declare. * stabs.c: Include libiberty.h (get_stab_string_offset): Use xstrdup rather than strdup. (s_stab_generic): Likewise. * as.c (parse_args): Likewise. * read.c (s_mri_sect): Likewise. --- gas/ChangeLog | 7 +++ gas/as.c | 142 +++++++++++++++++++++++++++++++++++++++++----------------- gas/read.c | 24 +++++----- gas/stabs.c | 60 ++++++++++++++++++------- 4 files changed, 163 insertions(+), 70 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index cbd3547..07c7239 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,12 @@ Fri Mar 22 11:13:00 1996 Ian Lance Taylor + * as.h (strdup): Don't declare. + * stabs.c: Include libiberty.h + (get_stab_string_offset): Use xstrdup rather than strdup. + (s_stab_generic): Likewise. + * as.c (parse_args): Likewise. + * read.c (s_mri_sect): Likewise. + * gasp.c (change_base): Recognize \(...) construct documented to pass through enclosed characters literally through to the output. (process_assigns): Likewise. Also, be more careful to avoid diff --git a/gas/as.c b/gas/as.c index 4850e86..2c56241 100644 --- a/gas/as.c +++ b/gas/as.c @@ -1,5 +1,6 @@ /* as.c - GAS main program. - Copyright (C) 1987, 1990, 1991, 1992, 1994 Free Software Foundation, Inc. + Copyright (C) 1987, 90, 91, 92, 93, 94, 95, 1996 + Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -60,6 +61,12 @@ segT reg_section, expr_section; segT text_section, data_section, bss_section; #endif +int chunksize = 5000; + +/* To monitor memory allocation more effectively, make this non-zero. + Then the chunk sizes for gas and bfd will be reduced. */ +int debug_memory = 0; + void print_version_id () @@ -94,6 +101,7 @@ Options:\n\ =file set listing file name (must be last sub-option)\n"); fprintf (stream, "\ -D produce assembler debugging messages\n\ +--defsym SYM=VAL define symbol SYM to given value\n\ -f skip whitespace and comment preprocessing\n\ --help show this message and exit\n\ -I DIR add DIR to search list for .include directives\n\ @@ -105,7 +113,7 @@ Options:\n\ -nocpp ignored\n\ -o OBJFILE name the object-file output OBJFILE (default a.out)\n\ -R fold data section into text section\n\ ---statistics print maximum bytes and total seconds used\n\ +--statistics print various measured statistics from execution\n\ --version print assembler version number and exit\n\ -W suppress warnings\n\ -w ignored\n\ @@ -260,6 +268,8 @@ parse_args (pargc, pargv) {"verbose", no_argument, NULL, OPTION_VERBOSE}, #define OPTION_EMULATION (OPTION_STD_BASE + 6) {"emulation", required_argument, NULL, OPTION_EMULATION}, +#define OPTION_DEFSYM (OPTION_STD_BASE + 7) + {"defsym", required_argument, NULL, OPTION_DEFSYM} }; /* Construct the option lists from the standard list and the @@ -365,6 +375,24 @@ parse_args (pargc, pargv) #endif exit (EXIT_SUCCESS); + case OPTION_DEFSYM: + { + char *s; + long i; + symbolS *sym; + + for (s = optarg; *s != '\0' && *s != '='; s++) + ; + if (*s == '\0') + as_fatal ("bad defsym; format is --defsym name=value"); + *s++ = '\0'; + i = strtol (s, (char **) NULL, 0); + sym = symbol_new (optarg, absolute_section, (valueT) i, + &zero_address_frag); + symbol_table_insert (sym); + } + break; + case 'J': flag_signed_overflow_ok = 1; break; @@ -381,6 +409,9 @@ parse_args (pargc, pargv) case 'M': flag_mri = 1; +#ifdef TC_M68K + flag_m68k_mri = 1; +#endif break; case 'R': @@ -418,9 +449,7 @@ parse_args (pargc, pargv) listing |= LISTING_SYMBOLS; break; case '=': - listing_filename = strdup (optarg + 1); - if (listing_filename == NULL) - as_fatal ("virtual memory exhausted"); + listing_filename = xstrdup (optarg + 1); optarg += strlen (listing_filename); break; default: @@ -446,17 +475,13 @@ parse_args (pargc, pargv) case 'I': { /* Include file directory */ - char *temp = strdup (optarg); - if (!temp) - as_fatal ("virtual memory exhausted"); + char *temp = xstrdup (optarg); add_include_dir (temp); break; } case 'o': - out_file_name = strdup (optarg); - if (!out_file_name) - as_fatal ("virtual memory exhausted"); + out_file_name = xstrdup (optarg); break; case 'w': @@ -475,13 +500,28 @@ parse_args (pargc, pargv) *pargv = new_argv; } +static void dump_statistics (); +static long start_time; + int main (argc, argv) int argc; char **argv; { + int macro_alternate; + int macro_strip_at; int keep_it; - long start_time = get_run_time (); + + start_time = get_run_time (); + + if (debug_memory) + { +#ifdef BFD_ASSEMBLER + extern long _bfd_chunksize; + _bfd_chunksize = 64; +#endif + chunksize = 64; + } #ifdef HOST_SPECIAL_INIT HOST_SPECIAL_INIT (argc, argv); @@ -511,11 +551,27 @@ main (argc, argv) symbol_begin (); frag_init (); subsegs_begin (); - read_begin (); parse_args (&argc, &argv); + read_begin (); input_scrub_begin (); expr_begin (); - macro_init (0, flag_mri, macro_expr); + + if (flag_print_statistics) + xatexit (dump_statistics); + + macro_alternate = 0; + macro_strip_at = 0; +#ifdef TC_I960 + macro_strip_at = flag_mri; +#endif +#ifdef TC_A29K + /* For compatibility with the AMD 29K family macro assembler + specification. */ + macro_alternate = 1; + macro_strip_at = 1; +#endif + + macro_init (macro_alternate, flag_mri, macro_strip_at, macro_expr); PROGRESS (1); @@ -531,14 +587,10 @@ main (argc, argv) PROGRESS (1); perform_an_assembly_pass (argc, argv); /* Assemble it. */ -#ifdef TC_I960 - brtab_emit (); -#endif -/* start-sanitize-rce */ -#ifdef TC_RCE - dump_literals(0); + +#ifdef md_end + md_end (); #endif -/* end-sanitize-rce */ if (seen_at_least_1_file () && !((had_warnings () && flag_always_generate_output) @@ -565,34 +617,44 @@ main (argc, argv) unlink (out_file_name); input_scrub_end (); -#ifdef md_end - md_end (); -#endif END_PROGRESS (myname); - if (flag_print_statistics) - { - extern char **environ; + /* Use xexit instead of return, because under VMS environments they + may not place the same interpretation on the value given. */ + if ((had_warnings () && flag_always_generate_output) + || had_errors () > 0) + xexit (EXIT_FAILURE); + xexit (EXIT_SUCCESS); +} + +static void +dump_statistics () +{ + extern char **environ; #ifdef HAVE_SBRK - char *lim = (char *) sbrk (0); + char *lim = (char *) sbrk (0); #endif - long run_time = get_run_time () - start_time; + long run_time = get_run_time () - start_time; - fprintf (stderr, "%s: total time in assembly: %ld.%06ld\n", - myname, run_time / 1000000, run_time % 1000000); + fprintf (stderr, "%s: total time in assembly: %ld.%06ld\n", + myname, run_time / 1000000, run_time % 1000000); #ifdef HAVE_SBRK - fprintf (stderr, "%s: data size %ld\n", - myname, (long) (lim - (char *) &environ)); + fprintf (stderr, "%s: data size %ld\n", + myname, (long) (lim - (char *) &environ)); #endif - } - /* Use exit instead of return, because under VMS environments they - may not place the same interpretation on the value given. */ - if ((had_warnings () && flag_always_generate_output) - || had_errors () > 0) - exit (EXIT_FAILURE); - exit (EXIT_SUCCESS); + subsegs_print_statistics (stderr); + write_print_statistics (stderr); + symbol_print_statistics (stderr); + read_print_statistics (stderr); + +#ifdef tc_print_statistics + tc_print_statistics (stderr); +#endif +#ifdef obj_print_statistics + obj_print_statistics (stderr); +#endif } diff --git a/gas/read.c b/gas/read.c index 8e0a1c9..c8ea2eb 100644 --- a/gas/read.c +++ b/gas/read.c @@ -2108,9 +2108,9 @@ s_org (ignore) /* Handle parsing for the MRI SECT/SECTION pseudo-op. This should be called by the obj-format routine which handles section changing when in MRI mode. It will create a new section, and return it. It - will set *TYPE to the section type: one of '\0' (unspecified), 'C' - (code), 'D' (data), 'M' (mixed), or 'R' (romable). If - BFD_ASSEMBLER is defined, the flags will be set in the section. */ + will set *TYPE to the section type: one of 'C' (code), 'D' (data), + 'M' (mixed), or 'R' (romable). If BFD_ASSEMBLER is defined, the + flags will be set in the section. */ void s_mri_sect (type) @@ -2138,9 +2138,7 @@ s_mri_sect (type) *input_line_pointer = '\0'; } - name = strdup (name); - if (name == NULL) - as_fatal ("virtual memory exhausted"); + name = xstrdup (name); *input_line_pointer = c; @@ -2155,7 +2153,7 @@ s_mri_sect (type) record_alignment (seg, align); } - *type = '\0'; + *type = 'C'; if (*input_line_pointer == ',') { c = *++input_line_pointer; @@ -2172,11 +2170,11 @@ s_mri_sect (type) flags = SEC_NO_FLAGS; if (*type == 'C') - flags = SEC_CODE; - else if (*type == 'D') - flags = SEC_DATA; + flags = SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE; + else if (*type == 'D' || *type == 'M') + flags = SEC_ALLOC | SEC_LOAD | SEC_DATA; else if (*type == 'R') - flags = SEC_ROM; + flags = SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_READONLY | SEC_ROM; if (flags != SEC_NO_FLAGS) { if (! bfd_set_section_flags (stdoutput, seg, flags)) @@ -2206,9 +2204,7 @@ s_mri_sect (type) name = input_line_pointer; c = get_symbol_end (); - name = strdup (name); - if (name == NULL) - as_fatal ("virtual memory exhausted"); + name = xstrdup (name); *input_line_pointer = c; diff --git a/gas/stabs.c b/gas/stabs.c index 3ddf680..38ef846 100644 --- a/gas/stabs.c +++ b/gas/stabs.c @@ -18,6 +18,7 @@ License along with GAS; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "as.h" +#include "libiberty.h" #include "obstack.h" #include "subsegs.h" @@ -76,7 +77,6 @@ get_stab_string_offset (string, stabstr_secname) { /* Ordinary case. */ segT save_seg; subsegT save_subseg; - char *newsecname; segT seg; char *p; @@ -84,15 +84,10 @@ get_stab_string_offset (string, stabstr_secname) save_subseg = now_subseg; /* Create the stab string section. */ - newsecname = xmalloc ((unsigned long) (strlen (stabstr_secname) + 1)); - strcpy (newsecname, stabstr_secname); - - seg = subseg_new (newsecname, 0); + seg = subseg_new (stabstr_secname, 0); retval = seg_info (seg)->stabu.stab_string_size; - if (retval > 0) - free (newsecname); - else + if (retval <= 0) { /* Make sure the first string is empty. */ p = frag_more (1); @@ -100,8 +95,8 @@ get_stab_string_offset (string, stabstr_secname) retval = seg_info (seg)->stabu.stab_string_size = 1; #ifdef BFD_ASSEMBLER bfd_set_section_flags (stdoutput, seg, SEC_READONLY | SEC_DEBUGGING); -#else - free (newsecname); + if (seg->name == stabstr_secname) + seg->name = xstrdup (stabstr_secname); #endif } @@ -245,9 +240,24 @@ s_stab_generic (what, stab_secname, stabstr_secname) unsigned int stroff; char *p; + static segT cached_sec; + static char *cached_secname; + dot = frag_now_fix (); - seg = subseg_new (stab_secname, 0); + if (cached_secname && !strcmp (cached_secname, stab_secname)) + { + seg = cached_sec; + subseg_set (seg, 0); + } + else + { + seg = subseg_new (stab_secname, 0); + if (cached_secname) + free (cached_secname); + cached_secname = xstrdup (stab_secname); + cached_sec = seg; + } if (! seg_info (seg)->hadone) { @@ -262,6 +272,11 @@ s_stab_generic (what, stab_secname, stabstr_secname) } stroff = get_stab_string_offset (string, stabstr_secname); + if (what == 's') + { + /* release the string */ + obstack_free (¬es, string); + } /* At least for now, stabs in a special stab section are always output as 12 byte blocks of information. */ @@ -345,7 +360,11 @@ s_xstab (what) { int length; char *stab_secname, *stabstr_secname; + static char *saved_secname, *saved_strsecname; + /* @@ MEMORY LEAK: This allocates a copy of the string, but in most + cases it will be the same string, so we could release the storage + back to the obstack it came from. */ stab_secname = demand_copy_C_string (&length); SKIP_WHITESPACE (); if (*input_line_pointer == ',') @@ -359,11 +378,20 @@ s_xstab (what) /* To get the name of the stab string section, simply add "str" to the stab section name. */ - stabstr_secname = (char *) xmalloc (strlen (stab_secname) + 4); - strcpy (stabstr_secname, stab_secname); - strcat (stabstr_secname, "str"); - s_stab_generic (what, stab_secname, stabstr_secname); - free (stabstr_secname); + if (saved_secname == 0 || strcmp (saved_secname, stab_secname)) + { + stabstr_secname = (char *) xmalloc (strlen (stab_secname) + 4); + strcpy (stabstr_secname, stab_secname); + strcat (stabstr_secname, "str"); + if (saved_secname) + { + free (saved_secname); + free (saved_strsecname); + } + saved_secname = stab_secname; + saved_strsecname = stabstr_secname; + } + s_stab_generic (what, saved_secname, saved_strsecname); } #ifdef S_SET_DESC -- 2.7.4