* as.h: Don't define alloca if __GNUC__. Just declare it.

* macro.c: Copy alloca handling from as.h.
This commit is contained in:
Ian Lance Taylor 1997-08-26 19:10:48 +00:00
parent 977d53fc87
commit a089d2da97
3 changed files with 105 additions and 23 deletions

View File

@ -7,6 +7,9 @@ Tue Aug 26 09:46:22 1997 Nick Clifton <nickc@cygnus.com>
end-sanitize-v850
Tue Aug 26 12:23:25 1997 Ian Lance Taylor <ian@cygnus.com>
* as.h: Don't define alloca if __GNUC__. Just declare it.
* macro.c: Copy alloca handling from as.h.
* config/tc-i386.c (i386_align_code): Correct 16 bit noops. From
Gabriel Paubert <paubert@iram.es>.

View File

@ -52,8 +52,11 @@
/* AIX requires this to be the first thing in the file. */
#ifdef __GNUC__
# undef alloca
# define alloca __builtin_alloca
#ifdef __STDC__
extern void *alloca ();
#else
extern char *alloca ();
#endif
#else
# if HAVE_ALLOCA_H
# include <alloca.h>
@ -63,9 +66,9 @@
# else
# ifndef alloca /* predefined by HP cc +Olibcalls */
# if !defined (__STDC__) && !defined (__hpux)
char *alloca ();
extern char *alloca ();
# else
void *alloca ();
extern void *alloca ();
# endif /* __STDC__, __hpux */
# endif /* alloca */
# endif /* _AIX */
@ -372,7 +375,11 @@ enum _relax_state
later. Similar to rs_org, but different.
fr_symbol: operand
1 variable char: fill character */
rs_space
rs_space,
/* A DWARF leb128 value; only ELF uses this. The subtype is 0 for
unsigned, 1 for signed. */
rs_leb128
};
typedef enum _relax_state relax_stateT;
@ -429,14 +436,22 @@ struct frag
relax_stateT fr_type;
relax_substateT fr_subtype;
/* These are needed only on the NS32K machines. But since we don't
include targ-cpu.h until after this structure has been defined,
we can't really conditionalize it. This code should be
rearranged a bit to make that possible.
In the meantime, if we get stuck like this with any other target,
create a union here. */
char fr_pcrel_adjust, fr_bsr;
union {
/* These are needed only on the NS32K machines. But since we don't
include targ-cpu.h until after this structure has been defined,
we can't really conditionalize it. This code should be
rearranged a bit to make that possible. */
struct {
char pcrel_adjust, bsr;
} ns32k;
#ifdef USING_CGEN
/* Don't include this unless using CGEN to keep frag size down. */
struct {
const struct cgen_insn *insn;
unsigned char opindex, opinfo;
} cgen;
#endif
} fr_targ;
/* Where the frag was created, or where it became a variant frag. */
char *fr_file;
@ -456,7 +471,7 @@ typedef struct frag fragS;
included in frchain_now. The fr_fix field is bogus; instead, use:
obstack_next_free(&frags)-frag_now->fr_literal. */
COMMON fragS *frag_now;
extern int frag_now_fix ();
extern int frag_now_fix PARAMS ((void));
/* For foreign-segment symbol fixups. */
COMMON fragS zero_address_frag;
@ -512,6 +527,13 @@ COMMON int linkrelax;
/* TRUE if we should produce a listing. */
extern int listing;
/* Type of debugging information we should generate. We currently
only support stabs and ECOFF. */
enum debug_info_type { DEBUG_NONE, DEBUG_STABS, DEBUG_ECOFF };
extern enum debug_info_type debug_type;
/* Maximum level of macro nesting. */
extern int max_macro_nest;
@ -589,6 +611,8 @@ int gen_to_words PARAMS ((LITTLENUM_TYPE * words, int precision,
long exponent_bits));
int had_err PARAMS ((void));
int ignore_input PARAMS ((void));
void cond_finish_check PARAMS ((int));
void cond_exit_macro PARAMS ((int));
int seen_at_least_1_file PARAMS ((void));
void app_pop PARAMS ((char *arg));
void as_howmuch PARAMS ((FILE * stream));
@ -609,6 +633,10 @@ void subseg_set PARAMS ((segT seg, subsegT subseg));
segT subseg_get PARAMS ((const char *, int));
#endif
void start_dependencies PARAMS ((char *));
void register_dependency PARAMS ((char *));
void print_dependencies PARAMS ((void));
struct expressionS;
struct fix;
struct symbol;

View File

