On Thu, Mar 3, 2011 at 3:33 PM, Alan Modra <amo...@gmail.com> wrote:
> TREE_ADDRESSABLE comment says "In a FUNCTION_DECL, nonzero means its
> address is needed".  However, as I point out in
> http://gcc.gnu.org/ml/gcc-patches/2011-02/msg01525.html, this flag
> gets set when making normal calls.  It wasn't always like this.
> gcc-4.0 was careful to not set TREE_ADDRESSABLE on FUNCTION_DECLs in
> build_function_call, a feature lost in revision 100984.  I'd like to
> have that feature back for the above patch.  Bootstrapped and
> regression tested powerpc-linux.  OK for 4.6?

You'll get the addressable flag re-applied by the operand scanner.

Richard.

>        * c-typeck.c (build_function_call_vec): Avoid setting TREE_ADDRESSABLE
>        on normal function calls.
>
> Index: gcc/c-typeck.c
> ===================================================================
> --- gcc/c-typeck.c      (revision 170607)
> +++ gcc/c-typeck.c      (working copy)
> @@ -2715,7 +2715,20 @@ build_function_call_vec (location_t loc,
>       fundecl = function;
>     }
>   if (TREE_CODE (TREE_TYPE (function)) == FUNCTION_TYPE)
> -    function = function_to_pointer_conversion (loc, function);
> +    {
> +      if (fundecl)
> +       {
> +         /* Don't set TREE_ADDRESSABLE for the implicit function
> +            pointer conversion in a function call.  This allows
> +            TREE_ADDRESSABLE to be used to detect explicit function
> +            address operations.  */
> +         bool addressable = TREE_ADDRESSABLE (fundecl);
> +         function = function_to_pointer_conversion (loc, function);
> +         TREE_ADDRESSABLE (fundecl) = addressable;
> +       }
> +      else
> +       function = function_to_pointer_conversion (loc, function);
> +    }
>
>   /* For Objective-C, convert any calls via a cast to OBJC_TYPE_REF
>      expressions, like those used for ObjC messenger dispatches.  */
>
> --
> Alan Modra
> Australia Development Lab, IBM
>

Reply via email to