/* debug.h -- Describe generic debugging information.
   Copyright 1995, 1996 Free Software Foundation, Inc.
   Written by Ian Lance Taylor <ian@cygnus.com>.

   This file is part of GNU Binutils.

   This program 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 of the License, or
   (at your option) any later version.

   This program 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 this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.  */

#ifndef DEBUG_H
#define DEBUG_H

/* This header file describes a generic debugging information format.
   We may eventually have readers which convert different formats into
   this generic format, and writers which write it out.  The initial
   impetus for this was writing a convertor from stabs to HP IEEE-695
   debugging format.  */

/* Different kinds of types.  */

enum debug_type_kind
{
  /* Not used.  */
  DEBUG_KIND_ILLEGAL,
  /* Indirect via a pointer.  */
  DEBUG_KIND_INDIRECT,
  /* Void.  */
  DEBUG_KIND_VOID,
  /* Integer.  */
  DEBUG_KIND_INT,
  /* Floating point.  */
  DEBUG_KIND_FLOAT,
  /* Complex.  */
  DEBUG_KIND_COMPLEX,
  /* Boolean.  */
  DEBUG_KIND_BOOL,
  /* Struct.  */
  DEBUG_KIND_STRUCT,
  /* Union.  */
  DEBUG_KIND_UNION,
  /* Class.  */
  DEBUG_KIND_CLASS,
  /* Union class (can this really happen?).  */
  DEBUG_KIND_UNION_CLASS,
  /* Enumeration type.  */
  DEBUG_KIND_ENUM,
  /* Pointer.  */
  DEBUG_KIND_POINTER,
  /* Function.  */
  DEBUG_KIND_FUNCTION,
  /* Reference.  */
  DEBUG_KIND_REFERENCE,
  /* Range.  */
  DEBUG_KIND_RANGE,
  /* Array.  */
  DEBUG_KIND_ARRAY,
  /* Set.  */
  DEBUG_KIND_SET,
  /* Based pointer.  */
  DEBUG_KIND_OFFSET,
  /* Method.  */
  DEBUG_KIND_METHOD,
  /* Const qualified type.  */
  DEBUG_KIND_CONST,
  /* Volatile qualified type.  */
  DEBUG_KIND_VOLATILE,
  /* Named type.  */
  DEBUG_KIND_NAMED,
  /* Tagged type.  */
  DEBUG_KIND_TAGGED
};

/* Different kinds of variables.  */

enum debug_var_kind
{
  /* Not used.  */
  DEBUG_VAR_ILLEGAL,
  /* A global variable.  */
  DEBUG_GLOBAL,
  /* A static variable.  */
  DEBUG_STATIC,
  /* A local static variable.  */
  DEBUG_LOCAL_STATIC,
  /* A local variable.  */
  DEBUG_LOCAL,
  /* A register variable.  */
  DEBUG_REGISTER
};

/* Different kinds of function parameters.  */

enum debug_parm_kind
{
  /* Not used.  */
  DEBUG_PARM_ILLEGAL,
  /* A stack based parameter.  */
  DEBUG_PARM_STACK,
  /* A register parameter.  */
  DEBUG_PARM_REG,
  /* A stack based reference parameter.  */
  DEBUG_PARM_REFERENCE,
  /* A register reference parameter.  */
  DEBUG_PARM_REF_REG
};

/* Different kinds of visibility.  */

enum debug_visibility
{
  /* A public field (e.g., a field in a C struct).  */
  DEBUG_VISIBILITY_PUBLIC,
  /* A protected field.  */
  DEBUG_VISIBILITY_PROTECTED,
  /* A private field.  */
  DEBUG_VISIBILITY_PRIVATE,
  /* A field which should be ignored.  */
  DEBUG_VISIBILITY_IGNORE
};

/* A type.  */

typedef struct debug_type *debug_type;

#define DEBUG_TYPE_NULL ((debug_type) NULL)

/* A field in a struct or union.  */

typedef struct debug_field *debug_field;

#define DEBUG_FIELD_NULL ((debug_field) NULL)

