/* debug.h -- Describe generic debugging information.
   Copyright 1995, 1996, 2002, 2003, 2007 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 3 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., 51 Franklin Street - Fifth Floor, Boston, MA
   02110-1301, 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 converter 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.  */
  bfd_boolean (*start_compilation_unit) (void *, 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.  */
  bfd_boolean (*start_source) (void *, 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.  */
  bfd_boolean (*empty_type) (void *);

  /* Push a void type onto the type stack.  */
  bfd_boolean (*void_type) (void *);

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

  /* Push a floating type onto the type stack, given the size.  */
  bfd_boolean (*float_type) (void *, unsigned int);

  /* Push a complex type onto the type stack, given the size.  */
  bfd_boolean (*complex_type) (void *, unsigned int);

  /* Push a bfd_boolean type onto the type stack, given the size.  */
  bfd_boolean (*bool_type) (void *, 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.  */
  bfd_boolean (*enum_type)
    (void *, 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.  */
  bfd_boolean (*pointer_type) (void *);

  /* 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.  */
  bfd_boolean (*function_type) (void *, int, bfd_boolean);

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

  /* 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.  */
  bfd_boolean (*range_type) (void *, 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.  */
  bfd_boolean (*array_type)
    (void *, bfd_signed_vma, bfd_signed_vma, bfd_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.  */
  bfd_boolean (*set_type) (void *, bfd_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.  */
  bfd_boolean (*offset_type) (void *);

  /* 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.  */
  bfd_boolean (*method_type) (void *, bfd_boolean, int, bfd_boolean);

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

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

  /* 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.  */
  bfd_boolean (*start_struct_type)
    (void *, const char *, unsigned int, bfd_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.  */
  bfd_boolean (*struct_field)
    (void *, const char *, bfd_vma, bfd_vma, enum debug_visibility);

  /* Finish building a struct, and push it onto the type stack.  */
  bfd_boolean (*end_struct_type) (void *);

  /* 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.  */
  bfd_boolean (*start_class_type)
    (void *, const char *, unsigned int, bfd_boolean, unsigned int,
     bfd_boolean, bfd_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.  */
  bfd_boolean (*class_static_member)
    (void *, 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.  */
  bfd_boolean (*class_baseclass)
    (void *, bfd_vma, bfd_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.  */
  bfd_boolean (*class_start_method) (void *, 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).  */
  bfd_boolean (*class_method_variant)
    (void *, const char *, enum debug_visibility, bfd_boolean,
     bfd_boolean, bfd_vma, bfd_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.  */
  bfd_boolean (*class_static_method_variant)
    (void *, const char *, enum debug_visibility, bfd_boolean,
     bfd_boolean);

  /* Finish describing a class method.  */
  bfd_boolean (*class_end_method) (void *);

  /* Finish describing a class, and push it onto the type stack.  */
  bfd_boolean (*end_class_type) (void *);

  /* Push a type on the stack which was given a name by an earlier
     call to typdef.  */
  bfd_boolean (*typedef_type) (void *, 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).  */
  bfd_boolean (*tag_type)
    (void *, const char *, unsigned int, enum debug_type_kind);

  /* Pop the type stack, and typedef it to the given name.  */
  bfd_boolean (*typdef) (void *, 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.  */
  bfd_boolean (*tag) (void *, const char *);

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

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

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

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

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

  /* Record a function parameter for the current function.  The type
     must be popped off the stack.  */
  bfd_boolean (*function_parameter)
    (void *, 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.  */
  bfd_boolean (*start_block) (void *, bfd_vma);

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

  /* Finish writing out a function.  */
  bfd_boolean (*end_function) (void *);

  /* Record line number information for the current compilation unit.  */
  bfd_boolean (*lineno) (void *, 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 void *debug_init (void);

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

extern bfd_boolean debug_set_filename (void *, const char *);

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

extern bfd_boolean debug_start_source (void *, const char *);

/* Record a function definition.  This implicitly starts a function
   block.  The debug_type argument is the type of the return value.
   The bfd_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 bfd_boolean debug_record_function
  (void *, const char *, debug_type, bfd_boolean, bfd_vma);

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

extern bfd_boolean debug_record_parameter
  (void *, const char *, debug_type, enum debug_parm_kind, bfd_vma);

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

extern bfd_boolean debug_end_function (void *, 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 bfd_boolean debug_start_block (void *, 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 bfd_boolean debug_end_block (void *, bfd_vma);

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

extern bfd_boolean debug_record_line (void *, unsigned long, bfd_vma);

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

extern bfd_boolean debug_start_common_block (void *, const char *);

/* End a named common block.  */

extern bfd_boolean debug_end_common_block (void *, const char *);

/* Record a named integer constant.  */

extern bfd_boolean debug_record_int_const (void *, const char *, bfd_vma);

/* Record a named floating point constant.  */

extern bfd_boolean debug_record_float_const (void *, const char *, double);

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

extern bfd_boolean debug_record_typed_const
  (void *, const char *, debug_type, bfd_vma);

/* Record a label.  */

extern bfd_boolean debug_record_label
  (void *, const char *, debug_type, bfd_vma);

/* Record a variable.  */

extern bfd_boolean debug_record_variable
  (void *, 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
  (void *, debug_type *, const char *);

/* Make a void type.  */

extern debug_type debug_make_void_type (void *);

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

extern debug_type debug_make_int_type (void *, unsigned int, bfd_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 (void *, unsigned int);

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

extern debug_type debug_make_bool_type (void *, unsigned int);

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

extern debug_type debug_make_complex_type (void *, 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
  (void *, bfd_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 bfd_boolean which is TRUE if this
   object has its own virtual function table.  */

extern debug_type debug_make_object_type
  (void *, bfd_boolean, bfd_vma, debug_field *, debug_baseclass *,
   debug_method *, debug_type, bfd_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
  (void *, const char **, bfd_signed_vma *);

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

extern debug_type debug_make_pointer_type (void *, 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
  (void *, debug_type, debug_type *, bfd_boolean);

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

extern debug_type debug_make_reference_type (void *, debug_type);

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

extern debug_type debug_make_range_type
  (void *, 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
  (void *, debug_type, debug_type, bfd_signed_vma, bfd_signed_vma,
   bfd_boolean);

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

extern debug_type debug_make_set_type (void *, debug_type, bfd_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 (void *, 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
  (void *, debug_type, debug_type, debug_type *, bfd_boolean);

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

extern debug_type debug_make_const_type (void *, debug_type);

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

extern debug_type debug_make_volatile_type (void *, 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
  (void *, 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
  (void *, debug_type, bfd_vma, bfd_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
  (void *, 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
  (void *, 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
  (void *, 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
  (void *, const char *, debug_type, enum debug_visibility, bfd_boolean,
   bfd_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
  (void *, const char *, debug_type, enum debug_visibility, bfd_boolean,
   bfd_boolean);

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

extern debug_type debug_name_type (void *, 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 (void *, const char *, debug_type);

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

extern bfd_boolean debug_record_type_size (void *, debug_type, unsigned int);

/* Find a named type.  */

extern debug_type debug_find_named_type (void *, const char *);

/* Find a tagged type.  */

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

/* Get the kind of a type.  */

extern enum debug_type_kind debug_get_type_kind (void *, debug_type);

/* Get the name of a type.  */

extern const char *debug_get_type_name (void *, debug_type);

/* Get the size of a type.  */

extern bfd_vma debug_get_type_size (void *, debug_type);

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

extern debug_type debug_get_return_type (void *, 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
   bfd_boolean which is set to TRUE if the function takes a variable
   number of arguments.  */

extern const debug_type *debug_get_parameter_types
  (void *, debug_type, bfd_boolean *);

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

extern debug_type debug_get_target_type (void *, debug_type);

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

extern const debug_field *debug_get_fields (void *, debug_type);

/* Get the type of a field.  */

extern debug_type debug_get_field_type (void *, debug_field);

/* Get the name of a field.  */

extern const char *debug_get_field_name (void *, 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 (void *, 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 (void *, debug_field);

/* Get the visibility of a field.  */

extern enum debug_visibility debug_get_field_visibility (void *, 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 (void *, 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 void * is the debugging handle.  The second void * is a handle
   which is passed to the functions.  */

extern bfd_boolean debug_write
  (void *, const struct debug_write_fns *, void *);

#endif /* DEBUG_H */
