/* Abstraction of various C++ ABI's we support, and the info we need
   to get from them.

   Contributed by Daniel Berlin <dberlin@redhat.com>

   Copyright (C) 2001-2020 Free Software Foundation, Inc.

   This file is part of GDB.

   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/>.  */

#ifndef CP_ABI_H
#define CP_ABI_H

struct fn_field;
struct type;
struct value;
struct ui_file;
struct frame_info;

/* The functions here that attempt to determine what sort of thing a
   mangled name refers to may well be revised in the future.  It would
   certainly be cleaner to carry this information explicitly in GDB's
   data structures than to derive it from the mangled name.  */


/* Kinds of constructors.  All these values are guaranteed to be
   non-zero.  */
enum ctor_kinds {

  /* Initialize a complete object, including virtual bases, using
     memory provided by caller.  */
  complete_object_ctor = 1,

  /* Initialize a base object of some larger object.  */
  base_object_ctor,

  /* An allocating complete-object constructor.  */
  complete_object_allocating_ctor
};

/* Return non-zero iff NAME is the mangled name of a constructor.
   Actually, return an `enum ctor_kind' value describing what *kind*
   of constructor it is.  */
extern enum ctor_kinds is_constructor_name (const char *name);


/* Kinds of destructors.  All these values are guaranteed to be
   non-zero.  */
enum dtor_kinds {

  /* A destructor which finalizes the entire object, and then calls
     `delete' on its storage.  */
  deleting_dtor = 1,

  /* A destructor which finalizes the entire object, but does not call
     `delete'.  */
  complete_object_dtor,

  /* A destructor which finalizes a subobject of some larger
     object.  */
  base_object_dtor
};
  
/* Return non-zero iff NAME is the mangled name of a destructor.
   Actually, return an `enum dtor_kind' value describing what *kind*
   of destructor it is.  */
extern enum dtor_kinds is_destructor_name (const char *name);


/* Return non-zero iff NAME is the mangled name of a vtable.  */
extern int is_vtable_name (const char *name);


/* Return non-zero iff NAME is the un-mangled name of an operator,
   perhaps scoped within some class.  */
extern int is_operator_name (const char *name);


/* Return an object's virtual function as a value.

   VALUEP is a pointer to a pointer to a value, holding the object
   whose virtual function we want to invoke.  If the ABI requires a
   virtual function's caller to adjust the `this' pointer by an amount
   retrieved from the vtable before invoking the function (i.e., we're
   not using "vtable thunks" to do the adjustment automatically), then
   this function may set *VALUEP to point to a new object with an
   appropriately tweaked address.

   The J'th element of the overload set F is the virtual function of
   *VALUEP we want to invoke.

   TYPE is the base type of *VALUEP whose method we're invoking ---
   this is the type containing F.  OFFSET is the offset of that base
   type within *VALUEP.  */
extern struct value *value_virtual_fn_field (struct value **valuep,
					     struct fn_field *f,
					     int j,
					     struct type *type,
					     int offset);


/* Try to find the run-time type of VALUE, using C++ run-time type
   information.  Return the run-time type, or zero if we can't figure
   it out.

   If we do find the run-time type:
   - Set *FULL to non-zero if VALUE already contains the complete
     run-time object, not just some embedded base class of the object.
   - Set *TOP and *USING_ENC to indicate where the enclosing object
     starts relative to VALUE:
     - If *USING_ENC is zero, then *TOP is the offset from the start
       of the complete object to the start of the embedded subobject
       VALUE represents.  In other words, the enclosing object starts
       at VALUE_ADDR (VALUE) + VALUE_OFFSET (VALUE) +
       value_embedded_offset (VALUE) + *TOP
     - If *USING_ENC is non-zero, then *TOP is the offset from the
       address of the complete object to the enclosing object stored
       in VALUE.  In other words, the enclosing object starts at
       VALUE_ADDR (VALUE) + VALUE_OFFSET (VALUE) + *TOP.
     If VALUE's type and enclosing type are the same, then these two
     cases are equivalent.

   FULL, TOP, and USING_ENC can each be zero, in which case we don't
   provide the corresponding piece of information.  */
extern struct type *value_rtti_type (struct value *value,
                                     int *full, LONGEST *top,
				     int *using_enc);

/* Compute the offset of the baseclass which is the INDEXth baseclass
   of class TYPE, for value at VALADDR (in host) at ADDRESS (in
   target), offset by EMBEDDED_OFFSET.  VALADDR points to the raw
   contents of VAL.  The result is the offset of the baseclass value
   relative to (the address of)(ARG) + OFFSET.  */