/* A base class for an object.  */

typedef struct debug_baseclass *debug_baseclass;

#define DEBUG_BASECLASS_NULL ((debug_baseclass) NULL)

/* A method of an object.  */

typedef struct debug_method *debug_method;

#define DEBUG_METHOD_NULL ((debug_method) NULL)

/* The arguments to a method function of an object.  These indicate
   which method to run.  */

typedef struct debug_method_variant *debug_method_variant;

#define DEBUG_METHOD_VARIANT_NULL ((debug_method_variant) NULL)

/* This structure is passed to debug_write.  It holds function
   pointers that debug_write will call based on the accumulated
   debugging information.  */

struct debug_write_fns
{
  /* This is called at the start of each new compilation unit with the
     name of the main file in the new unit.  */
  boolean (*start_compilation_unit) PARAMS ((PTR, const char *));

  /* This is called at the start of each source file within a
     compilation unit, before outputting any global information for
     that file.  The argument is the name of the file.  */
  boolean (*start_source) PARAMS ((PTR, const char *));

  /* Each writer must keep a stack of types.  */

  /* Push an empty type onto the type stack.  This type can appear if
     there is a reference to a type which is never defined.  */
  boolean (*empty_type) PARAMS ((PTR));

  /* Push a void type onto the type stack.  */
  boolean (*void_type) PARAMS ((PTR));

  /* Push an integer type onto the type stack, given the size and
     whether it is unsigned.  */
  boolean (*int_type) PARAMS ((PTR, unsigned int, boolean));

  /* Push a floating type onto the type stack, given the size.  */
  boolean (*float_type) PARAMS ((PTR, unsigned int));

  /* Push a complex type onto the type stack, given the size.  */
  boolean (*complex_type) PARAMS ((PTR, unsigned int));

  /* Push a boolean type onto the type stack, given the size.  */
  boolean (*bool_type) PARAMS ((PTR, unsigned int));

  /* Push an enum type onto the type stack, given the tag, a NULL
     terminated array of names and the associated values.  If there is
     no tag, the tag argument will be NULL.  If this is an undefined
     enum, the names and values arguments will be NULL.  */
  boolean (*enum_type) PARAMS ((PTR, const char *, const char **,
				bfd_signed_vma *));

  /* Pop the top type on the type stack, and push a pointer to that
     type onto the type stack.  */
  boolean (*pointer_type) PARAMS ((PTR));

  /* Push a function type onto the type stack.  The second argument
     indicates the number of argument types that have been pushed onto
     the stack.  If the number of argument types is passed as -1, then
     the argument types of the function are unknown, and no types have
     been pushed onto the stack.  The third argument is true if the
     function takes a variable number of arguments.  The return type
     of the function is pushed onto the type stack below the argument
     types, if any.  */
  boolean (*function_type) PARAMS ((PTR, int, boolean));

  /* Pop the top type on the type stack, and push a reference to that
     type onto the type stack.  */
  boolean (*reference_type) PARAMS ((PTR));

