This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Improved folding of virtual calls (gimple and C++ review requested)


On 04/20/2010 07:29 AM, Martin Jambor wrote:
When examining the BINFO structures and looking for the chain of
virtual methods for the given actual and referenced type, I discovered
that I have to use one out of two methods depending whether the actual
type is derived through single or multiple inheritance.  Basically, if
I want to find latter I need to dive deep into BINFOs representing the
ancestors with non-zero offsets within the type and those contain the
list I am interested in.  On the other hand, if the ancestor lies at
the offset zero of the actual type, the BINFOs representing the
ancestors don't have the list (actually they have one but with wrong
values) but fortunately the indices of virtual functions are the same
in the actual type (only that it can have more of them) so we can use
those.  So in the end I dive deep into the binfos only when hitting
multiple inheritance and keep the top-most binfo otherwise.

I don't really see this in the patch. If the BINFOs have the wrong offsets, that sounds like a front end bug...


+ if (TREE_TYPE (base_binfo) != TREE_TYPE (field))

The first TREE_TYPE should be BINFO_TYPE.


Is this supposed to be testing whether CLASSTYPE_AS_BASE for the base class is different from the class itself? That's the effect I would expect, and that's different from whether multiple inheritance is involved.

Jason


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]