extern int baseclass_offset (struct type *type,
			     int index, const gdb_byte *valaddr,
			     LONGEST embedded_offset,
			     CORE_ADDR address,
			     const struct value *val);

/* Describe the target of a pointer to method.  CONTENTS is the byte
   pattern representing the pointer to method.  TYPE is the pointer to
   method type.  STREAM is the stream to print it to.  */
void cplus_print_method_ptr (const gdb_byte *contents,
			     struct type *type,
			     struct ui_file *stream);

/* Return the size of a pointer to member function of type
   TO_TYPE.  */
int cplus_method_ptr_size (struct type *to_type);

/* Return the method which should be called by applying METHOD_PTR to
   *THIS_P, and adjust *THIS_P if necessary.  */
struct value *cplus_method_ptr_to_value (struct value **this_p,
					 struct value *method_ptr);

/* Create the byte pattern in CONTENTS representing a pointer of type
   TYPE to member function at ADDRESS (if IS_VIRTUAL is 0) or with
   virtual table offset ADDRESS (if IS_VIRTUAL is 1).  This is the
   opposite of cplus_method_ptr_to_value.  */
void cplus_make_method_ptr (struct type *type, gdb_byte *CONTENTS,
			    CORE_ADDR address, int is_virtual);

/* Print the vtable for VALUE, if there is one.  If there is no
   vtable, print a message, but do not throw.  */

void cplus_print_vtable (struct value *value);

/* Implement 'typeid': find the type info for VALUE, if possible.  If
   the type info cannot be found, throw an exception.  */

extern struct value *cplus_typeid (struct value *value);

/* Return the type of 'typeid' for the current C++ ABI on the given
   architecture.  */

extern struct type *cplus_typeid_type (struct gdbarch *gdbarch);

/* Given a value which holds a pointer to a std::type_info, return the
   type which that type_info represents.  Throw an exception if the
   type cannot be found.  */

extern struct type *cplus_type_from_type_info (struct value *value);

/* Given a value which holds a pointer to a std::type_info, return the
   name of the type which that type_info represents.  Throw an
   exception if the type name cannot be found.  */

extern std::string cplus_typename_from_type_info (struct value *value);

/* Determine if we are currently in a C++ thunk.  If so, get the
   address of the routine we are thunking to and continue to there
   instead.  */

CORE_ADDR cplus_skip_trampoline (struct frame_info *frame,
				 CORE_ADDR stop_pc);

/* Return non-zero if an argument of type TYPE should be passed by
   reference instead of value.  */
extern int cp_pass_by_reference (struct type *type);

struct cp_abi_ops
{
  const char *shortname;
  const char *longname;
  const char *doc;

  /* ABI-specific implementations for the functions declared
     above.  */
  enum ctor_kinds (*is_constructor_name) (const char *name);
  enum dtor_kinds (*is_destructor_name) (const char *name);
  int (*is_vtable_name) (const char *name);
  int (*is_operator_name) (const char *name);
  struct value *(*virtual_fn_field) (struct value **arg1p,
				     struct fn_field * f,
				     int j, struct type * type,
				     int offset);
  struct type *(*rtti_type) (struct value *v, int *full,
			     LONGEST *top, int *using_enc);
  int (*baseclass_offset) (struct type *type, int index,
			   const bfd_byte *valaddr, LONGEST embedded_offset,
			   CORE_ADDR address, const struct value *val);
  void (*print_method_ptr) (const gdb_byte *contents,
			    struct type *type,
			    struct ui_file *stream);
  int (*method_ptr_size) (struct type *);
  void (*make_method_ptr) (struct type *, gdb_byte *,
			   CORE_ADDR, int);
  struct value * (*method_ptr_to_value) (struct value **,
					 struct value *);
  void (*print_vtable) (struct value *);
  struct value *(*get_typeid) (struct value *value);
  struct type *(*get_typeid_type) (struct gdbarch *gdbarch);
  struct type *(*get_type_from_type_info) (struct value *value);
  std::string (*get_typename_from_type_info) (struct value *value);
  CORE_ADDR (*skip_trampoline) (struct frame_info *, CORE_ADDR);
  int (*pass_by_reference) (struct type *type);
};


extern int register_cp_abi (struct cp_abi_ops *abi);
extern void set_cp_abi_as_auto_default (const char *short_name);

#endif /* CP_ABI_H */
