Richard Guenther wrote:
> Georg-Johann Lay wrote:
>> Georg-Johann Lay wrote:
>>> Richard Guenther wrote:
>>>> Georg-Johann Lay wrote:
>>>>> [...]
>>>>>
>>>>> http://gcc.gnu.org/PR51527
>>>>>
>>>>> It works with 4.8 trunk but crashes with 4.7.
>>>>> Did not yet track what changes made it work with 4.8, though.
>>>>> Unfortunately, noone remembers :-(
>>>>>
>>>>> http://gcc.gnu.org/ml/gcc/2012-03/msg00440.html
>>>> I have done changes in this area, trying to remove the type_for_size 
>>>> langhook.
>>>>
>>>> Richard.
>>> One apparent change is tree.c:signed_or_unsigned_type_for
>>>
>>> that changed [...] at 2012-03-12
>>>
>>> http://gcc.gnu.org/viewcvs?view=revision&revision=185226
>>>
>>> Is this appropriate to backport?
> 
> No, it's not.
> 
>>> Or is the preferred solution to override lang_hooks.types.type_for_size in 
>>> the
>>> backend, if applicable?
> 
> Neither.  It is a "lang"-hook, not a target-hook after all.
> 
> I already told you what the right fix is - the callers of
> type_for_size have to cater
> for the returned type to be of different precision.  Btw, I already see it 
> does
> 
>                 /* But now perhaps TYPEX is as wide as INPREC.
>                    In that case, do nothing special here.
>                    (Otherwise would recurse infinitely in convert.  */
>                 if (TYPE_PRECISION (typex) != inprec)
> 
> Richard

Would you help me with the code? It's almost impossible to understand the
convert stuff for a noob. I tried TARGET_CONVERT_TO_TYPE

static tree
avr_convert_to_type (tree type, tree expr)
{
  tree xtype = TREE_TYPE (expr);

  /* convert enters infinite recursion for __int24 -> unsigned long
     convertsions.  */

  if (/* From __int24 ... */
      TREE_CODE (xtype) == INTEGER_TYPE
      && TYPE_PRECISION (xtype) == 24
      && !TYPE_UNSIGNED (xtype)
      /* ... to unsigned long.  */
      && TREE_CODE (type) == INTEGER_TYPE
      && TYPE_PRECISION (type) > 24
      && TYPE_UNSIGNED (type))
    {
      /* Perform an intermediate conversion:
         __int24 -> long -> unsigned long  */

      /* Signed variant of type */
      tree stype = lang_hooks.types.type_for_mode (TYPE_MODE (type), 0);

      expr = convert (stype, expr);
      //      expr = build1 (CONVERT_EXPR, stype, expr);
      expr = build1 (NOP_EXPR, type, expr);

      return expr;
    }

  return NULL_TREE;
}

#undef  TARGET_CONVERT_TO_TYPE
#define TARGET_CONVERT_TO_TYPE avr_convert_to_type


but with no avail. The explicit, intermediate conversion from __int24 to long
does not prevent the infinite recursion.

Johann

Reply via email to