This is the mail archive of the gcc@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: lno-branch vs ptr-to-member


Andrew Pinski wrote:
Calling convert from the middle-end is asking for troubles.

interesting; we do it moreorless everwhere (dom, sra, ccp, ...).

I see this thread is coming to a conclusion, but I'll try to offer a little insight.


First, there are two kinds of pointers-to-members: pointers to data members and pointers to function members. The former are just offsets into an object; for example an "int S::*" is just the offset from the start of "S" to some "int" data member (i.e., field) in "S". Pointers to function members are more complex: they explain how to call a particular member function. So an "int (S::*)(double)" explains how to call a member function of "S" that takes a "double" and returns an "int" -- given a pointer to an "S". The implementation of this idea is a little structure: one part of the structure explains how to adjust the "this" pointer and the other is either a function pointer or a vtable index.

It makes no sense to try to convert pointers to function members to integers, but it is reasonable to do that with pointers to data members.

It is true that all uses of "convert" outside of the front end are suspect. Most of them happen to work, but "convert" is a language-dependent routine, and as such it tends to create language-specific structures. There should be another routine that can be used by the middle end to do conversions that are known to be OK like converting from an integer to a pointer and back, or converting from one integer type to another, or from one pointer to another.

--
Mark Mitchell
CodeSourcery, LLC
mark@codesourcery.com


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