OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-7.1/] [gdb/] [cp-abi.h] - Diff between revs 834 and 842

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 834 Rev 842
/* Abstraction of various C++ ABI's we support, and the info we need
/* Abstraction of various C++ ABI's we support, and the info we need
   to get from them.
   to get from them.
 
 
   Contributed by Daniel Berlin <dberlin@redhat.com>
   Contributed by Daniel Berlin <dberlin@redhat.com>
 
 
   Copyright (C) 2001, 2005, 2006, 2007, 2008, 2009, 2010
   Copyright (C) 2001, 2005, 2006, 2007, 2008, 2009, 2010
   Free Software Foundation, Inc.
   Free Software Foundation, Inc.
 
 
   This file is part of GDB.
   This file is part of GDB.
 
 
   This program is free software; you can redistribute it and/or modify
   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
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 
#ifndef CP_ABI_H_
#ifndef CP_ABI_H_
#define CP_ABI_H_ 1
#define CP_ABI_H_ 1
 
 
struct fn_field;
struct fn_field;
struct type;
struct type;
struct value;
struct value;
struct ui_file;
struct ui_file;
struct frame_info;
struct frame_info;
 
 
/* The functions here that attempt to determine what sort of thing a
/* 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
   mangled name refers to may well be revised in the future.  It would
   certainly be cleaner to carry this information explicitly in GDB's
   certainly be cleaner to carry this information explicitly in GDB's
   data structures than to derive it from the mangled name.  */
   data structures than to derive it from the mangled name.  */
 
 
 
 
/* Kinds of constructors.  All these values are guaranteed to be
/* Kinds of constructors.  All these values are guaranteed to be
   non-zero.  */
   non-zero.  */
enum ctor_kinds {
enum ctor_kinds {
 
 
  /* Initialize a complete object, including virtual bases, using
  /* Initialize a complete object, including virtual bases, using
     memory provided by caller.  */
     memory provided by caller.  */
  complete_object_ctor = 1,
  complete_object_ctor = 1,
 
 
  /* Initialize a base object of some larger object.  */
  /* Initialize a base object of some larger object.  */
  base_object_ctor,
  base_object_ctor,
 
 
  /* An allocating complete-object constructor.  */
  /* An allocating complete-object constructor.  */
  complete_object_allocating_ctor
  complete_object_allocating_ctor
};
};
 
 
/* Return non-zero iff NAME is the mangled name of a constructor.
/* Return non-zero iff NAME is the mangled name of a constructor.
   Actually, return an `enum ctor_kind' value describing what *kind*
   Actually, return an `enum ctor_kind' value describing what *kind*
   of constructor it is.  */
   of constructor it is.  */
extern enum ctor_kinds is_constructor_name (const char *name);
extern enum ctor_kinds is_constructor_name (const char *name);
 
 
 
 
/* Kinds of destructors.  All these values are guaranteed to be
/* Kinds of destructors.  All these values are guaranteed to be
   non-zero.  */
   non-zero.  */
