/* ecoff.h -- header file for ECOFF debugging support
   Copyright 1993, 1994, 1995, 1996, 1997, 1998
   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 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, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, 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 PARAMS ((void));

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

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

/* This function should be called by the obj_frob_symbol hook.  */
extern void ecoff_frob_symbol PARAMS ((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
  PARAMS ((HDRR *hdr, char **bufp, const struct ecoff_debug_swap *));

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

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

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

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

/* Set the GP prologue size.  */
extern void ecoff_set_gp_prolog_size PARAMS ((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 PARAMS ((symbolS *, EXTR *));
#endif

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

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

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

#endif /* ECOFF_DEBUGGING */

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

#endif /* ! GAS_ECOFF_H */
