[RFC] use symbol_ref flags for rs6000

Andrew Pinski pinskia@physics.uc.edu
Thu May 1 22:24:00 GMT 2003


The only problem with this on darwin, it is okay to call the static int 
so that will become a regression.

Thanks,
Andrew Pinski

Simple test case:
int main()
{
         static int thunk[5]={0x4e800020};
         ((int (*)(void))thunk) ();
}


On Thursday, May 1, 2003, at 18:17 US/Eastern, David Edelsohn wrote:

>>>>>> Jakub Jelinek writes:
>
> Jakub> This line was added by me because of ppc64.
> Jakub> If ppc64 backend is fixed, it should be deleted again IMHO.
>
> 	Yes, and I appreciate your providing the work-around.
>
> 	If you and Richard agree this is an error that should be fixed in
> the backend, the solution is appended.  This tests 
> SYMBOL_REF_FUNCTION_P
> for patterns which will produce direct calls and explicitly forces an
> indirect call when the flag is not set.  Is that what you two 
> recommend?
>
> David
>
> Index: rs6000.c
> ===================================================================
> RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.c,v
> retrieving revision 1.463
> diff -c -p -r1.463 rs6000.c
> *** rs6000.c	1 May 2003 17:05:17 -0000	1.463
> --- rs6000.c	1 May 2003 22:09:11 -0000
> *************** symbol_ref_operand (op, mode)
> *** 2073,2079 ****
>     if (mode != VOIDmode && GET_MODE (op) != mode)
>       return 0;
>
> !   return (GET_CODE (op) == SYMBOL_REF);
>   }
>
>   /* Return 1 if the operand, used inside a MEM, is a valid first 
> argument
> --- 2073,2079 ----
>     if (mode != VOIDmode && GET_MODE (op) != mode)
>       return 0;
>
> !   return (GET_CODE (op) == SYMBOL_REF && SYMBOL_REF_FUNCTION_P (op));
>   }
>
>   /* Return 1 if the operand, used inside a MEM, is a valid first 
> argument
> *************** current_file_function_operand (op, mode)
> *** 2102,2118 ****
>        rtx op;
>        enum machine_mode mode ATTRIBUTE_UNUSED;
>   {
> !   if (GET_CODE (op) == SYMBOL_REF
> !       && (SYMBOL_REF_LOCAL_P (op)
> ! 	  || (op == XEXP (DECL_RTL (current_function_decl), 0))))
> !     {
> ! #ifdef ENABLE_CHECKING
> !       if (!SYMBOL_REF_FUNCTION_P (op))
> ! 	abort ();
> ! #endif
> !       return 1;
> !     }
> !   return 0;
>   }
>
>   /* Return 1 if this operand is a valid input for a move insn.  */
> --- 2102,2111 ----
>        rtx op;
>        enum machine_mode mode ATTRIBUTE_UNUSED;
>   {
> !   return (GET_CODE (op) == SYMBOL_REF
> ! 	  && SYMBOL_REF_FUNCTION_P (op)
> ! 	  && (SYMBOL_REF_LOCAL_P (op)
> ! 	      || (op == XEXP (DECL_RTL (current_function_decl), 0))));
>   }
>
>   /* Return 1 if this operand is a valid input for a move insn.  */
> Index: rs6000.md
> ===================================================================
> RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.md,v
> retrieving revision 1.250
> diff -c -p -r1.250 rs6000.md
> *** rs6000.md	1 May 2003 17:05:18 -0000	1.250
> --- rs6000.md	1 May 2003 22:09:11 -0000
> ***************
> *** 10089,10094 ****
> --- 10180,10186 ----
>     operands[0] = XEXP (operands[0], 0);
>
>     if (GET_CODE (operands[0]) != SYMBOL_REF
> +       || !SYMBOL_REF_FUNCTION_P (operands[0])
>         || (INTVAL (operands[2]) & CALL_LONG) != 0)
>       {
>         if (INTVAL (operands[2]) & CALL_LONG)
> ***************
> *** 10136,10141 ****
> --- 10228,10234 ----
>     operands[1] = XEXP (operands[1], 0);
>
>     if (GET_CODE (operands[1]) != SYMBOL_REF
> +       || !SYMBOL_REF_FUNCTION_P (operands[1])
>         || (INTVAL (operands[3]) & CALL_LONG) != 0)
>       {
>         if (INTVAL (operands[3]) & CALL_LONG)
>
>



More information about the Gcc-patches mailing list