Blame include/gcc-cp-interface.h

Packit Service 72eb06
/* Interface between GCC C++ FE and GDB
Packit Service 72eb06
Packit Service 72eb06
   Copyright (C) 2014-2018 Free Software Foundation, Inc.
Packit Service 72eb06
Packit Service 72eb06
   This file is part of GCC.
Packit Service 72eb06
Packit Service 72eb06
   This program is free software; you can redistribute it and/or modify
Packit Service 72eb06
   it under the terms of the GNU General Public License as published by
Packit Service 72eb06
   the Free Software Foundation; either version 3 of the License, or
Packit Service 72eb06
   (at your option) any later version.
Packit Service 72eb06
Packit Service 72eb06
   This program is distributed in the hope that it will be useful,
Packit Service 72eb06
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 72eb06
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 72eb06
   GNU General Public License for more details.
Packit Service 72eb06
Packit Service 72eb06
   You should have received a copy of the GNU General Public License
Packit Service 72eb06
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit Service 72eb06
Packit Service 72eb06
#ifndef GCC_CP_INTERFACE_H
Packit Service 72eb06
#define GCC_CP_INTERFACE_H
Packit Service 72eb06
Packit Service 72eb06
#include "gcc-interface.h"
Packit Service 72eb06
Packit Service 72eb06
/* This header defines the interface to the GCC API.  It must be both
Packit Service 72eb06
   valid C and valid C++, because it is included by both programs.  */
