New type-based pool allocator code miscompiled due to aliasing issue?
Martin Liška
mliska@suse.cz
Tue Jun 16 13:45:00 GMT 2015
On 06/16/2015 03:17 PM, Richard Biener wrote:
> On Tue, Jun 16, 2015 at 11:26 AM, Martin Liška <mliska@suse.cz> wrote:
>> On 06/15/2015 07:31 PM, Marc Glisse wrote:
>>> On Mon, 15 Jun 2015, Martin Liška wrote:
>>>
>>>> Ah, I overlooked that it's not a placement new, but just static casting.
>>>> Anyway, if I added:
>>>>
>>>> cselib_val () {}
>>>>
>>>> to struct cselib_val and changed the cast to placement new:
>>>> char *ptr = (char *) header;
>>>> return new (ptr) T ();
>>>>
>>>> I got following compilation error:
>>>>
>>>> In file included from ../../gcc/alias.c:46:0:
>>>> ../../gcc/alloc-pool.h: In instantiation of âT* pool_allocator<T>::allocate() [with T = cselib_val]â:
>>>> ../../gcc/cselib.h:51:27: required from here
>>>> ../../gcc/alloc-pool.h:416:23: error: no matching function for call to âcselib_val::operator new(sizetype, char*&)â
>>>> return new (ptr) T ();
>>>> ^
>>>> In file included from ../../gcc/alias.c:47:0:
>>>> ../../gcc/cselib.h:49:16: note: candidate: static void* cselib_val::operator new(size_t)
>>>> inline void *operator new (size_t)
>>>> ^
>>>> ../../gcc/cselib.h:49:16: note: candidate expects 1 argument, 2 provided
>>>
>>> #include <new>
>>>
>>
>> Hi.
>>
>> <new> header file is not missing (explicit addition of the file does not help).
>> Feel free to play with following patch which should fix cselib.h compilation error.
>
> cselib_val overrides the new operator but fails to provide an overload
> for the placement new
> form. Fix that and it should work (of course it gets quite awkward
> with its 'new' calling
> pool.allocate and its placement new doing value-construction then...)
>
> Richard.
Do you mean Richard following changes:
alloc-pool.h (allocate):
...
+ /* Placement new contructor. */
+ inline void *operator new (size_t, elt_loc_list *&ptr)
+ {
+ return ptr;
+ }
and e.g. cselib.h:
struct cselib_val
{
/* Pool allocation new operator. */
inline void *operator new (size_t)
{
return pool.allocate ();
}
/* Placement new contructor. */
inline void *operator new (size_t, char *&ptr)
{
return ptr;
}
}
Thanks,
Martin
>
>> Thanks,
>> Martin
More information about the Gcc-patches
mailing list