* as.h: Don't define alloca if __GNUC__. Just declare it.
authorIan Lance Taylor <ian@airs.com>
Tue, 26 Aug 1997 19:10:48 +0000 (19:10 +0000)
committerIan Lance Taylor <ian@airs.com>
Tue, 26 Aug 1997 19:10:48 +0000 (19:10 +0000)
* macro.c: Copy alloca handling from as.h.

gas/ChangeLog
gas/as.h
gas/macro.c

index e6eed86..442a9ee 100644 (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>.
 
index f24b072..0196d06 100644 (file)
--- a/gas/as.h
+++ b/gas/as.h
 
 /* 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;
index 5743f79..e03b0f7 100644 (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
    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++)