  /* Pop the top type on the type stack, and push a range of that type
     with the given lower and upper bounds onto the type stack.  */
  boolean (*range_type) PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma));

  /* Push an array type onto the type stack.  The top type on the type
     stack is the range, and the next type on the type stack is the
     element type.  These should be popped before the array type is
     pushed.  The arguments are the lower bound, the upper bound, and
     whether the array is a string.  */
  boolean (*array_type) PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma,
				 boolean));

  /* Pop the top type on the type stack, and push a set of that type
     onto the type stack.  The argument indicates whether this set is
     a bitstring.  */
  boolean (*set_type) PARAMS ((PTR, boolean));

  /* Push an offset type onto the type stack.  The top type on the
     type stack is the target type, and the next type on the type
     stack is the base type.  These should be popped before the offset
     type is pushed.  */
  boolean (*offset_type) PARAMS ((PTR));

  /* Push a method type onto the type stack.  If the second argument
     is true, the top type on the stack is the class to which the
     method belongs; otherwise, the class must be determined by the
     class to which the method is attached.  The third argument is the
     number of argument types; these are pushed onto the type stack in
     reverse order (the first type popped is the last argument to the
     method).  A value of -1 for the third argument means that no
     argument information is available.  The fourth argument is true
     if the function takes a variable number of arguments.  The next
     type on the type stack below the domain and the argument types is
     the return type of the method.  All these types must be popped,
     and then the method type must be pushed.  */
  boolean (*method_type) PARAMS ((PTR, boolean, int, boolean));

  /* Pop the top type off the type stack, and push a const qualified
     version of that type onto the type stack.  */
  boolean (*const_type) PARAMS ((PTR));

  /* Pop the top type off the type stack, and push a volatile
     qualified version of that type onto the type stack.  */
  boolean (*volatile_type) PARAMS ((PTR));

  /* Start building a struct.  This is followed by calls to the
     struct_field function, and finished by a call to the
     end_struct_type function.  The second argument is the tag; this
     will be NULL if there isn't one.  If the second argument is NULL,
     the third argument is a constant identifying this struct for use
     with tag_type.  The fourth argument is true for a struct, false
     for a union.  The fifth argument is the size.  If this is an
     undefined struct or union, the size will be 0 and struct_field
     will not be called before end_struct_type is called.  */
  boolean (*start_struct_type) PARAMS ((PTR, const char *, unsigned int,
					boolean, unsigned int));

  /* Add a field to the struct type currently being built.  The type
     of the field should be popped off the type stack.  The arguments
     are the name, the bit position, the bit size (may be zero if the
     field is not packed), and the visibility.  */
  boolean (*struct_field) PARAMS ((PTR, const char *, bfd_vma, bfd_vma,
				   enum debug_visibility));

  /* Finish building a struct, and push it onto the type stack.  */
  boolean (*end_struct_type) PARAMS ((PTR));

  /* Start building a class.  This is followed by calls to several
     functions: struct_field, class_static_member, class_baseclass,
     class_start_method, class_method_variant,
     class_static_method_variant, and class_end_method.  The class is
     finished by a call to end_class_type.  The first five arguments
     are the same as for start_struct_type.  The sixth argument is
     true if there is a virtual function table; if there is, the
     seventh argument is true if the virtual function table can be
     found in the type itself, and is false if the type of the object
     holding the virtual function table should be popped from the type
     stack.  */
  boolean (*start_class_type) PARAMS ((PTR, const char *, unsigned int,
				       boolean, unsigned int, boolean,
				       boolean));

  /* Add a static member to the class currently being built.  The
     arguments are the field name, the physical name, and the
     visibility.  The type must be popped off the type stack.  */
  boolean (*class_static_member) PARAMS ((PTR, const char *, const char *,
					  enum debug_visibility));

  /* Add a baseclass to the class currently being built.  The type of
     the baseclass must be popped off the type stack.  The arguments
     are the bit position, whether the class is virtual, and the
     visibility.  */
  boolean (*class_baseclass) PARAMS ((PTR, bfd_vma, boolean,
				      enum debug_visibility));

  /* Start adding a method to the class currently being built.  This
     is followed by calls to class_method_variant and
     class_static_method_variant to describe different variants of the
     method which take different arguments.  The method is finished
     with a call to class_end_method.  The argument is the method
     name.  */
  boolean (*class_start_method) PARAMS ((PTR, const char *));

  /* Describe a variant to the class method currently being built.
     The type of the variant must be popped off the type stack.  The
     second argument is the physical name of the function.  The
     following arguments are the visibility, whether the variant is
     const, whether the variant is volatile, the offset in the virtual
     function table, and whether the context is on the type stack
     (below the variant type).  */
  boolean (*class_method_variant) PARAMS ((PTR, const char *,
					   enum debug_visibility,
					   boolean, boolean,
					   bfd_vma, boolean));

  /* Describe a static variant to the class method currently being
     built.  The arguments are the same as for class_method_variant,
     except that the last two arguments are omitted.  The type of the
     variant must be popped off the type stack.  */
  boolean (*class_static_method_variant) PARAMS ((PTR, const char *,
						  enum debug_visibility,
						  boolean, boolean));

  /* Finish describing a class method.  */
  boolean (*class_end_method) PARAMS ((PTR));

  /* Finish describing a class, and push it onto the type stack.  */
  boolean (*end_class_type) PARAMS ((PTR));

  /* Push a type on the stack which was given a name by an earlier
     call to typdef.  */
  boolean (*typedef_type) PARAMS ((PTR, const char *));

  /* Push a tagged type on the stack which was defined earlier.  If
     the second argument is not NULL, the type was defined by a call
     to tag.  If the second argument is NULL, the type was defined by
     a call to start_struct_type or start_class_type with a tag of
     NULL and the number of the third argument.  Either way, the
     fourth argument is the tag kind.  Note that this may be called
     for a struct (class) being defined, in between the call to
     start_struct_type (start_class_type) and the call to
     end_struct_type (end_class_type).  */
  boolean (*tag_type) PARAMS ((PTR, const char *, unsigned int,
			       enum debug_type_kind));

  /* Pop the type stack, and typedef it to the given name.  */
  boolean (*typdef) PARAMS ((PTR, const char *));

  /* Pop the type stack, and declare it as a tagged struct or union or
     enum or whatever.  The tag passed down here is redundant, since
     was also passed when enum_type, start_struct_type, or
     start_class_type was called.  */
  boolean (*tag) PARAMS ((PTR, const char *));

  /* This is called to record a named integer constant.  */
  boolean (*int_constant) PARAMS ((PTR, const char *, bfd_vma));

  /* This is called to record a named floating point constant.  */
  boolean (*float_constant) PARAMS ((PTR, const char *, double));

  /* This is called to record a typed integer constant.  The type is
     popped off the type stack.  */
  boolean (*typed_constant) PARAMS ((PTR, const char *, bfd_vma));

  /* This is called to record a variable.  The type is popped off the
     type stack.  */
  boolean (*variable) PARAMS ((PTR, const char *, enum debug_var_kind,
			       bfd_vma));

  /* Start writing out a function.  The return type must be popped off
     the stack.  The boolean is true if the function is global.  This
     is followed by calls to function_parameter, followed by block
     information.  */
  boolean (*start_function) PARAMS ((PTR, const char *, boolean));

  /* Record a function parameter for the current function.  The type
     must be popped off the stack.  */
  boolean (*function_parameter) PARAMS ((PTR, const char *,
					 enum debug_parm_kind, bfd_vma));

  /* Start writing out a block.  There is at least one top level block
     per function.  Blocks may be nested.  The argument is the
     starting address of the block.  */
  boolean (*start_block) PARAMS ((PTR, bfd_vma));

  /* Finish writing out a block.  The argument is the ending address
     of the block.  */
  boolean (*end_block) PARAMS ((PTR, bfd_vma));

  /* Finish writing out a function.  */
  boolean (*end_function) PARAMS ((PTR));

  /* Record line number information for the current compilation unit.  */
  boolean (*lineno) PARAMS ((PTR, const char *, unsigned long, bfd_vma));
};

