/* tc-v850.h -- Header file for tc-v850.c.
   Copyright (C) 1996-2021 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 3, 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, 51 Franklin Street - Fifth Floor, Boston, MA
   02110-1301, USA.  */

#define TC_V850

#include "elf/v850.h"

#define TARGET_BYTES_BIG_ENDIAN 0

/* The target BFD architecture.  */
#define TARGET_ARCH 		v850_target_arch
extern enum bfd_architecture v850_target_arch;

/* The target BFD format.  */
#define TARGET_FORMAT 		v850_target_format
extern const char * v850_target_format;

#define md_operand(x)

#define tc_fix_adjustable(FIX) v850_fix_adjustable (FIX)
extern bool v850_fix_adjustable (struct fix *);

#define TC_FORCE_RELOCATION(FIX) v850_force_relocation(FIX)
extern int v850_force_relocation (struct fix *);

#ifdef OBJ_ELF
/* Values passed to md_apply_fix don't include the symbol value.  */
#define MD_APPLY_SYM_VALUE(FIX) 0
#endif

/* Permit temporary numeric labels.  */
#define LOCAL_LABELS_FB 1

#define DIFF_EXPR_OK		/* foo-. gets turned into PC relative relocs.  */

/* We don't need to handle .word strangely.  */
#define WORKING_DOT_WORD

#define md_number_to_chars number_to_chars_littleendian

/* We need to handle lo(), hi(), etc etc in .hword, .word, etc
   directives, so we have to parse "cons" expressions ourselves.  */
#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_cons_expression_v850 (EXP)
extern bfd_reloc_code_real_type parse_cons_expression_v850 (expressionS *);

#define TC_CONS_FIX_NEW cons_fix_new_v850
extern void cons_fix_new_v850 (fragS *, int, int, expressionS *,
			       bfd_reloc_code_real_type);

#define TC_GENERIC_RELAX_TABLE md_relax_table
extern const struct relax_type md_relax_table[];

/* When relaxing, we need to generate
   relocations for alignment directives.  */
#define HANDLE_ALIGN(frag) v850_handle_align (frag)
extern void v850_handle_align (fragS *);

/* We need space in a frag's fixed size to allow for alignment when relaxing.  */
#define TC_FX_SIZE_SLACK(FIX) 2

#define MD_PCREL_FROM_SECTION(FIX, SEC) v850_pcrel_from_section (FIX, SEC)
extern long v850_pcrel_from_section (struct fix *, asection *);

#define DWARF2_LINE_MIN_INSN_LENGTH 2

/* We need to record the operand involved when a pseudo-reloc is
   processed so that the resulting value can be inserted correctly.  */
#define TC_FIX_TYPE             void *
#define TC_INIT_FIX_DATA(fixP)  (fixP)->tc_fix_data = NULL

#define md_end v850_md_end
extern void    v850_md_end (void);
