aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog3
-rw-r--r--gas/as.h56
-rw-r--r--gas/macro.c69
3 files changed, 105 insertions, 23 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index e6eed86..442a9ee 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -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>.
diff --git a/gas/as.h b/gas/as.h
index f24b072..0196d06 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 <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;
diff --git a/gas/macro.c b/gas/macro.c
index 5743f79..e03b0f7 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 <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++)