/* Exported functions.  */

/* The first argument to most of these functions is a handle.  This
   handle is returned by the debug_init function.  The purpose of the
   handle is to permit the debugging routines to not use static
   variables, and hence to be reentrant.  This would be useful for a
   program which wanted to handle two executables simultaneously.  */

/* Return a debugging handle.  */

extern PTR debug_init PARAMS ((void));

/* Set the source filename.  This implicitly starts a new compilation
   unit.  */

extern boolean debug_set_filename PARAMS ((PTR, const char *));

/* Change source files to the given file name.  This is used for
   include files in a single compilation unit.  */

extern boolean debug_start_source PARAMS ((PTR, const char *));

/* Record a function definition.  This implicitly starts a function
   block.  The debug_type argument is the type of the return value.
   The boolean indicates whether the function is globally visible.
   The bfd_vma is the address of the start of the function.  Currently
   the parameter types are specified by calls to
   debug_record_parameter.  */

extern boolean debug_record_function
  PARAMS ((PTR, const char *, debug_type, boolean, bfd_vma));

/* Record a parameter for the current function.  */

extern boolean debug_record_parameter
  PARAMS ((PTR, const char *, debug_type, enum debug_parm_kind, bfd_vma));

/* End a function definition.  The argument is the address where the
   function ends.  */

