This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: New type-based pool allocator code miscompiled due to aliasing issue?


On Tue, Jun 16, 2015 at 3:38 PM, Martin LiÅka <mliska@suse.cz> wrote:
> 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;
> +  }

That should be there with including <new>

> 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;
>   }

Yes, though I wonder whether cselib_val should really have undefined
contents after
allocating it?  (or does the pool allocator zero the memory?)

Richard.

> }
>
> Thanks,
> Martin
>
>
>
>>
>>> Thanks,
>>> Martin
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]