/* GAS cgen support.
   Copyright (C) 1998-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.  */

#ifndef GAS_CGEN_H
#define GAS_CGEN_H

/* Opcode table handle.  */
extern CGEN_CPU_DESC gas_cgen_cpu_desc;

/* Maximum number of fixups in an insn.
   If you need to change this, allow target to override and do so there.  */
#ifndef GAS_CGEN_MAX_FIXUPS
#define GAS_CGEN_MAX_FIXUPS 3
#endif

/* Struct defining result of gas_cgen_finish_insn.  */
typedef struct
{
  /* Frag containing the insn */
  fragS * frag;
  /* Address of insn in frag.  */
  char * addr;
  /* Number of fixups this insn has.  */
  int num_fixups;
  /* Array of fixups.  */
  fixS * fixups[GAS_CGEN_MAX_FIXUPS];
} finished_insnS;

/* Callback for operand parsing.
   The result is an error message or NULL for success.
   The parsed value is stored in the bfd_vma *.  */
extern const char * gas_cgen_parse_operand
     (CGEN_CPU_DESC, enum cgen_parse_operand_type,
      const char **, int, int, enum cgen_parse_operand_result *,
      bfd_vma *);

/* Call this from md_assemble to initialize the assembler callback.  */
extern void gas_cgen_init_parse (void);

/* Routines and macros for saving fixup chains.  */
extern void gas_cgen_save_fixups (int);
extern void gas_cgen_restore_fixups (int);
extern void gas_cgen_swap_fixups (int);
extern void gas_cgen_initialize_saved_fixups_array (void);
#define MAX_SAVED_FIXUP_CHAINS 50

/* Add a register to the assembler's hash table.
   This makes lets GAS parse registers for us.
   ??? This isn't currently used, but it could be in the future.  */
extern void cgen_asm_record_register (char *, int);

/* After CGEN_SYM (assemble_insn) is done, this is called to
   output the insn and record any fixups.  */
extern void gas_cgen_finish_insn (const CGEN_INSN *,
				  CGEN_INSN_BYTES_PTR, unsigned int,
				  int, finished_insnS *);

/* Record a fixup.  */
extern fixS * gas_cgen_record_fixup (fragS *, int, const CGEN_INSN *,
				     int, const CGEN_OPERAND *, int,
				     symbolS *, offsetT);
extern fixS * gas_cgen_record_fixup_exp (fragS *, int, const CGEN_INSN *,
					 int, const CGEN_OPERAND *, int,
					 expressionS *);

extern bfd_reloc_code_real_type gas_cgen_pcrel_r_type (bfd_reloc_code_real_type);

/* md_apply_fix handler.  */
extern void gas_cgen_md_apply_fix (fixS *, valueT *, segT);

/* tc_gen_reloc handler.  */
extern arelent *gas_cgen_tc_gen_reloc (asection *, fixS *);

/* Target supplied routine to lookup a reloc.  */
extern bfd_reloc_code_real_type
md_cgen_lookup_reloc (const CGEN_INSN *, const CGEN_OPERAND *, fixS *);

/* Optional target supplied routine to record a fixup for an expression.  */
extern fixS *
md_cgen_record_fixup_exp (fragS *, int, const CGEN_INSN *, int,
			  const CGEN_OPERAND *, int, expressionS *);

extern void gas_cgen_md_operand (expressionS *);

/* Perform any cgen specific initialisation for gas.  */
extern void gas_cgen_begin (void);

#endif /* GAS_CGEN_H */