@ -1,5 +1,5 @@
/* macro.c - macro support for gas and gasp
Copyright (C) 1994, 1995 Free Software Foundation, Inc.
Copyright (C) 1994, 95, 96, 1997 Free Software Foundation, Inc.
Written by Steve and Judy Chamberlain of Cygnus Support,
sac@cygnus.com
@ -22,6 +22,32 @@
02111-1307, USA. */
#include "config.h"
/* AIX requires this to be the first thing in the file. */
#ifdef __GNUC__
#ifdef __STDC__
extern void *alloca ();
#else
extern char *alloca ();
#endif
#else
# if HAVE_ALLOCA_H
# include <alloca.h>
# else
# ifdef _AIX
#pragma alloca
# else
# ifndef alloca /* predefined by HP cc +Olibcalls */
# if !defined (__STDC__) && !defined (__hpux)
extern char *alloca ();
# else
extern void *alloca ();
# endif /* __STDC__, __hpux */
# endif /* alloca */
# endif /* _AIX */
# endif /* HAVE_ALLOCA_H */
#endif
#include <stdio.h>
#ifdef HAVE_STRING_H
#include <string.h>
@ -513,17 +539,20 @@ do_formals (macro, idx, in)
}
/* Define a new macro. Returns NULL on success, otherwise returns an
error message. */
error message. If NAMEP is not NULL, *NAMEP is set to the name of
the macro which was defined. */
const char *
define_macro (idx, in, label, get_line)
define_macro (idx, in, label, get_line, namep)
int idx;
sb *in;
sb *label;
int (*get_line) PARAMS ((sb *));
const char **namep;
{
macro_entry *macro;
sb name;
const char *namestr;
macro = (macro_entry *) xmalloc (sizeof (macro_entry));
sb_new (&macro->sub);
@ -538,7 +567,7 @@ define_macro (idx, in, label, get_line)
if (label != NULL && label->len != 0)
{
sb_add_sb (&name, label);
if (in->ptr[idx] == '(')
if (idx < in->len && in->ptr[idx] == '(')
{
/* It's the label: MACRO (formals,...) sort */
idx = do_formals (macro, idx + 1, in);
@ -562,10 +591,14 @@ define_macro (idx, in, label, get_line)
for (idx = 0; idx < name.len; idx++)
if (isupper (name.ptr[idx]))
name.ptr[idx] = tolower (name.ptr[idx]);
hash_jam (macro_hash, sb_terminate (&name), (PTR) macro);
namestr = sb_terminate (&name);
hash_jam (macro_hash, namestr, (PTR) macro);
macro_defined = 1;
if (namep != NULL)
*namep = namestr;
return NULL;
}
@ -657,12 +690,17 @@ macro_expand_body (in, out, formals, formal_hash, comment_char, locals)
if (in->ptr[src] == '&')
{
sb_reset (&t);
if (macro_mri && src + 1 < in->len && in->ptr[src + 1] == '&')
if (macro_mri)
{
src = sub_actual (src + 2, in, &t, formal_hash, '\'', out, 1);
if (src + 1 < in->len && in->ptr[src + 1] == '&')
src = sub_actual (src + 2, in, &t, formal_hash, '\'', out, 1);
else
sb_add_char (out, in->ptr[src++]);
}
else
{
/* FIXME: Why do we do this? It prevents people from
using the & operator in a macro. */
src = sub_actual (src + 1, in, &t, formal_hash, '&', out, 0);
}
}
@ -825,7 +863,19 @@ macro_expand_body (in, out, formals, formal_hash, comment_char, locals)
src = get_token (src + 2, in, &t);
ptr = (formal_entry *) hash_find (formal_hash, sb_terminate (&t));
if (ptr == NULL)
return "macro formal argument does not exist";
{
/* FIXME: We should really return a warning string here,
but we can't, because the == might be in the MRI
comment field, and, since the nature of the MRI
comment field depends upon the exact instruction
being used, we don't have enough information here to
figure out whether it is or not. Instead, we leave
the == in place, which should cause a syntax error if
it is not in a comment. */
sb_add_char (out, '=');
sb_add_char (out, '=');
sb_add_sb (out, &t);
}
else
{
if (ptr->actual.len)
@ -921,6 +971,7 @@ macro_expand (idx, in, m, out, comment_char)
scan = idx;
while (scan < in->len
&& !ISSEP (in->ptr[scan])
&& !(macro_mri && in->ptr[scan] == '\'')
&& (!macro_alternate && in->ptr[scan] != '='))
scan++;
if (scan < in->len && !macro_alternate && in->ptr[scan] == '=')
@ -1075,7 +1126,7 @@ check_macro (line, expand, comment_char, error)
|| *s == '$')
++s;
copy = (char *) xmalloc (s - line + 1);
copy = (char *) alloca (s - line + 1);
memcpy (copy, line, s - line);
copy[s - line] = '\0';
for (cs = copy; *cs != '\0'; cs++)