enum dtor_kinds {
enum dtor_kinds {
 
 
  /* A destructor which finalizes the entire object, and then calls
  /* A destructor which finalizes the entire object, and then calls
     `delete' on its storage.  */
     `delete' on its storage.  */
  deleting_dtor = 1,
  deleting_dtor = 1,
 
 
  /* A destructor which finalizes the entire object, but does not call
  /* A destructor which finalizes the entire object, but does not call
     `delete'.  */
     `delete'.  */
  complete_object_dtor,
  complete_object_dtor,
 
 
  /* A destructor which finalizes a subobject of some larger object.  */
  /* A destructor which finalizes a subobject of some larger object.  */
  base_object_dtor
  base_object_dtor
};
};
 
 
/* Return non-zero iff NAME is the mangled name of a destructor.
/* Return non-zero iff NAME is the mangled name of a destructor.
   Actually, return an `enum dtor_kind' value describing what *kind*
   Actually, return an `enum dtor_kind' value describing what *kind*
   of destructor it is.  */
   of destructor it is.  */
extern enum dtor_kinds is_destructor_name (const char *name);
extern enum dtor_kinds is_destructor_name (const char *name);
 
 
 
 
/* Return non-zero iff NAME is the mangled name of a vtable.  */
/* Return non-zero iff NAME is the mangled name of a vtable.  */
extern int is_vtable_name (const char *name);
extern int is_vtable_name (const char *name);
 
 
 
 
/* Return non-zero iff NAME is the un-mangled name of an operator,
/* Return non-zero iff NAME is the un-mangled name of an operator,
   perhaps scoped within some class.  */
   perhaps scoped within some class.  */
extern int is_operator_name (const char *name);
extern int is_operator_name (const char *name);
 
 
 
 
/* Return an object's virtual function as a value.
/* Return an object's virtual function as a value.
 
 
   VALUEP is a pointer to a pointer to a value, holding the object
   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
   whose virtual function we want to invoke.  If the ABI requires a
   virtual function's caller to adjust the `this' pointer by an amount
   virtual function's caller to adjust the `this' pointer by an amount
   retrieved from the vtable before invoking the function (i.e., we're
   retrieved from the vtable before invoking the function (i.e., we're
   not using "vtable thunks" to do the adjustment automatically), then
   not using "vtable thunks" to do the adjustment automatically), then
   this function may set *VALUEP to point to a new object with an
   this function may set *VALUEP to point to a new object with an
   appropriately tweaked address.
   appropriately tweaked address.
 
 
   The J'th element of the overload set F is the virtual function of
   The J'th element of the overload set F is the virtual function of
   *VALUEP we want to invoke.
   *VALUEP we want to invoke.
 
 
   TYPE is the base type of *VALUEP whose method we're invoking ---
   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
   this is the type containing F.  OFFSET is the offset of that base
   type within *VALUEP.  */
   type within *VALUEP.  */
extern struct value *value_virtual_fn_field (struct value **valuep,
extern struct value *value_virtual_fn_field (struct value **valuep,
                                             struct fn_field *f, int j,
                                             struct fn_field *f, int j,
                                             struct type *type, int offset);
                                             struct type *type, int offset);
 
 
 
 
/* Try to find the run-time type of VALUE, using C++ run-time type
/* 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
   information.  Return the run-time type, or zero if we can't figure
   it out.
   it out.
 
 
   If we do find the run-time type:
   If we do find the run-time type:
   - Set *FULL to non-zero if VALUE already contains the complete
   - Set *FULL to non-zero if VALUE already contains the complete
     run-time object, not just some embedded base class of the object.
     run-time object, not just some embedded base class of the object.
   - Set *TOP and *USING_ENC to indicate where the enclosing object
   - Set *TOP and *USING_ENC to indicate where the enclosing object
     starts relative to VALUE:
     starts relative to VALUE:
     - If *USING_ENC is zero, then *TOP is the offset from the start
     - If *USING_ENC is zero, then *TOP is the offset from the start
       of the complete object to the start of the embedded subobject
       of the complete object to the start of the embedded subobject
       VALUE represents.  In other words, the enclosing object starts
       VALUE represents.  In other words, the enclosing object starts
       at VALUE_ADDR (VALUE) + VALUE_OFFSET (VALUE) +
       at VALUE_ADDR (VALUE) + VALUE_OFFSET (VALUE) +
       value_embedded_offset (VALUE) + *TOP
       value_embedded_offset (VALUE) + *TOP
     - If *USING_ENC is non-zero, then *TOP is the offset from the
     - If *USING_ENC is non-zero, then *TOP is the offset from the
       address of the complete object to the enclosing object stored
       address of the complete object to the enclosing object stored
       in VALUE.  In other words, the enclosing object starts at
       in VALUE.  In other words, the enclosing object starts at
       VALUE_ADDR (VALUE) + VALUE_OFFSET (VALUE) + *TOP.
       VALUE_ADDR (VALUE) + VALUE_OFFSET (VALUE) + *TOP.
     If VALUE's type and enclosing type are the same, then these two
     If VALUE's type and enclosing type are the same, then these two
     cases are equivalent.
     cases are equivalent.
 
 
   FULL, TOP, and USING_ENC can each be zero, in which case we don't
   FULL, TOP, and USING_ENC can each be zero, in which case we don't
   provide the corresponding piece of information.  */
   provide the corresponding piece of information.  */
extern struct type *value_rtti_type (struct value *value,
extern struct type *value_rtti_type (struct value *value,
                                     int *full, int *top, int *using_enc);
                                     int *full, int *top, int *using_enc);
 
 
/* Compute the offset of the baseclass which is
/* Compute the offset of the baseclass which is
   the INDEXth baseclass of class TYPE,
   the INDEXth baseclass of class TYPE,
   for value at VALADDR (in host) at ADDRESS (in target).
   for value at VALADDR (in host) at ADDRESS (in target).
   The result is the offset of the baseclass value relative
   The result is the offset of the baseclass value relative
   to (the address of)(ARG) + OFFSET.
   to (the address of)(ARG) + OFFSET.
 
 
   -1 is returned on error. */
   -1 is returned on error. */
 
 
extern int baseclass_offset (struct type *type, int index,
extern int baseclass_offset (struct type *type, int index,
                             const bfd_byte *valaddr, CORE_ADDR address);
                             const bfd_byte *valaddr, CORE_ADDR address);
 
 
/* Describe the target of a pointer to method.  CONTENTS is the byte
/* Describe the target of a pointer to method.  CONTENTS is the byte
   pattern representing the pointer to method.  TYPE is the pointer to
   pattern representing the pointer to method.  TYPE is the pointer to
   method type.  STREAM is the stream to print it to.  */
   method type.  STREAM is the stream to print it to.  */
void cplus_print_method_ptr (const gdb_byte *contents, struct type *type,
void cplus_print_method_ptr (const gdb_byte *contents, struct type *type,
                             struct ui_file *stream);
                             struct ui_file *stream);
 
 
/* Return the size of a pointer to member function of type TO_TYPE.  */
/* Return the size of a pointer to member function of type TO_TYPE.  */
int cplus_method_ptr_size (struct type *to_type);
int cplus_method_ptr_size (struct type *to_type);
 
 
/* Return the method which should be called by applying METHOD_PTR
/* Return the method which should be called by applying METHOD_PTR
   to *THIS_P, and adjust *THIS_P if necessary.  */
   to *THIS_P, and adjust *THIS_P if necessary.  */
struct value *cplus_method_ptr_to_value (struct value **this_p,
struct value *cplus_method_ptr_to_value (struct value **this_p,
                                         struct value *method_ptr);
                                         struct value *method_ptr);
 
 
/* Create the byte pattern in CONTENTS representing a pointer of
/* Create the byte pattern in CONTENTS representing a pointer of
   type TYPE to member function at ADDRESS (if IS_VIRTUAL is 0)
   type TYPE to member function at ADDRESS (if IS_VIRTUAL is 0)
   or with virtual table offset ADDRESS (if IS_VIRTUAL is 1).
   or with virtual table offset ADDRESS (if IS_VIRTUAL is 1).
   This is the opposite of cplus_method_ptr_to_value.  */
   This is the opposite of cplus_method_ptr_to_value.  */
void cplus_make_method_ptr (struct type *type, gdb_byte *CONTENTS,
void cplus_make_method_ptr (struct type *type, gdb_byte *CONTENTS,
                            CORE_ADDR address, int is_virtual);
                            CORE_ADDR address, int is_virtual);
 
 
/* Determine if we are currently in a C++ thunk.  If so, get the address
/* 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.  */
   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);
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
/* Return non-zero if an argument of type TYPE should be passed by reference
   instead of value.  */
   instead of value.  */
extern int cp_pass_by_reference (struct type *type);
extern int cp_pass_by_reference (struct type *type);
 
 
struct cp_abi_ops
struct cp_abi_ops
{
{
  const char *shortname;
  const char *shortname;
  const char *longname;
  const char *longname;
  const char *doc;
  const char *doc;
 
 
  /* ABI-specific implementations for the functions declared above.  */
  /* ABI-specific implementations for the functions declared above.  */
  enum ctor_kinds (*is_constructor_name) (const char *name);
  enum ctor_kinds (*is_constructor_name) (const char *name);
  enum dtor_kinds (*is_destructor_name) (const char *name);
  enum dtor_kinds (*is_destructor_name) (const char *name);
  int (*is_vtable_name) (const char *name);
  int (*is_vtable_name) (const char *name);
  int (*is_operator_name) (const char *name);
  int (*is_operator_name) (const char *name);
  struct value *(*virtual_fn_field) (struct value **arg1p, struct fn_field * f,
  struct value *(*virtual_fn_field) (struct value **arg1p, struct fn_field * f,
                                     int j, struct type * type, int offset);
                                     int j, struct type * type, int offset);
  struct type *(*rtti_type) (struct value *v, int *full, int *top,
  struct type *(*rtti_type) (struct value *v, int *full, int *top,
                             int *using_enc);
                             int *using_enc);
  int (*baseclass_offset) (struct type *type, int index,
  int (*baseclass_offset) (struct type *type, int index,
                           const bfd_byte *valaddr, CORE_ADDR address);
                           const bfd_byte *valaddr, CORE_ADDR address);
  void (*print_method_ptr) (const gdb_byte *contents, struct type *type,
  void (*print_method_ptr) (const gdb_byte *contents, struct type *type,
                            struct ui_file *stream);
                            struct ui_file *stream);
  int (*method_ptr_size) (struct type *);
  int (*method_ptr_size) (struct type *);
  void (*make_method_ptr) (struct type *, gdb_byte *, CORE_ADDR, int);
  void (*make_method_ptr) (struct type *, gdb_byte *, CORE_ADDR, int);
  struct value * (*method_ptr_to_value) (struct value **, struct value *);
  struct value * (*method_ptr_to_value) (struct value **, struct value *);
  CORE_ADDR (*skip_trampoline) (struct frame_info *, CORE_ADDR);
  CORE_ADDR (*skip_trampoline) (struct frame_info *, CORE_ADDR);
  int (*pass_by_reference) (struct type *type);
  int (*pass_by_reference) (struct type *type);
};
};
 
 
 
 
extern int register_cp_abi (struct cp_abi_ops *abi);
extern int register_cp_abi (struct cp_abi_ops *abi);
extern void set_cp_abi_as_auto_default (const char *short_name);
extern void set_cp_abi_as_auto_default (const char *short_name);
 
 
#endif
#endif
 
 
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.