[PATCH 2/8] infcall, c++: allow more info to be computed for pass-by-reference values

Aktemur, Tankut Baris tankut.baris.aktemur@intel.com
Fri May 31 13:53:00 GMT 2019


> > In C++, call-by-value arguments that cannot be trivially copied are
> > implicitly passed by reference.  When making an infcall, GDB needs to
> > find out if an argument is pass-by-reference or not, so that the correct
> > semantics can be followed.  This patch enriches the information computed
> > by the language ops for pass-by-reference arguments.  Instead of a plain
> > binary result, the computed information now includes whether the
> > argument is
> >   - copy constructible
> >   - destructible
> >   - trivially copyable
> >   - trivially copy constructible
> >   - trivially destructible
> > and also
> >   - the full name of the copy constructor
> >   - the full name of the destructor
> > in preparation for GDB's infcall mechanism to call the copy ctor and
> > the destructor of a pass-by-ref argument appropriately.  This
> > information is stored in a struct named 'language_pass_by_ref_info'.
> >
> 
> I have a little feedback given below, but otherwise this looks fine.

Thank you for your valuable feedback.

> > +
> > +  /* Name of the destructor function.  Expected to be fully-qualified.  */
> > +
> > +  const char *dtor_name;
> > +
> > +  /* Is the type of the argument in question copy-constructible?  */
> > +
> > +  bool copy_constructible;
> 
> This comment doesn't seem very helpful.  Could you expand on what true
> or false value would mean here?  I have the same question about all of
> the fields below.
> 
> Also I think it might be worth inlining the default value here rather
> than in 'default_pass_by_reference', so:
> 
>   bool copy_constructible = true;
> 
> then you can extend the comment to explain why that default was
> selected.  I think doing this for all the fields in this struct would
> be a good change.
>
> > +
> > +  /* Is the type of the argument in question destructible?  */
> > +
> > +  bool destructible;
> > +
> > +  /* Is the argument in question trivially copyable?
> > +     That is, is it pass-by-value?  */
> > +
> > +  bool trivially_copyable;
> > +
> > +  /* Is the argument in question trivially copy constructible?  */
> > +
> > +  bool trivially_copy_constructible;
> > +
> > +  /* Is the argument in question trivially destructible?  */
> > +
> > +  bool trivially_destructible;
> > +};
> > +

Does a definition like the one below look OK?


+/* In a language (particularly C++) a function argument of an aggregate
+   type (i.e.  class/struct/union) may be implicitly passed by reference
+   even though it is declared a call-by-value argument in the source.
+   The struct below puts together necessary information for GDB to be
+   able to detect and carry out pass-by-reference semantics for a
+   particular type.  This type is referred as T in the inlined comments
+   below.
+
+   The default values of the fields are chosen to give correct semantics
+   for primitive types and for simple aggregate types, such as
+
+   class T {
+     int x;
+   };  */
+
+struct language_pass_by_ref_info
+{
+  /* Name of the copy ctor function of T.  Expected to be
+     fully-qualified.  */
+  const char *cctor_name = nullptr;
+
+  /* Name of the destructor function of T.  Expected to be
+     fully-qualified.  */
+  const char *dtor_name = nullptr;
+
+  /* True if an argument of type T can be passed to a function by value
+     (i.e.  not through an implicit reference).  False, otherwise.  */
+  bool trivially_copyable = true;
+
+  /* True if a copy of a value of type T can be initialized by
+     memcpy'ing the value bit-by-bit.  False, otherwise.
+     E.g.  If T has a user-defined copy ctor, this should be false.  */
+  bool trivially_copy_constructible = true;
+
+  /* True if a value of type T can be destructed simply by reclaiming
+     the memory area occupied by the value.  False, otherwise.
+     E.g.  If T has a user-defined destructor, this should be false.  */
+  bool trivially_destructible = true;
+
+  /* True if it is allowed to create a copy of a value of type T.
+     False, otherwise.
+     E.g.  If T has a deleted copy ctor, this should be false.  */
+  bool copy_constructible = true;
+
+  /* True if a value of type T can be destructed.  False, otherwise.
+     E.g.  If T has a deleted destructor, this should be false.  */
+  bool destructible = true;
+};
+

Regards,

-Baris

Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Gary Kershaw
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928



More information about the Gdb-patches mailing list