/* ecoff.h -- header file for ECOFF debugging support
   Copyright (C) 1993-2024 Free Software Foundation, Inc.
   Contributed by Cygnus Support.
   Put together by Ian Lance Taylor <ian@cygnus.com>.

   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_ECOFF_H
#define GAS_ECOFF_H

#ifdef ECOFF_DEBUGGING

#include "coff/sym.h"
#include "coff/ecoff.h"

/* Whether we have seen any ECOFF debugging information.  */
extern int ecoff_debugging_seen;

/* This function should be called at the start of assembly, by
   obj_read_begin_hook.  */
extern void ecoff_read_begin_hook (void);

/* This function should be called when the assembler switches to a new
   file.  */
extern void ecoff_new_file (const char *);

/* This function should be called when a new symbol is created, by
   obj_symbol_new_hook.  */
extern void ecoff_symbol_new_hook (symbolS *);

extern void ecoff_symbol_clone_hook (symbolS *, symbolS *);

/* This function should be called by the obj_frob_symbol hook.  */
extern void ecoff_frob_symbol (symbolS *);

/* Build the ECOFF debugging information.  This should be called by
   obj_frob_file.  This fills in the counts in *HDR; the offsets are
   filled in relative to the start of the *BUFP.  It sets *BUFP to a
   block of memory holding the debugging information.  It returns the
   length of *BUFP.  */
extern unsigned long ecoff_build_debug
  (HDRR *hdr, char **bufp, const struct ecoff_debug_swap *);

/* Functions to handle the ECOFF debugging directives.  */
extern void ecoff_directive_begin (int);
extern void ecoff_directive_bend (int);
extern void ecoff_directive_end (int);
extern void ecoff_directive_ent (int);
extern void ecoff_directive_fmask (int);
extern void ecoff_directive_frame (int);
extern void ecoff_directive_loc (int);
extern void ecoff_directive_mask (int);

/* Other ECOFF directives.  */
extern void ecoff_directive_extern (int);
extern void ecoff_directive_weakext (int);

/* Functions to handle the COFF debugging directives.  */
extern void ecoff_directive_def (int);
extern void ecoff_directive_dim (int);
extern void ecoff_directive_endef (int);
extern void ecoff_directive_file (int);
extern void ecoff_directive_scl (int);
extern void ecoff_directive_size (int);
extern void ecoff_directive_tag (int);
extern void ecoff_directive_type (int);
extern void ecoff_directive_val (int);

/* Handle stabs.  */
extern void ecoff_stab (int what, const char *string,
			int type, int other, int desc);

/* Set the GP prologue size.  */
extern void ecoff_set_gp_prolog_size (int sz);

/* This routine is called from the ECOFF code to set the external
   information for a symbol.  */
#ifndef obj_ecoff_set_ext
extern void obj_ecoff_set_ext (symbolS *, EXTR *);
#endif

/* This routine is used to patch up a line number directive when
   instructions are moved around.  */
extern void ecoff_fix_loc (fragS *, unsigned long);

/* This function is called from read.c to peek at cur_file_ptr.  */
extern int ecoff_no_current_file (void);

/* This function returns the symbol associated with the current proc.  */
extern symbolS *ecoff_get_cur_proc_sym (void);

#endif /* ECOFF_DEBUGGING */

/* This routine is called from read.c to generate line number for .s file.  */
extern void ecoff_generate_asm_lineno (void);

#endif /* ! GAS_ECOFF_H */
