From: Ian Lance Taylor Date: Tue, 26 Aug 1997 19:10:48 +0000 (+0000) Subject: * as.h: Don't define alloca if __GNUC__. Just declare it. X-Git-Url: http://drtracing.org/?a=commitdiff_plain;h=a089d2da979c9e8f2db869c30c104c45579fb00a;p=deliverable%2Fbinutils-gdb.git * as.h: Don't define alloca if __GNUC__. Just declare it. * macro.c: Copy alloca handling from as.h. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index e6eed86cec..442a9eef64 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -7,6 +7,9 @@ Tue Aug 26 09:46:22 1997 Nick Clifton end-sanitize-v850 Tue Aug 26 12:23:25 1997 Ian Lance Taylor + * 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 . diff --git a/gas/as.h b/gas/as.h index f24b0729ad..0196d064ef 100644 --- a/gas/as.h +++ b/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 @@ -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; diff --git a/gas/macro.c b/gas/macro.c index 5743f79536..e03b0f710b 100644 --- a/gas/macro.c +++ b/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 +# 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 #ifdef HAVE_STRING_H #include @@ -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++)