* as.h: Don't define alloca if __GNUC__. Just declare it.
* macro.c: Copy alloca handling from as.h.
This commit is contained in:
parent
977d53fc87
commit
a089d2da97
|
@ -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>.
|
||||
|
||||
|
|
56
gas/as.h
56
gas/as.h
|
@ -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;
|
||||
|
|
69
gas/macro.c
69
gas/macro.c
|
@ -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 (¯o->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++)
|
||||
|
|
Loading…
Reference in New Issue