diff --git a/gas/ChangeLog b/gas/ChangeLog index 71ca2bfada..388a3afc1f 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,10 +1,45 @@ +Tue Nov 4 16:35:57 1997 Ian Dall + + * write.c (print_fixup): Use TC_FIX_DATA_PRINT (if defined) to + print out MD fields of fix. + * frags.c (frag_var, frag_variant): Use TC_FRAG_INIT macro (if + defined) to initialize MD fields in frag. + * as.h (struct frag, ns32k support): Rename ns32k to fr_ns32k. + Delete pcrel_adjust. Add fr_opcode_fragP, fr_opcode_offset. + * config/tc-ns32k.h: Add comments. Remove obsolete + BFD_FAST_SECTION_FILL definition, change prototypes for + fix_new_ns32k and fix_new_ns32k_exp to add new arguments + opcode_frag and opcode_offset and remove pcrel_adjust. + (TC_FIX_TYPE): add opcode_fragP and opcode_offset fields. + (TC_FIX_DATA_PRINT): new macro to print out TC_FIX_TYPE. + (TC_FRAG_INIT): new macro to initialize machine dependent field in + frags. + (frag_opcode_frag, frag_opcode_offset, frag_bsr): macros to access + MD fields in frag structure. + (fix_im_disp, fix_bit_fixP, fix_opcode_frag, fix_opcode_offset, + fix_bsr): macros to access MD fields in fix structure. + * config/tc-ns32k.c: Avoid overlength lines. Align comments. Don't + use struct opcode_location as these fields are now in the frag + structure. + (convert_iif): Call frag_more as it is needed instead + of trying to allocate for the whole insn. Avoid call of frag_more + with negative argument. + (md_pcrel_adjust, md_fix_pcrel_adjust, md_apply_fix, + md_estimate_size_before_relax, md_pcrel_from, + tc_aout_fix_to_chars): use accessor macros to get md fields in fix + and frag structures. + (fix_new_ns32k, fix_new_ns32k_exp): add new arguments opcode_frag and + opcode_offset and remove pcrel_adjust. + (convert_iif, cons_fix_new_ns32k): call fix_new_ns32k, + fix_new_ns32k_exp with changed arguments. + Mon Nov 3 13:30:17 1997 Gavin Koch - * tc-mips.c (md_begin): Reorganize setting of default values so - that mips_cpu depends on TARGET_CPU, and mips_opts.isa depends on - mips_cpu. - (md_parse_option): Remove all code that sets defaults; md_begin - handles all of this now. + * tc-mips.c (md_begin): Reorganize setting of default values so + that mips_cpu depends on TARGET_CPU, and mips_opts.isa depends on + mips_cpu. + (md_parse_option): Remove all code that sets defaults; md_begin + handles all of this now. Sun Nov 2 14:46:09 1997 Ian Lance Taylor diff --git a/gas/as.h b/gas/as.h index 0196d064ef..46b58a8280 100644 --- a/gas/as.h +++ b/gas/as.h @@ -52,11 +52,13 @@ /* AIX requires this to be the first thing in the file. */ #ifdef __GNUC__ -#ifdef __STDC__ +# ifndef alloca +# ifdef __STDC__ extern void *alloca (); -#else +# else extern char *alloca (); -#endif +# endif +# endif #else # if HAVE_ALLOCA_H # include @@ -410,6 +412,7 @@ typedef addressT relax_addressT; BUG: it may be smarter to have a single pointer off to various different notes for different frag kinds. See how code pans */ + struct frag { /* Object file address. */ @@ -442,8 +445,10 @@ struct frag we can't really conditionalize it. This code should be rearranged a bit to make that possible. */ struct { - char pcrel_adjust, bsr; - } ns32k; + struct frag *fr_opcode_fragP; + unsigned int fr_opcode_offset; + char fr_bsr; + } fr_ns32k; #ifdef USING_CGEN /* Don't include this unless using CGEN to keep frag size down. */ struct { @@ -467,9 +472,9 @@ struct frag typedef struct frag fragS; -/* Current frag we are building. This frag is incomplete. It is, however, - included in frchain_now. The fr_fix field is bogus; instead, use: - obstack_next_free(&frags)-frag_now->fr_literal. */ +/* Current frag we are building. This frag is incomplete. It is, + however, included in frchain_now. The fr_fix field is bogus; + instead, use frag_now_fix (). */ COMMON fragS *frag_now; extern int frag_now_fix PARAMS ((void)); @@ -623,7 +628,7 @@ void do_scrub_begin PARAMS ((int)); void input_scrub_begin PARAMS ((void)); void input_scrub_close PARAMS ((void)); void input_scrub_end PARAMS ((void)); -void new_logical_line PARAMS ((char *fname, int line_number)); +int new_logical_line PARAMS ((char *fname, int line_number)); void subsegs_begin PARAMS ((void)); void subseg_change PARAMS ((segT seg, int subseg)); segT subseg_new PARAMS ((const char *name, subsegT subseg)); diff --git a/gas/config/tc-ns32k.h b/gas/config/tc-ns32k.h index e37236f362..6b89482c28 100644 --- a/gas/config/tc-ns32k.h +++ b/gas/config/tc-ns32k.h @@ -1,22 +1,48 @@ /* tc-ns32k.h -- Opcode table for National Semi 32k processor - Copyright (C) 1987, 1992 Free Software Foundation, Inc. - + Copyright (C) 1987, 92, 93, 94, 95, 1997 Free Software Foundation, Inc. + This file is part of GAS, the GNU Assembler. - + GAS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. - + GAS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - 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. */ + 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, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + +#define TC_NS32K + +#define TARGET_BYTES_BIG_ENDIAN 0 + +#define TC_PCREL_ADJUST(F) md_pcrel_adjust(F) + +#ifdef BFD_ASSEMBLER +#define NO_RELOC BFD_RELOC_NONE + +#define TARGET_ARCH bfd_arch_ns32k + +#ifndef TARGET_FORMAT /* Maybe defined in te-*.h */ +#define TARGET_FORMAT "a.out-pc532-mach" +#endif +#else +#define NO_RELOC 0 +#endif + +#define LOCAL_LABELS_FB 1 + +#include "bit_fix.h" + +#define tc_aout_pre_write_hook(x) {;} /* not used */ +#define tc_crawl_symbol_chain(a) {;} /* not used */ +#define tc_headers_hook(a) {;} /* not used */ #ifdef SEQUENT_COMPATABILITY #define DEF_MODEC 20 @@ -34,24 +60,90 @@ #define MAX_ARGS 4 #define ARG_LEN 50 -#if __STDC__ == 1 - -void fix_new_ns32k(fragS *frag, - int where, - void *add_symbol, /* really symbolS */ - void *sub_symbol, /* really symbolS */ - long offset, - int pcrel, - int pcrel_adjust, - int im_disp, - void *bit_fixP, /* really bit_fixS */ - int bsr); - -#else /* not __STDC__ */ - -void fix_new_ns32k(); - -#endif /* not __STDC__ */ +#define TC_CONS_FIX_NEW cons_fix_new_ns32k +extern void fix_new_ns32k_exp PARAMS((fragS *frag, + int where, + int size, + expressionS *exp, + int pcrel, + int im_disp, + bit_fixS *bit_fixP, /* really bit_fixS */ + int bsr, + fragS *opcode_frag, + unsigned int opcode_offset)); -/* end of tc-ns32k.h */ +extern void fix_new_ns32k PARAMS ((fragS *frag, + int where, + int size, + struct symbol *add_symbol, + long offset, + int pcrel, + int im_disp, + bit_fixS *bit_fixP, /* really bit_fixS */ + int bsr, + fragS *opcode_frag, + unsigned int opcode_offset)); + +extern void cons_fix_new_ns32k PARAMS ((fragS *frag, + int where, + int size, + expressionS *exp)); + +/* the NS32x32 has a non 0 nop instruction which should be used in aligns */ +#define NOP_OPCODE 0xa2 + +#define md_operand(x) + +extern const struct relax_type md_relax_table[]; +#define TC_GENERIC_RELAX_TABLE md_relax_table + + +#define TC_FRAG_INIT(X) \ + do \ + { \ + frag_opcode_frag(X) = NULL; \ + frag_opcode_offset(X) = 0; \ + frag_bsr(X) = 0; \ + } \ + while(0) + +/* Accessor macros for things which may move around */ +#define frag_opcode_frag(X) (X)->fr_targ.fr_ns32k.fr_opcode_fragP +#define frag_opcode_offset(X) (X)->fr_targ.fr_ns32k.fr_opcode_offset +#define frag_bsr(X) (X)->fr_targ.fr_ns32k.fr_bsr + +#define TC_FIX_TYPE \ +struct \ +{ \ + fragS *opcode_fragP; \ + unsigned int opcode_offset; \ + unsigned int bsr : 1; \ +} + +/* Accessor macros for things which may move around. + See comments in write.h. */ +#define fix_im_disp(X) (X)->fx_im_disp +#define fix_bit_fixP(X) (X)->fx_bit_fixP +#define fix_opcode_frag(X) (X)->tc_fix_data.opcode_fragP +#define fix_opcode_offset(X) (X)->tc_fix_data.opcode_offset +#define fix_bsr(X) (X)->tc_fix_data.bsr + +#define TC_INIT_FIX_DATA(X) \ + do \ + { \ + fix_opcode_frag(X) = NULL; \ + fix_opcode_offset(X) = 0; \ + fix_bsr(X) = 0; \ + } \ + while(0) + +#define TC_FIX_DATA_PRINT(FILE, FIXP) \ + do \ + { \ + fprintf((FILE), "opcode_frag=%ld, operand offset=%d, bsr=%d\n", \ + (unsigned long) fix_opcode_frag (FIXP), \ + fix_opcode_offset (FIXP), \ + fix_bsr (FIXP)); \ + } \ + while(0)