[PATCH 2/2] msvcp140_1: Implement the DLL.
Piotr Caban
piotr at codeweavers.com
Mon Apr 5 13:04:27 CDT 2021
On 4/5/21 6:36 PM, Arkadiusz Hiler wrote:
> On Fri, Apr 02, 2021 at 06:18:28PM +0200, Piotr Caban wrote:
>>> +DEFINE_RTTI_DATA0(base_memory_resource, 0, ".?AVmemory_resource at pmr@std@@")
>>> +DEFINE_RTTI_DATA1(aligned_resource, 0, &base_memory_resource_rtti_base_descriptor, ".?AV_Aligned_new_delete_resource at pmr@std@@")
>>> +DEFINE_RTTI_DATA1(unaligned_resource, 0, &base_memory_resource_rtti_base_descriptor, ".?AV_Unligned_new_delete_resource at pmr@std@@")
>>> +DEFINE_RTTI_DATA1(null_resource, 0, &base_memory_resource_rtti_base_descriptor, ".?AV_null_resource at pmr@std@@")
>> This doesn't match with native RTTI data. If you need help with that part
>> please let me know
>
> Those names should be correct:
>
> .?AVmemory_resource at pmr@std@@
> .?AV_Aligned_new_delete_resource_impl at pmr@std@@
> .?AV_Unaligned_new_delete_resource_impl at pmr@std@@
> .?AV_Null_resource@?1??null_memory_resource@@YAPAVmemory_resource at pmr@std@@XZ@
>
> Is there anything else wrong with this RTTI?
The aligned_resource, unaligned_resource and null_resource are also
inheriting '.?AV_Identity_equal_resource at pmr@std@@' class.
The definitions should look like this:
DEFINE_RTTI_DATA0(base_memory_resource, 0, ".?AVmemory_resource at pmr@std@@")
DEFINE_RTTI_DATA1(_Identity_equal_resource, 0,
&base_memory_resource_rtti_base_descriptor,
".?AV_Identity_equal_resource at pmr@std@@")
DEFINE_RTTI_DATA2(aligned_resource, 0,
&_Identity_equal_resource_rtti_base_descriptor,
&base_memory_resource_rtti_base_descriptor,
".?AV_Aligned_new_delete_resource_impl at pmr@std@@")
Another problem is that DEFINE_RTTI_DATA defines lots of unused
structures in case of base_memory_resource and _Identity_equal_resource
classes (e.g. virtual function tables should not be needed at all). I
will experiment with it tomorrow.
>>> +DEFINE_THISCALL_WRAPPER(aligned_do_allocate, 12)
>>> +void* __thiscall aligned_do_allocate(memory_resource *this, size_t bytes, size_t alignment)
>>> +{
>>> + return MSVCRT_operator_new_aligned(bytes, alignment);
>>> +}
>> This doesn't match the tests that are calling free (instead of
>> _aligned_free) in some cases.
>>
>>> +DEFINE_THISCALL_WRAPPER(aligned_do_deallocate, 16)
>>> +void __thiscall aligned_do_deallocate(memory_resource *this, void *p, size_t bytes, size_t alignment)
>>> +{
>>> + MSVCRT_operator_delete_aligned(p, alignment);
>>> +}
>> Same here.
>
> Ah yes. I've tweaked the tests to not crash on Windows, but forgot to
> change our impl. The tests are passing because our malloc()/free() and
> its aligned siblings are compatible wrt how they store the address of
> the original allocation making them interchangeable, so this was left
> unnoticed.
It probably fails to free the memory if it's used interchangeable.
> Do you want me to send this and your version of patch 1 together or are
> you going to upstream it on your own?
Please send it together with your patches.
Thanks,
Piotr
More information about the wine-devel
mailing list