/* Interface between GCC C FE and GDB  -*- c -*-

   Copyright (C) 2014-2016 Free Software Foundation, Inc.

   This file is part of GCC.

   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, see <http://www.gnu.org/licenses/>.  */



/* Create a new "decl" in GCC.  A decl is a declaration, basically a
   kind of symbol.

   NAME is the name of the new symbol.  SYM_KIND is the kind of
   symbol being requested.  SYM_TYPE is the new symbol's C type;
   except for labels, where this is not meaningful and should be
   zero.  If SUBSTITUTION_NAME is not NULL, then a reference to this
   decl in the source will later be substituted with a dereference
   of a variable of the given name.  Otherwise, for symbols having
   an address (e.g., functions), ADDRESS is the address.  FILENAME
   and LINE_NUMBER refer to the symbol's source location.  If this
   is not known, FILENAME can be NULL and LINE_NUMBER can be 0.
   This function returns the new decl.  */

GCC_METHOD7 (gcc_decl, build_decl,
	     const char *,	      /* Argument NAME.  */
	     enum gcc_c_symbol_kind,  /* Argument SYM_KIND.  */
	     gcc_type,		      /* Argument SYM_TYPE.  */
	     const char *,	      /* Argument SUBSTITUTION_NAME.  */
	     gcc_address,	      /* Argument ADDRESS.  */
	     const char *,	      /* Argument FILENAME.  */
	     unsigned int)	      /* Argument LINE_NUMBER.  */

/* Insert a GCC decl into the symbol table.  DECL is the decl to
   insert.  IS_GLOBAL is true if this is an outermost binding, and
   false if it is a possibly-shadowing binding.  */

GCC_METHOD2 (int /* bool */, bind,
	     gcc_decl,		   /* Argument DECL.  */
	     int /* bool */)       /* Argument IS_GLOBAL.  */

/* Insert a tagged type into the symbol table.  NAME is the tag name
   of the type and TAGGED_TYPE is the type itself.  TAGGED_TYPE must
   be either a struct, union, or enum type, as these are the only
   types that have tags.  FILENAME and LINE_NUMBER refer to the type's
   source location.  If this is not known, FILENAME can be NULL and
   LINE_NUMBER can be 0.  */

GCC_METHOD4 (int /* bool */, tagbind,
	     const char *,	      /* Argument NAME.  */
	     gcc_type,		      /* Argument TAGGED_TYPE.  */
	     const char *,	      /* Argument FILENAME.  */
	     unsigned int)	      /* Argument LINE_NUMBER.  */

/* Return the type of a pointer to a given base type.  */

GCC_METHOD1 (gcc_type, build_pointer_type,
	     gcc_type)			/* Argument BASE_TYPE.  */

/* Create a new 'struct' type.  Initially it has no fields.  */

GCC_METHOD0 (gcc_type, build_record_type)

/* Create a new 'union' type.  Initially it has no fields.  */

GCC_METHOD0 (gcc_type, build_union_type)

/* Add a field to a struct or union type.  FIELD_NAME is the field's
   name.  FIELD_TYPE is the type of the field.  BITSIZE and BITPOS
   indicate where in the struct the field occurs.  */

GCC_METHOD5 (int /* bool */, build_add_field,
	     gcc_type,			   /* Argument RECORD_OR_UNION_TYPE. */
	     const char *,		   /* Argument FIELD_NAME.  */
	     gcc_type,			   /* Argument FIELD_TYPE.  */
	     unsigned long,		   /* Argument BITSIZE.  */
	     unsigned long)		   /* Argument BITPOS.  */

/* After all the fields have been added to a struct or union, the
   struct or union type must be "finished".  This does some final
   cleanups in GCC.  */

GCC_METHOD2 (int /* bool */, finish_record_or_union,
	     gcc_type,			   /* Argument RECORD_OR_UNION_TYPE. */
	     unsigned long)		   /* Argument SIZE_IN_BYTES.  */

/* Create a new 'enum' type.  The new type initially has no
   associated constants.  */

