Blame include/gcc-cp-interface.h

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