* 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.
This commit is contained in:
Ian Lance Taylor 1996-03-22 16:44:21 +00:00
parent 5ba7c0bee1
commit c7a89bde9b
4 changed files with 166 additions and 73 deletions

View File

@ -1,5 +1,12 @@
Fri Mar 22 11:13:00 1996 Ian Lance Taylor <ian@cygnus.com>
* 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

148
gas/as.c
View File

@ -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 ();
#ifdef md_end
md_end ();
#endif
/* start-sanitize-rce */
#ifdef TC_RCE
dump_literals(0);
#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;
#ifdef HAVE_SBRK
char *lim = (char *) sbrk (0);
#endif
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);
#ifdef HAVE_SBRK
fprintf (stderr, "%s: data size %ld\n",
myname, (long) (lim - (char *) &environ));
#endif
}
/* Use exit instead of return, because under VMS environments they
/* 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)
exit (EXIT_FAILURE);
exit (EXIT_SUCCESS);
xexit (EXIT_FAILURE);
xexit (EXIT_SUCCESS);
}
static void
dump_statistics ()
{
extern char **environ;
#ifdef HAVE_SBRK
char *lim = (char *) sbrk (0);
#endif
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);
#ifdef HAVE_SBRK
fprintf (stderr, "%s: data size %ld\n",
myname, (long) (lim - (char *) &environ));
#endif
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
}

View File

@ -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;

View File

@ -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 (&notes, 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