/* This file is tc-mcore.h

   Copyright (C) 1999 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.  */

#ifndef	TC_MCORE
#define TC_MCORE 1

#ifndef BFD_ASSEMBLER
 #error MCORE support requires BFD_ASSEMBLER
#endif

#define TARGET_ARCH	bfd_arch_mcore
#define TARGET_BYTES_BIG_ENDIAN 1

/* Don't write out relocs for pcrel stuff.  */
#define TC_COUNT_RELOC(x) (((x)->fx_addsy || (x)->fx_subsy) && \
			   (x)->fx_r_type < BFD_RELOC_MCORE_PCREL_IMM8BY4)

#define IGNORE_NONSTANDARD_ESCAPES

#define TC_RELOC_MANGLE(a,b,c) tc_reloc_mangle (a, b, c)

/* Some pseudo-op semantic extensions.  */
#define	PSEUDO_LCOMM_OPTIONAL_ALIGN

#define LISTING_HEADER        	"M.CORE GAS Version 2.9.4"
#define LISTING_LHS_CONT_LINES	4

#define NEED_FX_R_TYPE	1
#define COFF_FLAGS 	1

/* We want local label support.  */
#define LOCAL_LABELS_FB 1
     
#define TC_COFF_SIZEMACHDEP(frag) tc_coff_sizemachdep (frag)
  
extern const struct relax_type md_relax_table[];
#define TC_GENERIC_RELAX_TABLE md_relax_table
#define md_end	md_mcore_end

/* Want the section information too... */
#define MD_PCREL_FROM_SECTION(FIXP, SEC) md_pcrel_from_section (FIXP, SEC)

#define MD_APPLY_FIX3  /* We want the segment as well.  */



#ifdef  OBJ_COFF

#define TARGET_FORMAT	(target_big_endian ? "pe-mcore-big" : "pe-mcore-little")

#define TARGET_SYMBOL_FIELDS  int sy_flags ;

#endif /* OBJ_COFF */


#ifdef OBJ_ELF

#define TARGET_FORMAT (target_big_endian ? "elf32-mcore-big" : "elf32-mcore-little")

#define ELF_TC_SPECIAL_SECTIONS \
  { ".ctors",	SHT_PROGBITS,	SHF_ALLOC + SHF_WRITE }, \
  { ".dtors",	SHT_PROGBITS,	SHF_ALLOC + SHF_WRITE }, \
/* Other special sections not generated by the assembler: .reginfo,
   .liblist, .conflict, .gptab, .got, .dynamic, .rel.dyn.  */

/* When relaxing, we need to emit various relocs we otherwise wouldn't.  */
#define TC_FORCE_RELOCATION(fix) mcore_force_relocation (fix)
extern int mcore_force_relocation PARAMS ((struct fix *));

#define obj_fix_adjustable(fixP) mcore_fix_adjustable (fixP)
extern boolean mcore_fix_adjustable PARAMS ((struct fix *));

#endif /* OBJ_ELF */

#ifndef TARGET_FORMAT
# error No target format specified.
#endif

#include "struc-symbol.h" /* For definition of symbolS */
#include "write.h"        /* For definition of fixS */
  
extern void      md_begin            PARAMS ((void));
extern void      md_assemble         PARAMS ((char *));
extern symbolS * md_undefined_symbol PARAMS ((char *));
extern void      md_mcore_end        PARAMS ((void));
extern char *    md_atof             PARAMS ((int, char *, int *));
extern int       md_parse_option     PARAMS ((int, char *));
extern void      md_show_usage       PARAMS ((FILE *));
extern void      md_create_short_jump 
  PARAMS ((char *, addressT, addressT, fragS *, symbolS *));
extern void      md_create_long_jump
  PARAMS ((char *, addressT, addressT, fragS *, symbolS *));
extern void      md_convert_frag               PARAMS ((bfd *, segT, fragS *));
extern int       md_apply_fix3                 PARAMS ((fixS *, valueT *, segT));
extern void      md_operand                    PARAMS ((expressionS *));
extern int       md_estimate_size_before_relax PARAMS ((fragS *, segT));
extern void      md_number_to_chars            PARAMS ((char *, valueT, int));
extern valueT    md_section_align              PARAMS ((segT, valueT));
extern long      md_pcrel_from_section         PARAMS ((fixS *, segT));
extern arelent * tc_gen_reloc                  PARAMS ((asection *, fixS *));

#endif /* TC_MCORE */
