rjmccall added a comment.

In https://reviews.llvm.org/D38473#888597, @rsmith wrote:

> In https://reviews.llvm.org/D38473#888159, @mppf wrote:
>
> > > You should also indicate *which* record layout (complete object type or 
> > > base subobject type) the field number is for. I don't think there's any 
> > > guarantee that the same indexes work in both.
> >
> > I added a comment about this - indicating that inherited fields are not 
> > supported by this function. My use case is just for C structs at the moment 
> > and I'm not actually sure what we'd need to do for the interface to support 
> > building GEPs for inherited fields. I'm sure it would complicate the API. I 
> > think we should leave that complexity to another function or a future 
> > function (when somebody actually needs it).
>
>
> I don't think your added comment is related to my request. There are two 
> (potentially) different LLVM types for a C++ class type in general, one for 
> the case where the object is a base class subobject (excluding vbases, and 
> where the tail padding could be reused) and one for where it is a complete 
> object (including vbases, and where the tail padding is known to be owned by 
> the object). I don't know whether we guarantee that field indexes for one 
> layout can be used for the other layout; in particular, I'm concerned that 
> one could be a packed struct when the other isn't, and thus the field indexes 
> could differ. (I think we generally use the complete object type within IR 
> generation, even though that may seem like an odd choice.)
>
> But perhaps we do guarantee the common prefixes are the same (@rjmccall: do 
> we?), or we only ever expose one of the two layouts to code outside Clang, 
> and in either case this wouldn't matter.


I think we should probably just document that they're only valid in the 
complete-object type, which also, yes, happens to be the only type we expose 
outside of Clang because it's the type returned by convertTypeForMemory.

> 
> 
>>> (Eg, if we move to an IR representation using something non-GEPable to 
>>> represent a source-level class type, we would remove this function as it 
>>> would be meaningless.)
>> 
>> In that event, I'd just want to have a way to build the appropriate field 
>> access. (e.g. a function to build an appropriate GEP; or a function that 
>> adds appropriate instructions to an IRBuilder and returns a Value* that 
>> points to the field, say). I'm open to trying to go directly to such an 
>> interface but I'd need significant help in designing/implementing it. (The 
>> interface I've proposed here meets my needs and I don't think I know enough 
>> about clang to design/implement a better one without help).
> 
> Given the generality of kinds of lvalues and rvalues that we support, this 
> would mean exposing a significant chunk of the CodeGen interface, I think -- 
> probably much more than we would be comfortable exposing.

I thought about making this sort of comment and decided that if we added more 
non-GEPable kinds of fields, we could always just put them after bit-fields in 
the exceptions list.


https://reviews.llvm.org/D38473



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to