GCC_METHOD1 (gcc_type, build_enum_type,
	     gcc_type)			    /* Argument UNDERLYING_INT_TYPE. */

/* Add a new constant to an enum type.  NAME is the constant's
   name and VALUE is its value.  */

GCC_METHOD3 (int /* bool */, build_add_enum_constant,
	     gcc_type,		       /* Argument ENUM_TYPE.  */
	     const char *,	       /* Argument NAME.  */
	     unsigned long)	       /* Argument VALUE.  */

/* After all the constants have been added to an enum, the type must
   be "finished".  This does some final cleanups in GCC.  */

GCC_METHOD1 (int /* bool */, finish_enum_type,
	     gcc_type)		       /* Argument ENUM_TYPE.  */

/* Create a new function type.  RETURN_TYPE is the type returned by
   the function, and ARGUMENT_TYPES is a vector, of length NARGS, of
   the argument types.  IS_VARARGS is true if the function is
   varargs.  */

GCC_METHOD3 (gcc_type, build_function_type,
	     gcc_type,			   /* Argument RETURN_TYPE.  */
	     const struct gcc_type_array *, /* Argument ARGUMENT_TYPES.  */
	     int /* bool */)               /* Argument IS_VARARGS.  */

/* Return an integer type with the given properties.  */

GCC_METHOD2 (gcc_type, int_type,
	     int /* bool */,               /* Argument IS_UNSIGNED.  */
	     unsigned long)                /* Argument SIZE_IN_BYTES.  */

/* Return a floating point type with the given properties.  */

GCC_METHOD1 (gcc_type, float_type,
	     unsigned long)			/* Argument SIZE_IN_BYTES.  */

/* Return the 'void' type.  */

GCC_METHOD0 (gcc_type, void_type)

/* Return the 'bool' type.  */

GCC_METHOD0 (gcc_type, bool_type)

/* Create a new array type.  If NUM_ELEMENTS is -1, then the array
   is assumed to have an unknown length.  */

GCC_METHOD2 (gcc_type, build_array_type,
	     gcc_type,			  /* Argument ELEMENT_TYPE.  */
	     int)			  /* Argument NUM_ELEMENTS.  */

/* Create a new variably-sized array type.  UPPER_BOUND_NAME is the
   name of a local variable that holds the upper bound of the array;
   it is one less than the array size.  */

GCC_METHOD2 (gcc_type, build_vla_array_type,
	     gcc_type,			  /* Argument ELEMENT_TYPE.  */
	     const char *)		  /* Argument UPPER_BOUND_NAME.  */

/* Return a qualified variant of a given base type.  QUALIFIERS says
   which qualifiers to use; it is composed of or'd together
   constants from 'enum gcc_qualifiers'.  */

GCC_METHOD2 (gcc_type, build_qualified_type,
	     gcc_type,			      /* Argument UNQUALIFIED_TYPE.  */
	     enum gcc_qualifiers)	      /* Argument QUALIFIERS.  */

/* Build a complex type given its element type.  */

GCC_METHOD1 (gcc_type, build_complex_type,
	     gcc_type)			  /* Argument ELEMENT_TYPE.  */

/* Build a vector type given its element type and number of
   elements.  */

GCC_METHOD2 (gcc_type, build_vector_type,
	     gcc_type,			  /* Argument ELEMENT_TYPE.  */
	     int)			  /* Argument NUM_ELEMENTS.  */

/* Build a constant.  NAME is the constant's name and VALUE is its
   value.  FILENAME and LINE_NUMBER refer to the type's source
   location.  If this is not known, FILENAME can be NULL and
   LINE_NUMBER can be 0.  */

GCC_METHOD5 (int /* bool */, build_constant,
	     gcc_type,		  /* Argument TYPE.  */
	     const char *,	  /* Argument NAME.  */
	     unsigned long,	  /* Argument VALUE.  */
	     const char *,	  /* Argument FILENAME.  */
	     unsigned int)	  /* Argument LINE_NUMBER.  */

/* Emit an error and return an error type object.  */

GCC_METHOD1 (gcc_type, error,
	     const char *)		 /* Argument MESSAGE.  */