extern boolean debug_end_function PARAMS ((PTR, bfd_vma));

/* Start a block in a function.  All local information will be
   recorded in this block, until the matching call to debug_end_block.
   debug_start_block and debug_end_block may be nested.  The argument
   is the address at which this block starts.  */

extern boolean debug_start_block PARAMS ((PTR, bfd_vma));

/* Finish a block in a function.  This matches the call to
   debug_start_block.  The argument is the address at which this block
   ends.  */

extern boolean debug_end_block PARAMS ((PTR, bfd_vma));

/* Associate a line number in the current source file with a given
   address.  */

extern boolean debug_record_line PARAMS ((PTR, unsigned long, bfd_vma));

/* Start a named common block.  This is a block of variables that may
   move in memory.  */

extern boolean debug_start_common_block PARAMS ((PTR, const char *));

/* End a named common block.  */

extern boolean debug_end_common_block PARAMS ((PTR, const char *));

/* Record a named integer constant.  */

extern boolean debug_record_int_const PARAMS ((PTR, const char *, bfd_vma));

/* Record a named floating point constant.  */

extern boolean debug_record_float_const PARAMS ((PTR, const char *, double));

/* Record a typed constant with an integral value.  */

extern boolean debug_record_typed_const
  PARAMS ((PTR, const char *, debug_type, bfd_vma));

/* Record a label.  */

extern boolean debug_record_label
  PARAMS ((PTR, const char *, debug_type, bfd_vma));

/* Record a variable.  */

extern boolean debug_record_variable
  PARAMS ((PTR, const char *, debug_type, enum debug_var_kind, bfd_vma));

/* Make an indirect type.  The first argument is a pointer to the
   location where the real type will be placed.  The second argument
   is the type tag, if there is one; this may be NULL; the only
   purpose of this argument is so that debug_get_type_name can return
   something useful.  This function may be used when a type is
   referenced before it is defined.  */

extern debug_type debug_make_indirect_type
  PARAMS ((PTR, debug_type *, const char *));

/* Make a void type.  */

extern debug_type debug_make_void_type PARAMS ((PTR));

/* Make an integer type of a given size.  The boolean argument is true
   if the integer is unsigned.  */

extern debug_type debug_make_int_type PARAMS ((PTR, unsigned int, boolean));

/* Make a floating point type of a given size.  FIXME: On some
   platforms, like an Alpha, you probably need to be able to specify
   the format.  */

extern debug_type debug_make_float_type PARAMS ((PTR, unsigned int));

/* Make a boolean type of a given size.  */

extern debug_type debug_make_bool_type PARAMS ((PTR, unsigned int));

/* Make a complex type of a given size.  */

extern debug_type debug_make_complex_type PARAMS ((PTR, unsigned int));

/* Make a structure type.  The second argument is true for a struct,
   false for a union.  The third argument is the size of the struct.
   The fourth argument is a NULL terminated array of fields.  */

extern debug_type debug_make_struct_type
  PARAMS ((PTR, boolean, bfd_vma, debug_field *));

/* Make an object type.  The first three arguments after the handle
   are the same as for debug_make_struct_type.  The next arguments are
   a NULL terminated array of base classes, a NULL terminated array of
   methods, the type of the object holding the virtual function table
   if it is not this object, and a boolean which is true if this
   object has its own virtual function table.  */

extern debug_type debug_make_object_type
  PARAMS ((PTR, boolean, bfd_vma, debug_field *, debug_baseclass *,
	   debug_method *, debug_type, boolean));

/* Make an enumeration type.  The arguments are a null terminated
   array of strings, and an array of corresponding values.  */

extern debug_type debug_make_enum_type
  PARAMS ((PTR, const char **, bfd_signed_vma *));

