I don't think this patch changed in any significant way since V1. -- One of the painful aspects of all this code is the amount of target dependent bits that have to be written and tested.
I didn't want to be scanning assembly code or RTL for prologues. Each target would have to have its own scanner which was too painful to contemplate. So instead I settled on having a routine that the target dependent prologue expanders could call to dump information about what they were doing. This greatly simplifies the testing side of things by having a standard way to dump decisions. When combined with the dejagnu routines from patch #1 which describe key attributes of the target's prologue generation I can write tests in a fairly generic way. This will be used by every target dependent prologue expander in this series. OK for the trunk?
commit ff99b9cb21a195fb2b2c0e4d580db2b1e806ec97 Author: Kyrylo Tkachov <kyrylo.tkac...@arm.com> Date: Thu Apr 14 10:52:45 2016 +0100 [AArch64] From Andrew Pinski: Work around PR target/64971 diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index da85a7f..a9e811e 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -855,6 +855,13 @@ (define_expand "sibcall" || aarch64_is_noplt_call_p (callee))) XEXP (operands[0], 0) = force_reg (Pmode, callee); + /* FIXME: This is a band-aid. Need to analyze why expand_expr_addr_expr + is generating an SImode symbol reference. See PR 64971. */ + if (TARGET_ILP32 + && GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF + && GET_MODE (XEXP (operands[0], 0)) == SImode) + XEXP (operands[0], 0) = convert_memory_address (Pmode, + XEXP (operands[0], 0)); if (operands[2] == NULL_RTX) operands[2] = const0_rtx; @@ -886,6 +893,14 @@ (define_expand "sibcall_value" || aarch64_is_noplt_call_p (callee))) XEXP (operands[1], 0) = force_reg (Pmode, callee); + /* FIXME: This is a band-aid. Need to analyze why expand_expr_addr_expr + is generating an SImode symbol reference. See PR 64971. */ + if (TARGET_ILP32 + && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF + && GET_MODE (XEXP (operands[1], 0)) == SImode) + XEXP (operands[1], 0) = convert_memory_address (Pmode, + XEXP (operands[1], 0)); + if (operands[3] == NULL_RTX) operands[3] = const0_rtx; diff --git a/gcc/testsuite/gcc.c-torture/compile/pr37433-1.c b/gcc/testsuite/gcc.c-torture/compile/pr37433-1.c new file mode 100644 index 0000000..322c167 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr37433-1.c @@ -0,0 +1,11 @@ +void regex_subst(void) +{ + const void *subst = ""; + (*(void (*)(int))subst) (0); +} + +void foobar (void) +{ + int x; + (*(void (*)(void))&x) (); +}