> On Jun 15, 2017, at 8:30 PM, Greg Parker via swift-dev <swift-dev@swift.org> 
> wrote:
> 
>> 
>> On Jun 15, 2017, at 4:39 PM, Andrew Trick via swift-dev 
>> <swift-dev@swift.org> wrote:
>> 
>>> On Jun 15, 2017, at 4:26 PM, Andrew Trick <atr...@apple.com> wrote:
>>> 
>>>> On Jun 14, 2017, at 12:03 PM, Jordan Rose via swift-dev 
>>>> <swift-dev@swift.org> wrote:
>>>> 
>>>>> ad 3) IRGen support
>>>>> 
>>>>> Generating statically initialized globals is already done today for 
>>>>> structs and tuples.
>>>>> What’s needed is the handling of objects.
>>>>> In addition to creating the global itself, we also need a runtime call to 
>>>>> initialize the object header. In other words: the object is statically 
>>>>> initialized, except the header.
>>>>> 
>>>>> HeapObject *swift::swift_initImmortalObject(HeapMetadata const *metadata, 
>>>>> HeapObject *object)
>>>>> 
>>>>> There are 2 reasons for that: first, the object header format is not part 
>>>>> of the ABI. And second, in case of a bound generic type (e.g. array 
>>>>> buffers) the metadata is not statically available.
>>>>> 
>>>>> One way to call this runtime function is dynamically at the global_object 
>>>>> instruction whenever the metadata pointer is still null (via swift_once).
>>>>> Another possibility would be to call it in a global constructor.
>>>>> 
>>>>> If you have any feedback, please let me know
>>>> 
>>>> Please do not use a global constructor.
>>> 
>>> What’s the objection to a global constructor about? We’re worried about 
>>> dyld performance in this case?
>>> 
>>>> :-)
>>> 
>>> :-/
>>> 
>>>> Globals are already set up to handle one-time initialization; the fact 
>>>> that that initialization is now cheaper is still a good thing.
>>> 
>>> These array literals aren’t Swift globals to begin with so I’m not sure 
>>> what that means. Introducing a swift-once accessor everywhere they’re used 
>>> means we can’t do the global optimizations that we normally do for globals 
>>> with constant initializers. That might be the right choice but it would be 
>>> good to understand why we’re making it.
>> 
>> Erik answered this. I forgot we need to initialize metadata. I agree we 
>> don’t want to do that in a global constructor. The fast path won’t go 
>> through swift-once, so the accessor will be just a bit of extra code size.
> 
> swift_once is not the most efficient solution here - we don't need separate 
> once token storage in this case - but it's fine for now. If necessary we can 
> get rid of the once token requirement in a backwards-compatible way.
> 
> (You can do without a separate token if (1) your storage is two pointers or 
> less in size, (2) your storage is sufficiently well-aligned that it does not 
> cross cache line boundaries, (3) your uninitialized value is zero, and (4) 
> your initialized value is not zero. If all of these are true then you can 
> perform the same trick that swift-once and dispatch-once use on the once 
> token, but apply it directly to the data instead. And if your data is a 
> single pointer you can do it faster than dispatch-once on weakly-ordered 
> platforms that are not Alpha.)

Does the transition have to be strictly zero -> nonzero? I thought it just had 
to be "original value at the time page was mapped into process" -> "something 
else". For metadata initialization on 64-bit Apple, we could perhaps go from 
relative offset of metadata accessor function (which should always be <2GB in 
Mach-O) to absolute metadata address (which should always be >4GB on 64-bit 
Darwin).

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

Reply via email to