/* Make a pointer to a given type.  */

extern debug_type debug_make_pointer_type
  PARAMS ((PTR, debug_type));

/* Make a function type.  The second argument is the return type.  The
   third argument is a NULL terminated array of argument types.  The
   fourth argument is true if the function takes a variable number of
   arguments.  If the third argument is NULL, then the argument types
   are unknown.  */

extern debug_type debug_make_function_type
  PARAMS ((PTR, debug_type, debug_type *, boolean));

/* Make a reference to a given type.  */

extern debug_type debug_make_reference_type PARAMS ((PTR, debug_type));

/* Make a range of a given type from a lower to an upper bound.  */

extern debug_type debug_make_range_type
  PARAMS ((PTR, debug_type, bfd_signed_vma, bfd_signed_vma));

/* Make an array type.  The second argument is the type of an element
   of the array.  The third argument is the type of a range of the
   array.  The fourth and fifth argument are the lower and upper
   bounds, respectively (if the bounds are not known, lower should be
   0 and upper should be -1).  The sixth argument is true if this
   array is actually a string, as in C.  */

extern debug_type debug_make_array_type
  PARAMS ((PTR, debug_type, debug_type, bfd_signed_vma, bfd_signed_vma,
	   boolean));

/* Make a set of a given type.  For example, a Pascal set type.  The
   boolean argument is true if this set is actually a bitstring, as in
   CHILL.  */

extern debug_type debug_make_set_type PARAMS ((PTR, debug_type, boolean));

/* Make a type for a pointer which is relative to an object.  The
   second argument is the type of the object to which the pointer is
   relative.  The third argument is the type that the pointer points
   to.  */

extern debug_type debug_make_offset_type
  PARAMS ((PTR, debug_type, debug_type));

/* Make a type for a method function.  The second argument is the
   return type.  The third argument is the domain.  The fourth
   argument is a NULL terminated array of argument types.  The fifth
   argument is true if the function takes a variable number of
   arguments, in which case the array of argument types indicates the
   types of the first arguments.  The domain and the argument array
   may be NULL, in which case this is a stub method and that
   information is not available.  Stabs debugging uses this, and gets
   the argument types from the mangled name.  */

extern debug_type debug_make_method_type
  PARAMS ((PTR, debug_type, debug_type, debug_type *, boolean));

/* Make a const qualified version of a given type.  */

extern debug_type debug_make_const_type PARAMS ((PTR, debug_type));

/* Make a volatile qualified version of a given type.  */

extern debug_type debug_make_volatile_type PARAMS ((PTR, debug_type));

/* Make an undefined tagged type.  For example, a struct which has
   been mentioned, but not defined.  */

extern debug_type debug_make_undefined_tagged_type
  PARAMS ((PTR, const char *, enum debug_type_kind));

/* Make a base class for an object.  The second argument is the base
   class type.  The third argument is the bit position of this base
   class in the object.  The fourth argument is whether this is a
   virtual class.  The fifth argument is the visibility of the base
   class.  */

extern debug_baseclass debug_make_baseclass
  PARAMS ((PTR, debug_type, bfd_vma, boolean, enum debug_visibility));

/* Make a field for a struct.  The second argument is the name.  The
   third argument is the type of the field.  The fourth argument is
   the bit position of the field.  The fifth argument is the size of
   the field (it may be zero).  The sixth argument is the visibility
   of the field.  */

extern debug_field debug_make_field
  PARAMS ((PTR, const char *, debug_type, bfd_vma, bfd_vma,
	   enum debug_visibility));

/* Make a static member of an object.  The second argument is the
   name.  The third argument is the type of the member.  The fourth
   argument is the physical name of the member (i.e., the name as a
   global variable).  The fifth argument is the visibility of the
   member.  */

extern debug_field debug_make_static_member
  PARAMS ((PTR, const char *, debug_type, const char *,
	   enum debug_visibility));

/* Make a method.  The second argument is the name, and the third
   argument is a NULL terminated array of method variants.  Each
   method variant is a method with this name but with different
   argument types.  */

