aboutsummaryrefslogtreecommitdiff
path: root/gas/as.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1995-08-21 18:35:11 +0000
committerIan Lance Taylor <ian@airs.com>1995-08-21 18:35:11 +0000
commit7e047ac2c1fcb16f721c715a48c8d4b8b4776485 (patch)
treee564914df3cf5fa253fbf65ea8b9b36deaddd40a /gas/as.c
parent7172e2266f4a25fc34dda564ac13c89c9d855cde (diff)
downloadgdb-7e047ac2c1fcb16f721c715a48c8d4b8b4776485.zip
gdb-7e047ac2c1fcb16f721c715a48c8d4b8b4776485.tar.gz
gdb-7e047ac2c1fcb16f721c715a48c8d4b8b4776485.tar.bz2
Add support for macros.
* as.c: Include sb.h and macro.h. (max_macro_next): New global variable. (main): Call macro_init. (macro_expr): New static function. * as.h (max_macro_nest): Declare. * read.c (line_label): Rename from mri_line_label. Change all uses. (potable): Add exitm, irp, irpc, macro, mexit, rept. (read_a_source_file): Always clear line_label at the start of a line, not just when flag_mri or LABELS_WITHOUT_COLONS. Fixup MRI/LABELS_WITHOUT_COLONS handling. In MRI mode, permit label: equ val. Set line_label when calling colon. In MRI mode, a leading '.' does not imply a pseudo-op. Check for macro expansion before calling md_assemble. (s_irp): New function. (get_line_sb): New static function. (s_macro): New function. (s_mexit): New function. (s_rept): New function. * read.h (line_label): Rename from mri_line_label. (s_irp, s_rept): Declare. (s_macro, s_mexit): Declare. * input-scrub.c: Include sb.h. (sb_index, from_sb): New static variables. (macro_nest): New static variable. (struct input_save): Add sb_index and from_sb fields. Change next_saved_file field to be struct input_save *. (next_saved_file): Changed to be struct input_save *. (input_scrub_push): Change to return type struct input_save *. Save sb_index and from_sb. (input_scrub_pop): Change parameter type to struct input_save *. Restore sb_index and from_sb. (input_scrub_include_sb): New function. (input_scrub_next_buffer): Handle reading from from_sb. (bump_line_counters): Only increment lines if not using from_sb. * config/tc-m68k.c (opt_table): Add nest. (opt_nest): New static function. * gasp.c: Include sb.h and macro.h. Move all sb related functions and definitions to sb.h and sb.c. Move all macro related functions and definitions to macro.h and macro.c. * sb.h, sb.c: New files, extracted from gasp.c. * macro.h, macro.c: Likewise. * Makefile.in (OBJS): Add sb.o and macro.o (GASPOBJS): Define. (gasp.new): Depend upon $(GASPOBJS). Use $(GASPOBJS) to link. (TARG_CPU_DEP_m68k): Depend upon subsegs.h. (gasp.o): Depend upon sb.h and macro.h. (sb.o): New target. (macro.o): New target. (as.o): Depend upon sb.h and macro.h. (input-scrub.o): Depend upon sb.h. (read.o): Depend upon sb.h and macro.h.
Diffstat (limited to 'gas/as.c')
-rw-r--r--gas/as.c50
1 files changed, 46 insertions, 4 deletions
diff --git a/gas/as.c b/gas/as.c
index e2da5cb..4850e86 100644
--- a/gas/as.c
+++ b/gas/as.c
@@ -15,7 +15,7 @@
You should have received a copy of the GNU General Public License
along with GAS; see the file COPYING. If not, write to
- the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*
* Main program for AS; a 32-bit assembler of GNU.
@@ -40,13 +40,20 @@
#include "as.h"
#include "subsegs.h"
#include "output-file.h"
+#include "sb.h"
+#include "macro.h"
static void perform_an_assembly_pass PARAMS ((int argc, char **argv));
+static int macro_expr PARAMS ((const char *, int, sb *, int *));
int listing; /* true if a listing is wanted */
static char *listing_filename = NULL; /* Name of listing file. */
+/* Maximum level of macro nesting. */
+
+int max_macro_nest = 100;
+
char *myname; /* argv[0] */
#ifdef BFD_ASSEMBLER
segT reg_section, expr_section;
@@ -94,6 +101,7 @@ Options:\n\
-K warn when differences altered for long displacements\n\
-L keep local symbols (starting with `L')\n");
fprintf (stream, "\
+-M,--mri assemble in MRI compatibility mode\n\
-nocpp ignored\n\
-o OBJFILE name the object-file output OBJFILE (default a.out)\n\
-R fold data section into text section\n\
@@ -224,7 +232,7 @@ parse_args (pargc, pargv)
/* -K is not meaningful if .word is not being hacked. */
'K',
#endif
- 'L', 'R', 'W', 'Z', 'f', 'a', ':', ':', 'D', 'I', ':', 'o', ':',
+ 'L', 'M', 'R', 'W', 'Z', 'f', 'a', ':', ':', 'D', 'I', ':', 'o', ':',
#ifndef VMS
/* -v takes an argument on VMS, so we don't make it a generic
option. */
@@ -239,6 +247,7 @@ parse_args (pargc, pargv)
static const struct option std_longopts[] = {
#define OPTION_HELP (OPTION_STD_BASE)
{"help", no_argument, NULL, OPTION_HELP},
+ {"mri", no_argument, NULL, 'M'},
#define OPTION_NOCPP (OPTION_STD_BASE + 1)
{"nocpp", no_argument, NULL, OPTION_NOCPP},
#define OPTION_STATISTICS (OPTION_STD_BASE + 2)
@@ -370,6 +379,10 @@ parse_args (pargc, pargv)
flag_keep_locals = 1;
break;
+ case 'M':
+ flag_mri = 1;
+ break;
+
case 'R':
flag_readonly_data_in_text = 1;
break;
@@ -499,9 +512,10 @@ main (argc, argv)
frag_init ();
subsegs_begin ();
read_begin ();
- input_scrub_begin ();
- PROGRESS (1);
parse_args (&argc, &argv);
+ input_scrub_begin ();
+ expr_begin ();
+ macro_init (0, flag_mri, macro_expr);
PROGRESS (1);
@@ -683,4 +697,32 @@ perform_an_assembly_pass (argc, argv)
read_a_source_file ("");
} /* perform_an_assembly_pass() */
+/* The interface between the macro code and gas expression handling. */
+
+static int
+macro_expr (emsg, idx, in, val)
+ const char *emsg;
+ int idx;
+ sb *in;
+ int *val;
+{
+ char *hold;
+ expressionS ex;
+
+ sb_terminate (in);
+
+ hold = input_line_pointer;
+ input_line_pointer = in->ptr + idx;
+ expression (&ex);
+ idx = input_line_pointer - in->ptr;
+ input_line_pointer = hold;
+
+ if (ex.X_op != O_constant)
+ as_bad ("%s", emsg);
+
+ *val = (int) ex.X_add_number;
+
+ return idx;
+}
+
/* end of as.c */