|  | /* debug.h -- Describe generic debugging information. | 
|  | Copyright (C) 1995-2025 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_s *debug_type; | 
|  |  | 
|  | #define DEBUG_TYPE_NULL ((debug_type) NULL) | 
|  |  | 
|  | /* A field in a struct or union.  */ | 
|  |  | 
|  | typedef struct debug_field_s *debug_field; | 
|  |  | 
|  | #define DEBUG_FIELD_NULL ((debug_field) NULL) | 
|  |  | 
|  | /* A base class for an object.  */ | 
|  |  | 
|  | typedef struct debug_baseclass_s *debug_baseclass; | 
|  |  | 
|  | #define DEBUG_BASECLASS_NULL ((debug_baseclass) NULL) | 
|  |  | 
|  | /* A method of an object.  */ | 
|  |  | 
|  | typedef struct debug_method_s *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_s *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.  */ | 
|  | bool (*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.  */ | 
|  | bool (*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.  */ | 
|  | bool (*empty_type) (void *); | 
|  |  | 
|  | /* Push a void type onto the type stack.  */ | 
|  | bool (*void_type) (void *); | 
|  |  | 
|  | /* Push an integer type onto the type stack, given the size and | 
|  | whether it is unsigned.  */ | 
|  | bool (*int_type) (void *, unsigned int, bool); | 
|  |  | 
|  | /* Push a floating type onto the type stack, given the size.  */ | 
|  | bool (*float_type) (void *, unsigned int); | 
|  |  | 
|  | /* Push a complex type onto the type stack, given the size.  */ | 
|  | bool (*complex_type) (void *, unsigned int); | 
|  |  | 
|  | /* Push a bool type onto the type stack, given the size.  */ | 
|  | bool (*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.  */ | 
|  | bool (*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.  */ | 
|  | bool (*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.  */ | 
|  | bool (*function_type) (void *, int, bool); | 
|  |  | 
|  | /* Pop the top type on the type stack, and push a reference to that | 
|  | type onto the type stack.  */ | 
|  | bool (*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.  */ | 
|  | bool (*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.  */ | 
|  | bool (*array_type) | 
|  | (void *, bfd_signed_vma, bfd_signed_vma, bool); | 
|  |  | 
|  | /* 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.  */ | 
|  | bool (*set_type) (void *, bool); | 
|  |  | 
|  | /* 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.  */ | 
|  | bool (*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.  */ | 
|  | bool (*method_type) (void *, bool, int, bool); | 
|  |  | 
|  | /* Pop the top type off the type stack, and push a const qualified | 
|  | version of that type onto the type stack.  */ | 
|  | bool (*const_type) (void *); | 
|  |  | 
|  | /* Pop the top type off the type stack, and push a volatile | 
|  | qualified version of that type onto the type stack.  */ | 
|  | bool (*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.  */ | 
|  | bool (*start_struct_type) | 
|  | (void *, const char *, unsigned int, bool, 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.  */ | 
|  | bool (*struct_field) | 
|  | (void *, const char *, bfd_vma, bfd_vma, enum debug_visibility); | 
|  |  | 
|  | /* Finish building a struct, and push it onto the type stack.  */ | 
|  | bool (*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.  */ | 
|  | bool (*start_class_type) | 
|  | (void *, const char *, unsigned int, bool, unsigned int, bool, bool); | 
|  |  | 
|  | /* 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.  */ | 
|  | bool (*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.  */ | 
|  | bool (*class_baseclass) | 
|  | (void *, bfd_vma, bool, 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.  */ | 
|  | bool (*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).  */ | 
|  | bool (*class_method_variant) | 
|  | (void *, const char *, enum debug_visibility, bool, bool, bfd_vma, bool); | 
|  |  | 
|  | /* 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.  */ | 
|  | bool (*class_static_method_variant) | 
|  | (void *, const char *, enum debug_visibility, bool, bool); | 
|  |  | 
|  | /* Finish describing a class method.  */ | 
|  | bool (*class_end_method) (void *); | 
|  |  | 
|  | /* Finish describing a class, and push it onto the type stack.  */ | 
|  | bool (*end_class_type) (void *); | 
|  |  | 
|  | /* Push a type on the stack which was given a name by an earlier | 
|  | call to typdef.  */ | 
|  | bool (*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).  */ | 
|  | bool (*tag_type) | 
|  | (void *, const char *, unsigned int, enum debug_type_kind); | 
|  |  | 
|  | /* Pop the type stack, and typedef it to the given name.  */ | 
|  | bool (*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.  */ | 
|  | bool (*tag) (void *, const char *); | 
|  |  | 
|  | /* This is called to record a named integer constant.  */ | 
|  | bool (*int_constant) (void *, const char *, bfd_vma); | 
|  |  | 
|  | /* This is called to record a named floating point constant.  */ | 
|  | bool (*float_constant) (void *, const char *, double); | 
|  |  | 
|  | /* This is called to record a typed integer constant.  The type is | 
|  | popped off the type stack.  */ | 
|  | bool (*typed_constant) (void *, const char *, bfd_vma); | 
|  |  | 
|  | /* This is called to record a variable.  The type is popped off the | 
|  | type stack.  */ | 
|  | bool (*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 bool is TRUE if the function is global.  This | 
|  | is followed by calls to function_parameter, followed by block | 
|  | information.  */ | 
|  | bool (*start_function) (void *, const char *, bool); | 
|  |  | 
|  | /* Record a function parameter for the current function.  The type | 
|  | must be popped off the stack.  */ | 
|  | bool (*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.  */ | 
|  | bool (*start_block) (void *, bfd_vma); | 
|  |  | 
|  | /* Finish writing out a block.  The argument is the ending address | 
|  | of the block.  */ | 
|  | bool (*end_block) (void *, bfd_vma); | 
|  |  | 
|  | /* Finish writing out a function.  */ | 
|  | bool (*end_function) (void *); | 
|  |  | 
|  | /* Record line number information for the current compilation unit.  */ | 
|  | bool (*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 (bfd *); | 
|  |  | 
|  | /* Allocate bytes on the debug handle objalloc memory pool.  */ | 
|  |  | 
|  | extern void *debug_xalloc (void *, size_t); | 
|  | extern void *debug_xzalloc (void *, size_t); | 
|  |  | 
|  | /* Set the source filename.  This implicitly starts a new compilation | 
|  | unit.  */ | 
|  |  | 
|  | extern bool 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 bool 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 bool 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 bool debug_record_function | 
|  | (void *, const char *, debug_type, bool, bfd_vma); | 
|  |  | 
|  | /* Record a parameter for the current function.  */ | 
|  |  | 
|  | extern bool 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 bool 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 bool 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 bool debug_end_block (void *, bfd_vma); | 
|  |  | 
|  | /* Associate a line number in the current source file with a given | 
|  | address.  */ | 
|  |  | 
|  | extern bool 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 bool debug_start_common_block (void *, const char *); | 
|  |  | 
|  | /* End a named common block.  */ | 
|  |  | 
|  | extern bool debug_end_common_block (void *, const char *); | 
|  |  | 
|  | /* Record a named integer constant.  */ | 
|  |  | 
|  | extern bool debug_record_int_const (void *, const char *, bfd_vma); | 
|  |  | 
|  | /* Record a named floating point constant.  */ | 
|  |  | 
|  | extern bool debug_record_float_const (void *, const char *, double); | 
|  |  | 
|  | /* Record a typed constant with an integral value.  */ | 
|  |  | 
|  | extern bool debug_record_typed_const | 
|  | (void *, const char *, debug_type, bfd_vma); | 
|  |  | 
|  | /* Record a label.  */ | 
|  |  | 
|  | extern bool debug_record_label | 
|  | (void *, const char *, debug_type, bfd_vma); | 
|  |  | 
|  | /* Record a variable.  */ | 
|  |  | 
|  | extern bool 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 bool argument is TRUE | 
|  | if the integer is unsigned.  */ | 
|  |  | 
|  | extern debug_type debug_make_int_type (void *, unsigned int, bool); | 
|  |  | 
|  | /* 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 *, bool, 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 bool which is TRUE if this | 
|  | object has its own virtual function table.  */ | 
|  |  | 
|  | extern debug_type debug_make_object_type | 
|  | (void *, bool, bfd_vma, debug_field *, debug_baseclass *, | 
|  | debug_method *, debug_type, bool); | 
|  |  | 
|  | /* 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 *, bool); | 
|  |  | 
|  | /* 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, | 
|  | bool); | 
|  |  | 
|  | /* Make a set of a given type.  For example, a Pascal set type.  The | 
|  | bool argument is TRUE if this set is actually a bitstring, as in | 
|  | CHILL.  */ | 
|  |  | 
|  | extern debug_type debug_make_set_type (void *, debug_type, bool); | 
|  |  | 
|  | /* 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 *, bool); | 
|  |  | 
|  | /* 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, bool, 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, bool, | 
|  | bool, 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, bool, | 
|  | bool); | 
|  |  | 
|  | /* 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 bool 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 | 
|  | bool 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, bool *); | 
|  |  | 
|  | /* 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 bool debug_write | 
|  | (void *, const struct debug_write_fns *, void *); | 
|  |  | 
|  | #endif /* DEBUG_H */ |