[PATCH] libstdc++/77686 use may_alias for std::function storage

Jonathan Wakely jwakely@redhat.com
Wed Sep 28 11:17:00 GMT 2016


On 28/09/16 13:14 +0200, Richard Biener wrote:
>On Wed, Sep 28, 2016 at 12:57 PM, Jonathan Wakely <jwakely@redhat.com> wrote:
>> std::function::swap does swap(_M_functor, x._M_functor) which
>> exchanges the underlying bytes of the two _Any_data PODs using that
>> type's implicit assignment operator. However, unlike using placement
>> new to construct an object in the storage, simply memcpying the bytes
>> doesn't change the effective type of the storage, so alias analysis
>> decides it can't point to whatever we've tried to store in there.
>
>To clarify -- the implicit assingment operator for PODs (including unions)
>simply expands to an aggregate assignment which is subject to TBAA
>rules and thus in this case instantiates an effective type of _Any_data.
>Using memcpy would have worked as memcpy _does_ transfer
>the effective type of the storage.  It wasn't points-to deciding things
>here but TBAA given automatic storage X with effective type T
>read via an lvalue of type _Any_data.
>
>> This attribute tells the middle-end to assume anything those bytes
>> could contain any type of object, which is exactly what we want.
>
>It tells the middle-end that accessing storage via a _pointer_ to such
>marked type may access storage with a dynamic type that is not
>compatible with the type.
>
>Details ;)

But important ones, thanks.



More information about the Libstdc++ mailing list