extern debug_method debug_make_method
  PARAMS ((PTR, const char *, debug_method_variant *));

/* Make a method variant.  The second argument is the physical name of
   the function.  The third argument is the type of the function,
   probably constructed by debug_make_method_type.  The fourth
   argument is the visibility.  The fifth argument is whether this is
   a const function.  The sixth argument is whether this is a volatile
   function.  The seventh argument is the index in the virtual
   function table, if any.  The eighth argument is the virtual
   function context.  */

extern debug_method_variant debug_make_method_variant
  PARAMS ((PTR, const char *, debug_type, enum debug_visibility, boolean,
	   boolean, bfd_vma, debug_type));

/* Make a static method argument.  The arguments are the same as for
   debug_make_method_variant, except that the last two are omitted
   since a static method can not also be virtual.  */

extern debug_method_variant debug_make_static_method_variant
  PARAMS ((PTR, const char *, debug_type, enum debug_visibility, boolean,
	   boolean));

/* Name a type.  This returns a new type with an attached name.  */

extern debug_type debug_name_type PARAMS ((PTR, const char *, debug_type));

/* Give a tag to a type, such as a struct or union.  This returns a
   new type with an attached tag.  */

extern debug_type debug_tag_type PARAMS ((PTR, const char *, debug_type));

/* Record the size of a given type.  */

extern boolean debug_record_type_size PARAMS ((PTR, debug_type, unsigned int));

/* Find a named type.  */

extern debug_type debug_find_named_type PARAMS ((PTR, const char *));

/* Find a tagged type.  */

extern debug_type debug_find_tagged_type
  PARAMS ((PTR, const char *, enum debug_type_kind));

/* Get the kind of a type.  */

extern enum debug_type_kind debug_get_type_kind PARAMS ((PTR, debug_type));

/* Get the name of a type.  */

extern const char *debug_get_type_name PARAMS ((PTR, debug_type));

/* Get the size of a type.  */

extern bfd_vma debug_get_type_size PARAMS ((PTR, debug_type));

/* Get the return type of a function or method type.  */

extern debug_type debug_get_return_type PARAMS ((PTR, debug_type));

/* Get the NULL terminated array of parameter types for a function or
   method type (actually, parameter types are not currently stored for
   function types).  This may be used to determine whether a method
   type is a stub method or not.  The last argument points to a
   boolean which is set to true if the function takes a variable
   number of arguments.  */

extern const debug_type *debug_get_parameter_types PARAMS ((PTR,
							    debug_type,
							    boolean *));

/* Get the target type of a pointer or reference or const or volatile
   type.  */

extern debug_type debug_get_target_type PARAMS ((PTR, debug_type));

/* Get the NULL terminated array of fields for a struct, union, or
   class.  */

extern const debug_field *debug_get_fields PARAMS ((PTR, debug_type));

/* Get the type of a field.  */

extern debug_type debug_get_field_type PARAMS ((PTR, debug_field));

/* Get the name of a field.  */

extern const char *debug_get_field_name PARAMS ((PTR, debug_field));

/* Get the bit position of a field within the containing structure.
   If the field is a static member, this will return (bfd_vma) -1.  */

extern bfd_vma debug_get_field_bitpos PARAMS ((PTR, debug_field));

/* Get the bit size of a field.  If the field is a static member, this
   will return (bfd_vma) -1.  */

extern bfd_vma debug_get_field_bitsize PARAMS ((PTR, debug_field));

/* Get the visibility of a field.  */

extern enum debug_visibility debug_get_field_visibility
  PARAMS ((PTR, debug_field));

/* Get the physical name of a field, if it is a static member.  If the
   field is not a static member, this will return NULL.  */

extern const char *debug_get_field_physname PARAMS ((PTR, debug_field));

/* Write out the recorded debugging information.  This takes a set of
   function pointers which are called to do the actual writing.  The
   first PTR is the debugging handle.  The second PTR is a handle
   which is passed to the functions.  */

extern boolean debug_write PARAMS ((PTR, const struct debug_write_fns *, PTR));

#endif /* DEBUG_H */