Packit Service 72eb06
Packit Service 72eb06
#ifdef __cplusplus
Packit Service 72eb06
extern "C" {
Packit Service 72eb06
#endif
Packit Service 72eb06
Packit Service 72eb06
/* Forward declaration.  */
Packit Service 72eb06
Packit Service 72eb06
struct gcc_cp_context;
Packit Service 72eb06
Packit Service 72eb06
/*
Packit Service 72eb06
 * Definitions and declarations for the C++ front end.
Packit Service 72eb06
 */
Packit Service 72eb06
Packit Service 72eb06
/* Defined versions of the C++ front-end API.  */
Packit Service 72eb06
Packit Service 72eb06
enum gcc_cp_api_version
Packit Service 72eb06
{
Packit Service 72eb06
  GCC_CP_FE_VERSION_0 = 0
Packit Service 72eb06
};
Packit Service 72eb06
Packit Service 72eb06
/* Qualifiers.  */
Packit Service 72eb06
Packit Service 72eb06
enum gcc_cp_qualifiers
Packit Service 72eb06
{
Packit Service 72eb06
  GCC_CP_QUALIFIER_CONST = 1,
Packit Service 72eb06
  GCC_CP_QUALIFIER_VOLATILE = 2,
Packit Service 72eb06
  GCC_CP_QUALIFIER_RESTRICT = 4
Packit Service 72eb06
};
Packit Service 72eb06
Packit Service 72eb06
/* Ref qualifiers.  */
Packit Service 72eb06
Packit Service 72eb06
enum gcc_cp_ref_qualifiers {
Packit Service 72eb06
  GCC_CP_REF_QUAL_NONE = 0,
Packit Service 72eb06
  GCC_CP_REF_QUAL_LVALUE = 1,
Packit Service 72eb06
  GCC_CP_REF_QUAL_RVALUE = 2
Packit Service 72eb06
};
Packit Service 72eb06
Packit Service 72eb06
/* Opaque typedef for unbound class templates.  They are used for
Packit Service 72eb06
   template arguments, and defaults for template template
Packit Service 72eb06
   parameters.  */
Packit Service 72eb06
Packit Service 72eb06
typedef unsigned long long gcc_utempl;
Packit Service 72eb06
Packit Service 72eb06
/* Opaque typedef for expressions.  They are used for template
Packit Service 72eb06
   arguments, defaults for non-type template parameters, and defaults
Packit Service 72eb06
   for function arguments.  */
Packit Service 72eb06
Packit Service 72eb06
typedef unsigned long long gcc_expr;
Packit Service 72eb06
Packit Service 72eb06
typedef enum
Packit Service 72eb06
  { GCC_CP_TPARG_VALUE, GCC_CP_TPARG_CLASS,
Packit Service 72eb06
    GCC_CP_TPARG_TEMPL, GCC_CP_TPARG_PACK }
Packit Service 72eb06
gcc_cp_template_arg_kind;
Packit Service 72eb06
Packit Service 72eb06
typedef union
Packit Service 72eb06
{ gcc_expr value; gcc_type type; gcc_utempl templ; gcc_type pack; }
Packit Service 72eb06
gcc_cp_template_arg;
Packit Service 72eb06
Packit Service 72eb06
/* An array of template arguments.  */
Packit Service 72eb06
Packit Service 72eb06
struct gcc_cp_template_args
Packit Service 72eb06
{
Packit Service 72eb06
  /* Number of elements.  */
Packit Service 72eb06
Packit Service 72eb06
  int n_elements;
Packit Service 72eb06
Packit Service 72eb06
  /* kind[i] indicates what kind of template argument type[i] is.  */
Packit Service 72eb06
Packit Service 72eb06
  char /* gcc_cp_template_arg_kind */ *kinds;
Packit Service 72eb06
Packit Service 72eb06
  /* The template arguments.  */
Packit Service 72eb06
Packit Service 72eb06
  gcc_cp_template_arg *elements;
Packit Service 72eb06
};
Packit Service 72eb06
Packit Service 72eb06
/* An array of (default) function arguments.  */
Packit Service 72eb06
Packit Service 72eb06
struct gcc_cp_function_args
Packit Service 72eb06
{
Packit Service 72eb06
  /* Number of elements.  */
Packit Service 72eb06
Packit Service 72eb06
  int n_elements;
Packit Service 72eb06
Packit Service 72eb06
  /* The (default) values for each argument.  */
Packit Service 72eb06
Packit Service 72eb06
  gcc_expr *elements;
Packit Service 72eb06
};
Packit Service 72eb06
Packit Service 72eb06
/* This enumerates the kinds of decls that GDB can create.  */
Packit Service 72eb06
Packit Service 72eb06
enum gcc_cp_symbol_kind
Packit Service 72eb06
{
Packit Service 72eb06
  /* A function.  */
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_SYMBOL_FUNCTION,
Packit Service 72eb06
Packit Service 72eb06
  /* A variable.  */
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_SYMBOL_VARIABLE,
Packit Service 72eb06
Packit Service 72eb06
  /* A typedef, or an alias declaration (including template ones).  */
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_SYMBOL_TYPEDEF,
Packit Service 72eb06
Packit Service 72eb06
  /* A label.  */
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_SYMBOL_LABEL,
Packit Service 72eb06
Packit Service 72eb06
  /* A class, forward declared in build_decl (to be later defined in
Packit Service 72eb06
     start_class_definition), or, in a template parameter list scope,
Packit Service 72eb06
     a declaration of a template class, closing the parameter
Packit Service 72eb06
     list.  */
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_SYMBOL_CLASS,
Packit Service 72eb06
Packit Service 72eb06
  /* A union, forward declared in build_decl (to be later defined in
Packit Service 72eb06
     start_class_definition).  */
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_SYMBOL_UNION,
Packit Service 72eb06
Packit Service 72eb06
  /* An enumeration type being introduced with start_new_enum_type.  */
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_SYMBOL_ENUM,
Packit Service 72eb06
Packit Service 72eb06
  /* A nonstatic data member being introduced with new_field.  */
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_SYMBOL_FIELD,
Packit Service 72eb06
Packit Service 72eb06
  /* A base class in a gcc_vbase_array.  */
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_SYMBOL_BASECLASS,
Packit Service 72eb06
Packit Service 72eb06
  /* A using declaration in new_using_decl.  */
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_SYMBOL_USING,
Packit Service 72eb06
Packit Service 72eb06
  /* A (lambda) closure class type.  In many regards this is just like
Packit Service 72eb06
     a regular class, but it's not supposed to have base classes, some
Packit Service 72eb06
     of the member functions that are usually implicitly-defined are
Packit Service 72eb06
     deleted, and it should have an operator() member function that
Packit Service 72eb06
     holds the lambda body.  We can't instantiate objects of lambda
Packit Service 72eb06
     types from the snippet, but we can interact with them in such
Packit Service 72eb06
     ways as passing them to functions that take their types, and
Packit Service 72eb06
     calling their body.  */
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_SYMBOL_LAMBDA_CLOSURE,
Packit Service 72eb06
Packit Service 72eb06
  /* Marker to check that we haven't exceeded GCC_CP_SYMBOL_MASK.  */
Packit Service 72eb06
  GCC_CP_SYMBOL_END,
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_SYMBOL_MASK = 15,
Packit Service 72eb06
Packit Service 72eb06
  /* When defining a class member, at least one of the
Packit Service 72eb06
     GCC_CP_ACCESS_MASK bits must be set; when defining a namespace-
Packit Service 72eb06
     or union-scoped symbol, none of them must be set.  */
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_ACCESS_PRIVATE,
Packit Service 72eb06
  GCC_CP_ACCESS_PUBLIC = GCC_CP_ACCESS_PRIVATE << 1,
Packit Service 72eb06
  GCC_CP_ACCESS_MASK = (GCC_CP_ACCESS_PUBLIC
Packit Service 72eb06
			       | GCC_CP_ACCESS_PRIVATE),
Packit Service 72eb06
  GCC_CP_ACCESS_PROTECTED = GCC_CP_ACCESS_MASK,
Packit Service 72eb06
  GCC_CP_ACCESS_NONE = 0,
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_FLAG_BASE = GCC_CP_ACCESS_PRIVATE << 2,
Packit Service 72eb06
Packit Service 72eb06
  /* Flags to be used along with GCC_CP_SYMBOL_FUNCTION:  */
Packit Service 72eb06
Packit Service 72eb06
  /* This flag should be set for constructors, destructors and
Packit Service 72eb06
     operators.  */
Packit Service 72eb06
  GCC_CP_FLAG_SPECIAL_FUNCTION = GCC_CP_FLAG_BASE,
Packit Service 72eb06
Packit Service 72eb06
  /* We intentionally cannot express inline, constexpr, or virtual
Packit Service 72eb06
     override for functions.  We can't inline or constexpr-replace
Packit Service 72eb06
     without a source-level body.  The override keyword is only
Packit Service 72eb06
     meaningful within the definition of the containing class.  */
Packit Service 72eb06
Packit Service 72eb06
  /* This indicates a "virtual" member function, explicitly or
Packit Service 72eb06
     implicitly (due to a virtual function with the same name and
Packit Service 72eb06
     prototype in a base class) declared as such.  */
Packit Service 72eb06
  GCC_CP_FLAG_VIRTUAL_FUNCTION = GCC_CP_FLAG_BASE << 1,
Packit Service 72eb06
Packit Service 72eb06
  /* The following two flags should only be set when the flag above is
Packit Service 72eb06
     set.  */
Packit Service 72eb06
Packit Service 72eb06
  /* This indicates a pure virtual member function, i.e., one that is
Packit Service 72eb06
     declared with "= 0", even if a body is provided in the
Packit Service 72eb06
     definition.  */
Packit Service 72eb06
  GCC_CP_FLAG_PURE_VIRTUAL_FUNCTION = GCC_CP_FLAG_BASE << 2,
Packit Service 72eb06
Packit Service 72eb06
  /* This indicates a "final" virtual member function.  */
Packit Service 72eb06
  GCC_CP_FLAG_FINAL_VIRTUAL_FUNCTION = GCC_CP_FLAG_BASE << 3,
Packit Service 72eb06
Packit Service 72eb06
  /* This indicates a special member function should have its default
Packit Service 72eb06
     implementation.  This either means the function declaration
Packit Service 72eb06
     contains the "= default" tokens, or that the member function was
Packit Service 72eb06
     implicitly generated by the compiler, although the latter use is
Packit Service 72eb06
     discouraged: just let the compiler implicitly introduce it.
Packit Service 72eb06
Packit Service 72eb06
     A member function defaulted after its first declaration has
Packit Service 72eb06
     slightly different ABI implications from one implicitly generated
Packit Service 72eb06
     or explicitly defaulted at the declaration (and definition)
Packit Service 72eb06
     point.  To avoid silent (possibly harmless) violation of the one
Packit Service 72eb06
     definition rule, it is recommended that this flag not be used for
Packit Service 72eb06
     such functions, and that the address of the definition be
Packit Service 72eb06
     supplied instead.  */
Packit Service 72eb06
  GCC_CP_FLAG_DEFAULTED_FUNCTION = GCC_CP_FLAG_BASE << 4,
Packit Service 72eb06
Packit Service 72eb06
  /* This indicates a deleted member function, i.e., one that has been
Packit Service 72eb06
     defined as "= delete" at its declaration point, or one that has
Packit Service 72eb06
     been implicitly defined as deleted (with or without an explicit
Packit Service 72eb06
     "= default" definition).
Packit Service 72eb06
Packit Service 72eb06
     This should not be used for implicitly-declared member functions
Packit Service 72eb06
     that resolve to deleted definitions, as it may affect the
Packit Service 72eb06
     implicit declaration of other member functions.  */
Packit Service 72eb06
  GCC_CP_FLAG_DELETED_FUNCTION = GCC_CP_FLAG_BASE << 5,
Packit Service 72eb06
Packit Service 72eb06
  /* This indicates a constructor or type-conversion operator declared
Packit Service 72eb06
     as "explicit".  */
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_FLAG_EXPLICIT_FUNCTION = GCC_CP_FLAG_BASE << 6,
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_FLAG_END_FUNCTION,
Packit Service 72eb06
  GCC_CP_FLAG_MASK_FUNCTION = (((GCC_CP_FLAG_END_FUNCTION - 1) << 1)
Packit Service 72eb06
			       - GCC_CP_FLAG_BASE),
Packit Service 72eb06
Packit Service 72eb06
  /* Flags to be used along with GCC_CP_SYMBOL_VARIABLE:  */
Packit Service 72eb06
Packit Service 72eb06
  /* This indicates a variable declared as "constexpr".  */
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_FLAG_CONSTEXPR_VARIABLE = GCC_CP_FLAG_BASE,
Packit Service 72eb06
Packit Service 72eb06
  /* This indicates a variable declared as "thread_local".  ??? What
Packit Service 72eb06
     should the ADDRESS be?  */
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_FLAG_THREAD_LOCAL_VARIABLE = GCC_CP_FLAG_BASE << 1,
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_FLAG_END_VARIABLE,
Packit Service 72eb06
  GCC_CP_FLAG_MASK_VARIABLE = (((GCC_CP_FLAG_END_VARIABLE - 1) << 1)
Packit Service 72eb06
			       - GCC_CP_FLAG_BASE),
Packit Service 72eb06
Packit Service 72eb06
  /* Flags to be used when defining nonstatic data members of classes
Packit Service 72eb06
     with new_field.  */
Packit Service 72eb06
Packit Service 72eb06
  /* Use this when no flags are present.  */
Packit Service 72eb06
  GCC_CP_FLAG_FIELD_NOFLAG = 0,
Packit Service 72eb06
Packit Service 72eb06
  /* This indicates the field is declared as mutable.  */
Packit Service 72eb06
  GCC_CP_FLAG_FIELD_MUTABLE = GCC_CP_FLAG_BASE,
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_FLAG_END_FIELD,
Packit Service 72eb06
  GCC_CP_FLAG_MASK_FIELD = (((GCC_CP_FLAG_END_FIELD - 1) << 1)
Packit Service 72eb06
			    - GCC_CP_FLAG_BASE),
Packit Service 72eb06
Packit Service 72eb06
  /* Flags to be used when defining an enum with
Packit Service 72eb06
     start_new_enum_type.  */
Packit Service 72eb06
Packit Service 72eb06
  /* This indicates an enum type without any flags.  */
Packit Service 72eb06
  GCC_CP_FLAG_ENUM_NOFLAG = 0,
Packit Service 72eb06
Packit Service 72eb06
  /* This indicates a scoped enum type.  */
Packit Service 72eb06
  GCC_CP_FLAG_ENUM_SCOPED = GCC_CP_FLAG_BASE,
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_FLAG_END_ENUM,
Packit Service 72eb06
  GCC_CP_FLAG_MASK_ENUM = (((GCC_CP_FLAG_END_ENUM - 1) << 1)
Packit Service 72eb06
			       - GCC_CP_FLAG_BASE),
Packit Service 72eb06
Packit Service 72eb06
Packit Service 72eb06
  /* Flags to be used when introducing a class or a class template
Packit Service 72eb06
     with build_decl.  */
Packit Service 72eb06
Packit Service 72eb06
  /* This indicates an enum type without any flags.  */
Packit Service 72eb06
  GCC_CP_FLAG_CLASS_NOFLAG = 0,
Packit Service 72eb06
Packit Service 72eb06
  /* This indicates the class is actually a struct.  This has no
Packit Service 72eb06
     effect whatsoever on access control in this interface, since all
Packit Service 72eb06
     class members must have explicit access control bits set, but it
Packit Service 72eb06
     may affect error messages.  */
Packit Service 72eb06
  GCC_CP_FLAG_CLASS_IS_STRUCT = GCC_CP_FLAG_BASE,
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_FLAG_END_CLASS,
Packit Service 72eb06
  GCC_CP_FLAG_MASK_CLASS = (((GCC_CP_FLAG_END_CLASS - 1) << 1)
Packit Service 72eb06
			       - GCC_CP_FLAG_BASE),
Packit Service 72eb06
Packit Service 72eb06
Packit Service 72eb06
  /* Flags to be used when introducing a virtual base class in a
Packit Service 72eb06
     gcc_vbase_array.  */
Packit Service 72eb06
Packit Service 72eb06
  /* This indicates an enum type without any flags.  */
Packit Service 72eb06
  GCC_CP_FLAG_BASECLASS_NOFLAG = 0,
Packit Service 72eb06
Packit Service 72eb06
  /* This indicates the class is actually a struct.  This has no
Packit Service 72eb06
     effect whatsoever on access control in this interface, since all
Packit Service 72eb06
     class members must have explicit access control bits set, but it
Packit Service 72eb06
     may affect error messages.  */
Packit Service 72eb06
  GCC_CP_FLAG_BASECLASS_VIRTUAL = GCC_CP_FLAG_BASE,
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_FLAG_END_BASECLASS,
Packit Service 72eb06
  GCC_CP_FLAG_MASK_BASECLASS = (((GCC_CP_FLAG_END_BASECLASS - 1) << 1)
Packit Service 72eb06
				- GCC_CP_FLAG_BASE),
Packit Service 72eb06
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_FLAG_MASK = (GCC_CP_FLAG_MASK_FUNCTION
Packit Service 72eb06
		      | GCC_CP_FLAG_MASK_VARIABLE
Packit Service 72eb06
		      | GCC_CP_FLAG_MASK_FIELD
Packit Service 72eb06
		      | GCC_CP_FLAG_MASK_ENUM
Packit Service 72eb06
		      | GCC_CP_FLAG_MASK_CLASS
Packit Service 72eb06
		      | GCC_CP_FLAG_MASK_BASECLASS
Packit Service 72eb06
		      )
Packit Service 72eb06
};
Packit Service 72eb06
Packit Service 72eb06
Packit Service 72eb06
/* An array of types used for creating lists of base classes.  */
Packit Service 72eb06
Packit Service 72eb06
struct gcc_vbase_array
Packit Service 72eb06
{
Packit Service 72eb06
  /* Number of elements.  */
Packit Service 72eb06
Packit Service 72eb06
  int n_elements;
Packit Service 72eb06
Packit Service 72eb06
  /* The base classes.  */
Packit Service 72eb06
Packit Service 72eb06
  gcc_type *elements;
Packit Service 72eb06
Packit Service 72eb06
  /* Flags for each base class.  Used to indicate access control and
Packit Service 72eb06
     virtualness.  */
Packit Service 72eb06
Packit Service 72eb06
  enum gcc_cp_symbol_kind *flags;
Packit Service 72eb06
};
Packit Service 72eb06
Packit Service 72eb06
Packit Service 72eb06
/* This enumerates the types of symbols that GCC might request from
Packit Service 72eb06
   GDB.  */
Packit Service 72eb06
Packit Service 72eb06
enum gcc_cp_oracle_request
Packit Service 72eb06
{
Packit Service 72eb06
  /* An identifier in namespace scope -- type, variable, function,
Packit Service 72eb06
     namespace, template.  All namespace-scoped symbols with the
Packit Service 72eb06
     requested name, in any namespace (including the global
Packit Service 72eb06
     namespace), should be defined in response to this request.  */
Packit Service 72eb06
Packit Service 72eb06
  GCC_CP_ORACLE_IDENTIFIER
Packit Service 72eb06
};
Packit Service 72eb06
Packit Service 72eb06
/* The type of the function called by GCC to ask GDB for a symbol's
Packit Service 72eb06
   definition.  DATUM is an arbitrary value supplied when the oracle
Packit Service 72eb06
   function is registered.  CONTEXT is the GCC context in which the
Packit Service 72eb06
   request is being made.  REQUEST specifies what sort of symbol is
Packit Service 72eb06
   being requested, and IDENTIFIER is the name of the symbol.  */
Packit Service 72eb06
Packit Service 72eb06
typedef void gcc_cp_oracle_function (void *datum,
Packit Service 72eb06
				     struct gcc_cp_context *context,
Packit Service 72eb06
				     enum gcc_cp_oracle_request request,
Packit Service 72eb06
				     const char *identifier);
Packit Service 72eb06
Packit Service 72eb06
/* The type of the function called by GCC to ask GDB for a symbol's
Packit Service 72eb06
   address.  This should return 0 if the address is not known.  */
Packit Service 72eb06
Packit Service 72eb06
typedef gcc_address gcc_cp_symbol_address_function (void *datum,
Packit Service 72eb06
						    struct gcc_cp_context *ctxt,
Packit Service 72eb06
						    const char *identifier);
Packit Service 72eb06
Packit Service 72eb06
/* The type of the function called by GCC to ask GDB to enter or leave
Packit Service 72eb06
   the user expression scope.  */
Packit Service 72eb06
Packit Service 72eb06
typedef void gcc_cp_enter_leave_user_expr_scope_function (void *datum,
Packit Service 72eb06
							  struct gcc_cp_context
Packit Service 72eb06
							  *context);
Packit Service 72eb06
Packit Service 72eb06
/* The vtable used by the C front end.  */
Packit Service 72eb06
Packit Service 72eb06
struct gcc_cp_fe_vtable
Packit Service 72eb06
{
Packit Service 72eb06
  /* The version of the C interface.  The value is one of the
Packit Service 72eb06
     gcc_cp_api_version constants.  */
Packit Service 72eb06
Packit Service 72eb06
  unsigned int cp_version;
Packit Service 72eb06
Packit Service 72eb06
  /* Set the callbacks for this context.
Packit Service 72eb06
Packit Service 72eb06
     The binding oracle is called whenever the C++ parser needs to
Packit Service 72eb06
     look up a symbol.  This gives the caller a chance to lazily
Packit Service 72eb06
     instantiate symbols using other parts of the gcc_cp_fe_interface
Packit Service 72eb06
     API.  The symbol is looked up without a scope, and the oracle
Packit Service 72eb06
     must supply a definition for ALL namespace-scoped definitions
Packit Service 72eb06
     bound to the symbol.
Packit Service 72eb06
Packit Service 72eb06
     The address oracle is called whenever the C++ parser needs to
Packit Service 72eb06
     look up a symbol.  This may be called for symbols not provided by
Packit Service 72eb06
     the symbol oracle, such as built-in functions where GCC provides
Packit Service 72eb06
     the declaration; other internal symbols, such as those related
Packit Service 72eb06
     with thunks, rtti, and virtual tables are likely to be queried
Packit Service 72eb06
     through this interface too.  The identifier is a mangled symbol
Packit Service 72eb06
     name.
Packit Service 72eb06
Packit Service 72eb06
     DATUM is an arbitrary piece of data that is passed back verbatim
Packit Service 72eb06
     to the callbacks in requests.  */
Packit Service 72eb06
Packit Service 72eb06
  void (*set_callbacks) (struct gcc_cp_context *self,
Packit Service 72eb06
			 gcc_cp_oracle_function *binding_oracle,
Packit Service 72eb06
			 gcc_cp_symbol_address_function *address_oracle,
Packit Service 72eb06
			 gcc_cp_enter_leave_user_expr_scope_function *enter_scope,
Packit Service 72eb06
			 gcc_cp_enter_leave_user_expr_scope_function *leave_scope,
Packit Service 72eb06
			 void *datum);
Packit Service 72eb06
Packit Service 72eb06
#define GCC_METHOD0(R, N) \
Packit Service 72eb06
  R (*N) (struct gcc_cp_context *);
Packit Service 72eb06
#define GCC_METHOD1(R, N, A) \
Packit Service 72eb06
  R (*N) (struct gcc_cp_context *, A);
Packit Service 72eb06
#define GCC_METHOD2(R, N, A, B) \
Packit Service 72eb06
  R (*N) (struct gcc_cp_context *, A, B);
Packit Service 72eb06
#define GCC_METHOD3(R, N, A, B, C) \
Packit Service 72eb06
  R (*N) (struct gcc_cp_context *, A, B, C);
Packit Service 72eb06
#define GCC_METHOD4(R, N, A, B, C, D) \
Packit Service 72eb06
  R (*N) (struct gcc_cp_context *, A, B, C, D);
Packit Service 72eb06
#define GCC_METHOD5(R, N, A, B, C, D, E) \
Packit Service 72eb06
  R (*N) (struct gcc_cp_context *, A, B, C, D, E);
Packit Service 72eb06
#define GCC_METHOD7(R, N, A, B, C, D, E, F, G) \
Packit Service 72eb06
  R (*N) (struct gcc_cp_context *, A, B, C, D, E, F, G);
Packit Service 72eb06
Packit Service 72eb06
#include "gcc-cp-fe.def"
Packit Service 72eb06
Packit Service 72eb06
#undef GCC_METHOD0
Packit Service 72eb06
#undef GCC_METHOD1
Packit Service 72eb06
#undef GCC_METHOD2
Packit Service 72eb06
#undef GCC_METHOD3
Packit Service 72eb06
#undef GCC_METHOD4
Packit Service 72eb06
#undef GCC_METHOD5
Packit Service 72eb06
#undef GCC_METHOD7
Packit Service 72eb06
Packit Service 72eb06
};
Packit Service 72eb06
Packit Service 72eb06
/* The C front end object.  */
Packit Service 72eb06
Packit Service 72eb06
struct gcc_cp_context
Packit Service 72eb06
{
Packit Service 72eb06
  /* Base class.  */
Packit Service 72eb06
Packit Service 72eb06
  struct gcc_base_context base;
Packit Service 72eb06
Packit Service 72eb06
  /* Our vtable.  This is a separate field because this is simpler
Packit Service 72eb06
     than implementing a vtable inheritance scheme in C.  */
Packit Service 72eb06
Packit Service 72eb06
  const struct gcc_cp_fe_vtable *cp_ops;
Packit Service 72eb06
};
Packit Service 72eb06
Packit Service 72eb06
/* The name of the .so that the compiler builds.  We dlopen this
Packit Service 72eb06
   later.  */
Packit Service 72eb06
Packit Service 72eb06
#define GCC_CP_FE_LIBCC libcc1.so
Packit Service 72eb06
Packit Service 72eb06
/* The compiler exports a single initialization function.  This macro
Packit Service 72eb06
   holds its name as a symbol.  */
Packit Service 72eb06
Packit Service 72eb06
#define GCC_CP_FE_CONTEXT gcc_cp_fe_context
Packit Service 72eb06
Packit Service 72eb06
/* The type of the initialization function.  The caller passes in the
Packit Service 72eb06
   desired base version and desired C-specific version.  If the
Packit Service 72eb06
   request can be satisfied, a compatible gcc_context object will be
Packit Service 72eb06
   returned.  Otherwise, the function returns NULL.  */
Packit Service 72eb06
Packit Service 72eb06
typedef struct gcc_cp_context *gcc_cp_fe_context_function
Packit Service 72eb06
    (enum gcc_base_api_version,
Packit Service 72eb06
     enum gcc_cp_api_version);
Packit Service 72eb06
Packit Service 72eb06
#ifdef __cplusplus
Packit Service 72eb06
}
Packit Service 72eb06
#endif
Packit Service 72eb06
Packit Service 72eb06
#endif /* GCC_CP_INTERFACE_H */