> On Nov 13, 2017, at 4:30 PM, Joe Groff <jgr...@apple.com> wrote:
> 
> On Nov 13, 2017, at 11:40 AM, John McCall <rjmcc...@apple.com 
> <mailto:rjmcc...@apple.com>> wrote:
>> 
>> 
>>> On Nov 7, 2017, at 8:58 PM, Joe Groff via swift-dev <swift-dev@swift.org 
>>> <mailto:swift-dev@swift.org>> wrote:
>>> 
>>> I’m trying to plan out changes to our type metadata record formats for ABI 
>>> stability. I’ll start by looking at the current situation and then make 
>>> suggestions about things we ought to change. We want to settle on a design 
>>> that leaves room for future expansion and runtime changes, and still allows 
>>> efficient access to the most frequently-accessed parts of metadata. I’ll be 
>>> looking exclusively at metadata records themselves for this message, 
>>> leaving other data structures for separate scrutiny. I'd appreciate all 
>>> your feedback.
>>> 
>> 
>> Overall, I think this is a nice description of the problem.  A few comments:
>> 
>>   - One notable omission here is that you don't discuss nominal type 
>> descriptors at all.
> 
> Yeah, sorry if I didn't make that clear that that was intentional. I'm 
> working on a plan for renovating nominal type descriptors in a separate 
> document.

Okay, great.  I guess that's what you meant by "other data structures" above, 
sorry.

>>   - For the structural types (tuples, functions, existentials, metatypes), I 
>> don't think there's any particular reason to abstract access to the 
>> component types.  If there are future changes to these types that require 
>> additional data to be stored, I don't see any reason that that couldn't be 
>> stored compatibly with the current layout.  We should make sure that all of 
>> these metadata have some space to encode flags and that reads of those flags 
>> are appropriately delimited, as opposed to e.g. assuming that an entire word 
>> is used to store a single enum.
> 
> Maybe not. I can think of a few possible evolution avenues to keep room for:
> 
> - Some of these could conceivably become nominal types at some point. 
> Tuple<T...> and Metatype<T> structs seem conceivable at some point in the 
> future, and it might be nice if we can move the structural metadata formats 
> over to nominal metadata at some point in the future. It may be sufficient to 
> ensure that tuple metadata lays out its element type and field offset vectors 
> in a way that's compatible with how a generic struct would.

Much like Optional has a special kind, I don't think it's unreasonable to say 
that special structural types could always have a special layout.

> - The shape of existential type metadata could change quite a bit to support 
> generalized existentials. (This isn't too much of an ABI problem yet, maybe, 
> since there isn't really much type information to project from existential 
> metadata in its current form.)

We should at least leave space for this, I agree.  But again, if there are 
cases we can't express with the current format, we could certainly just create 
a new kind + format for them.  We don't have compatibility requirements for 
types that aren't expressible in the current type system.

> - Functions have tended to grow lots of new top-level and per-argument bits. 
> We'll want to ensure there's room for those (and it looks like Pavel's latest 
> patch does).

Yeah, Pavel and I have been working on that.

>>   - I think having a single "value type" metadata kind for enums / structs 
>> makes sense, assuming we can discriminate them via the NTD.
> 
> Agreed.
> 
>>   - I feel like we're not boxing ourselves in too much to assume a layout of 
>> the generic requirements.  Having a base offset already imposes a pretty 
>> steep compatibility requirement — e.g. even if we significantly generalized 
>> a type's generic signature, we would still need to store old requirements 
>> (when actually obeyed) in the appropriate places for the old signature, or 
>> else the old pattern just doesn't work at all.  As long as we can extend 
>> that with more information later, we don't really suffer from making layout 
>> assumptions today.
> 
> Sounds good. If, for some reason we needed to move the base offset of the 
> generic argument structure to make room for new fields, we could conceivably 
> ABI-version-gate the presence of those fields. Resilient types compiled with 
> an older ABI would just have to either forgo those fields or fall into slower 
> access paths to extract them.

Agreed.

John.

_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to