[PATCH] Allow new/delete operator deletion only for replaceable.

Martin Liška mliska@suse.cz
Tue Apr 14 07:09:43 GMT 2020


On 4/10/20 11:17 AM, Jakub Jelinek wrote:
> On Fri, Apr 10, 2020 at 10:29:29AM +0200, Martin Liška wrote:
>> +/* Valid pairs of new and delete operators for DCE.  */
>> +static hash_set<nofree_string_hash> *valid_pairs = NULL;
>> +
>> +/* Return that NEW_CALL and DELETE_CALL are a valid pair of new
>> +   and delete  operators.  */
>> +
>> +static bool
>> +valid_new_delete_pair_p (gimple *new_call, gimple *delete_call)
>> +{
>> +  const char *new_name
>> +    = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (gimple_call_fndecl (new_call)));
>> +  const char *delete_name
>> +    = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (gimple_call_fndecl (delete_call)));
>> +
>> +  if (new_name[0] == '_' and new_name[1] == '_')
>> +    ++new_name;
>> +  if (delete_name[0] == '_' and delete_name[1] == '_')
>> +    ++delete_name;
>> +
>> +  char *needle = concat (new_name, ":", delete_name, NULL);
>> +
>> +  if (valid_pairs == NULL)
>> +    {
>> +      valid_pairs = new hash_set<nofree_string_hash> ();
>> +      /* Invalid pairs:
>> +	 non-[] and []
>> +	 aligned and non-aligned
>> +      */
>> +
>> +      const char *pairs[] = {
>> +	  /* non-[] operators.  */
>> +	  "_Znwm:_ZdlPv" ,
>> +	  "_Znwm:_ZdlPvm" ,
> 
> Formatting, I think the /* and "_Z should be two columns from const char,
> and no space before ,
> Not sure I like using the : and using a hash table looks like an overkill to
> me, don't we have only 8 options, and most of them with different identifier
> lengths?  The concat itself will take a while...
> And, what's worse, the m in there is really different on different targets.
> It can be j, m or y depending on what fundamental type size_t is.
> 
> So why not (completely untested):

Hi.

I've updated a bit the Jakub's patch.

Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

Ready to be installed?
Thanks,
Martin

> 
> static bool
> valid_new_delete_pair_p (gimple *new_call, gimple *delete_call)
> {
>    tree new_asm = DECL_ASSEMBLER_NAME (gimple_call_fndecl (new_call));
>    tree delete_asm = DECL_ASSEMBLER_NAME (gimple_call_fndecl (delete_call));
>    const char *new_name = IDENTIFIER_POINTER (new_asm);
>    const char *delete_name = IDENTIFIER_POINTER (delete_asm);
>    unsigned int new_len = IDENTIFIER_LENGTH (mew_asm);
>    unsigned int delete_len = IDENTIFIER_LENGTH (delete_asm);
>    if (new_name < 5 || delete_len < 6)
>      return false;
>    if (new_name[0] == '_')
>      ++new_name, --new_len;
>    if (new_name[0] == '_')
>      ++new_name, --new_len;
>    if (delete_name[0] == '_')
>      ++delete_name, --delete_len;
>    if (delete_name[0] == '_')
>      ++delete_name, --delete_len;
>    if (new_len < 4 || delete_len < 5)
>      return false;
>    /* *_len is now just the length after initial underscores.  */
>    if (new_name[0] != 'Z' || new_name[1] != 'n')
>      return false;
>    if (delete_name[0] != 'Z' || delete_name[1] != 'd')
>      return false;
>    /* _Znw must match _Zdl, _Zna must match _Zda.  */
>    if ((new_name[2] != 'w' || delete_name[2] != 'l')
>        && (new_name[2] != 'a' || delete_name[2] != 'a'))
>      return false;
>    if (new_name[3] != 'j' && new_name[3] != 'm' && new_name[3] != 'y')
>      return false;
>    if (delete_name[3] != 'P' || delete_name[4] != 'v')
>      return false;
>    if (new_len == 4
>        || (new_len == 18 && !memcmp (new_name + 4, "RKSt9nothrow_t", 14)))
>      {
>        /* _ZnXY or _ZnXYRKSt9nothrow_t matches
> 	 _ZdXPv, _ZdXPvY and _ZdXPvRKSt9nothrow_t.  */
>        if (delete_len == 5)
> 	return true;
>        if (delete_len == 6 && delete_name[5] == new_name[3])
> 	return true;
>        if (delete_len == 19 && !memcmp (delete_name + 5, "RKSt9nothrow_t", 14))
> 	return true;
>      }
>    else if ((new_len == 19 && !memcmp (new_name + 4, "St11align_val_t", 15))
> 	   || (new_len == 33
> 	       && !memcmp (new_name + 4, "St11align_val_tRKSt9nothrow_t", 29)))
>      {
>        /* _ZnXYSt11align_val_t or _ZnXYSt11align_val_tRKSt9nothrow_t matches
> 	 _ZdXPvSt11align_val_t or _ZdXPvYSt11align_val_t or  or
> 	 _ZdXPvSt11align_val_tRKSt9nothrow_t.  */
>        if (delete_len == 20 && !memcmp (delete_name + 5, "St11align_val_t", 15))
> 	return true;
>        if (delete_len == 21
> 	  && delete_name[5] == new_name[3]
> 	  && !memcmp (delete_name + 6, "St11align_val_t", 15))
> 	return true;
>        if (delete_len == 34
> 	  && !memcmp (delete_name + 5, "St11align_val_tRKSt9nothrow_t", 29))
> 	return true;
>      }
>    return false;
> }
> 
> 	Jakub
> 

-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-List-valid-pairs-for-new-and-delete-operators.patch
Type: text/x-patch
Size: 7493 bytes
Desc: not available
URL: <https://gcc.gnu.org/pipermail/gcc-patches/attachments/20200414/ac1e65d3/attachment.bin>


More information about the Gcc-patches mailing list